From a72f2ac43dddcc7d1699f759736bbe8e65c6b1e9 Mon Sep 17 00:00:00 2001 From: bbedward Date: Sun, 18 Oct 2026 21:48:00 -0400 Subject: [PATCH] launcher: name launch scopes app-dms-- so portals see the app id Fixes #3814 --- core/go.mod | 2 +- core/go.sum | 4 +-- dank-qml-common | 2 +- flake.lock | 6 ++-- flake.nix | 2 +- quickshell/Common/LaunchUnit.js | 38 ++++++++++++++++++++++++++ quickshell/Services/SessionService.qml | 5 ++-- 7 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 quickshell/Common/LaunchUnit.js diff --git a/core/go.mod b/core/go.mod index fc75e9486..a170addec 100644 --- a/core/go.mod +++ b/core/go.mod @@ -3,7 +3,7 @@ module github.com/AvengeMedia/DankMaterialShell/core go 1.27.1 require ( - github.com/AvengeMedia/dankgo v1.6.3-0.20261009141806-0a6056424f6d + github.com/AvengeMedia/dankgo v1.6.3-0.20261019011452-dbde56fb9274 github.com/AvengeMedia/dgop v1.6.3-0.20261015133851-bf93d6b75cf2 github.com/Wifx/gonetworkmanager/v2 v2.2.0 github.com/alecthomas/chroma/v2 v2.27.0 diff --git a/core/go.sum b/core/go.sum index 16c47c772..a77533e64 100644 --- a/core/go.sum +++ b/core/go.sum @@ -1,7 +1,7 @@ filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= -github.com/AvengeMedia/dankgo v1.6.3-0.20261009141806-0a6056424f6d h1:KKnkT4qIXhulbh665IuV/sPHYMYcF5pwxsYCHCSOl5E= -github.com/AvengeMedia/dankgo v1.6.3-0.20261009141806-0a6056424f6d/go.mod h1:oNWfG/2In/Znsrq03ZhNP1dCwHmHHm3nOVu6oXgkYIc= +github.com/AvengeMedia/dankgo v1.6.3-0.20261019011452-dbde56fb9274 h1:iPydJ2zMmGZZR7WzEVCRKS15gUlBjmYk++SFtDbmlak= +github.com/AvengeMedia/dankgo v1.6.3-0.20261019011452-dbde56fb9274/go.mod h1:oNWfG/2In/Znsrq03ZhNP1dCwHmHHm3nOVu6oXgkYIc= github.com/AvengeMedia/dgop v1.6.3-0.20261015133851-bf93d6b75cf2 h1:oOkpidPu7DJENdRTseCMw6pqyo12KNoGEC+Uim9pFHo= github.com/AvengeMedia/dgop v1.6.3-0.20261015133851-bf93d6b75cf2/go.mod h1:8TFIP72NLxCbogF2hHU6sXj3RoTbHQW8beeCrisHs/Y= github.com/Microsoft/go-winio v0.6.3 h1:M/52tsoyTfwaxajLnXZm7PqkbMGRH8iSWP+8fcg9MQ4= diff --git a/dank-qml-common b/dank-qml-common index b3dc38d17..51978d3ba 160000 --- a/dank-qml-common +++ b/dank-qml-common @@ -1 +1 @@ -Subproject commit b3dc38d175e2f4f1767da1b05f0b599a1e2015b9 +Subproject commit 51978d3ba6be3138ee39bb0c7f07e156a82805b6 diff --git a/flake.lock b/flake.lock index 8c1e66226..93cf21379 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "dank-qml-common": { "flake": false, "locked": { - "lastModified": 1792372175, - "narHash": "sha256-LfTuMjjNEKXX6NMLwJ6VV1TVdgKX52bBGMlkY/8LAzw=", + "lastModified": 1792374447, + "narHash": "sha256-FlzldJJuGPxyb6IHnzYLi8HQE1Yg222UnY0KcKnKGik=", "owner": "AvengeMedia", "repo": "dank-qml-common", - "rev": "b3dc38d175e2f4f1767da1b05f0b599a1e2015b9", + "rev": "51978d3ba6be3138ee39bb0c7f07e156a82805b6", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 328feeeaf..1b022177e 100644 --- a/flake.nix +++ b/flake.nix @@ -111,7 +111,7 @@ inherit version; pname = "dms-shell"; src = ./core; - vendorHash = "sha256-z4nGF6hSbETEh/J98xtf9WaHAZ2tBZcOPFYcSsXAtp8="; + vendorHash = "sha256-DitIB779oOFcW+gVuMpDOWkQgYgczZ2qVSQaDgzirKY="; subPackages = [ "cmd/dms" ]; diff --git a/quickshell/Common/LaunchUnit.js b/quickshell/Common/LaunchUnit.js new file mode 100644 index 000000000..e24fac48e --- /dev/null +++ b/quickshell/Common/LaunchUnit.js @@ -0,0 +1,38 @@ +.pragma library + +// systemd.unit(5) "String Escaping for Inclusion in Unit Names" +function escape(str) { + let out = ""; + for (const ch of str) { + if (/[A-Za-z0-9:_.]/.test(ch)) { + out += ch; + continue; + } + if (ch === "/") { + out += "-"; + continue; + } + const code = ch.codePointAt(0); + out += code < 128 ? "\\x" + code.toString(16).padStart(2, "0") : encodeURIComponent(ch).replace(/%/g, "\\x").toLowerCase(); + } + return out.startsWith(".") ? "\\x2e" + out.slice(1) : out; +} + +function hasUnitName(args) { + return args.some(arg => arg === "--unit" || arg === "-u" || arg.startsWith("--unit=")); +} + +// app---.scope per systemd.io/DESKTOP_ENVIRONMENTS, the shape xdg-desktop-portal maps back to a desktop id +function prefixArgs(prefix, desktopId, suffix) { + const args = prefix.split(" "); + if (args[0] !== "systemd-run" || !args.includes("--scope") || !desktopId || hasUnitName(args)) + return args; + const unit = `app-dms-${escape(desktopId)}-${suffix}`; + if (unit.length + ".scope".length > 255) + return args; + return [args[0], `--unit=${unit}`].concat(args.slice(1)); +} + +function randomSuffix() { + return Date.now().toString(36) + Math.floor(Math.random() * 1679616).toString(36); +} diff --git a/quickshell/Services/SessionService.qml b/quickshell/Services/SessionService.qml index 94cbedf57..dbaa0d031 100644 --- a/quickshell/Services/SessionService.qml +++ b/quickshell/Services/SessionService.qml @@ -8,6 +8,7 @@ import Quickshell.I3 import qs.Common import qs.Services import "../Common/SleepLock.js" as SleepLock +import "../Common/LaunchUnit.js" as LaunchUnit Singleton { id: root @@ -367,7 +368,7 @@ printf 'uwsm=%s\nelogind=%s\nloginctl=%s\nsystemctl=%s\nusermgr=%s\nhibernate=%s } if (prefix.length > 0) - cmd = prefix.split(" ").concat(cmd); + cmd = LaunchUnit.prefixArgs(prefix, desktopEntry.id, LaunchUnit.randomSuffix()).concat(cmd); Quickshell.execDetached({ command: cmd, @@ -406,7 +407,7 @@ printf 'uwsm=%s\nelogind=%s\nloginctl=%s\nsystemctl=%s\nusermgr=%s\nhibernate=%s } if (prefix.length > 0) - cmd = prefix.split(" ").concat(cmd); + cmd = LaunchUnit.prefixArgs(prefix, desktopEntry.id, LaunchUnit.randomSuffix()).concat(cmd); Quickshell.execDetached({ command: cmd,