fixed some quickshell stuff + hypr

This commit is contained in:
nvrl committed 2026-09-28 23:27:00 +02:00
1 parent 32b43bdbb3
commit 1f7f5aef8a
6 files changed
+151 -11

No files matched your search

+23 -6
View File
@@ -16,15 +16,32 @@ Column {
spacing: Theme.padS + 2
visible: root.shownItems.length > 0
// Applets whose whole job the rail already does. nm-applet and blueman keep
// running — they are the Wi-Fi secret agent and the pairing agent — but
// their icons were a second network and a second bluetooth glyph a few
// slots below the rail's own.
readonly property var hiddenIds: ["nm-applet", "blueman"]
// Applets whose whole job the rail already does. blueman keeps running as
// the pairing agent, but its icon was a second bluetooth glyph a few slots
// below the rail's own.
readonly property var hiddenIds: ["blueman"]
readonly property var shownItems: SystemTray.items.values
.filter(item => root.hiddenIds.indexOf(item.id) === -1)
// Electron and Chromium apps send only a full-colour pixmap, and flattening
// that loses everything inside the outline: Brave's lion became a plain
// shield. The icon theme often ships a panel glyph drawn for exactly this
// job, so look one up by the app's name and use the pixmap only when none
// exists. The id is no help here ("chrome_status_icon_1" for Brave and
// Proton Pass alike), so the tooltip title is the name we go by.
function themedIcon(item: SystemTrayItem): string {
if (item.icon.startsWith("image://icon/")) return item.icon;
const name = (item.tooltipTitle || item.title || item.id)
.toLowerCase().replace(/[^a-z0-9]+/g, "-");
for (const suffix of ["-tray", "-panel", "-symbolic"]) {
const path = Quickshell.iconPath(name + suffix, true);
if (path !== "") return path;
}
return item.icon;
}
Repeater {
model: root.shownItems
@@ -45,7 +62,7 @@ Column {
IconImage {
id: img
anchors.fill: parent
source: entry.modelData.icon
source: root.themedIcon(entry.modelData)
asynchronous: true
layer.enabled: true
+11 -4
View File
@@ -304,18 +304,25 @@ Singleton {
// So when the target declares no placeholder we build the command line
// ourselves and hand uwsm an argv instead of an ID. It is still scoped and
// still supervised; we just did the expansion.
//
// The same fallback covers entries whose file name uwsm will not accept as
// an ID at all. Its check is the regex below, so `Proton Authenticator
// .desktop` and most Steam/Lutris shortcuts ("Hollow Knight.desktop") fail
// with "Invalid Desktop Entry ID" before anything runs.
readonly property var fieldRe: /%[fFuU]/
readonly property var anyFieldRe: /^%[a-zA-Z]$/
readonly property var uwsmIdRe: /^[a-zA-Z0-9_][a-zA-Z0-9_.-]*\.desktop(:.*)?$/
function launch(item: var, arg: string): void {
root._remember(item.key);
const byId = root.uwsmIdRe.test(item.key);
if (arg === "") {
if (byId && arg === "") {
Quickshell.execDetached(["uwsm", "app", "--", item.key]);
return;
}
if (root.fieldRe.test(item.exec || "")) {
if (byId && root.fieldRe.test(item.exec || "")) {
Quickshell.execDetached(["uwsm", "app", "--", item.key, arg]);
return;
}
@@ -323,10 +330,10 @@ Singleton {
const argv = root._tokenize(item.exec || "")
.filter(t => !root.anyFieldRe.test(t));
if (argv.length === 0) {
Quickshell.execDetached(["uwsm", "app", "--", item.key]);
if (byId) Quickshell.execDetached(["uwsm", "app", "--", item.key]);
return;
}
argv.push(arg);
if (arg !== "") argv.push(arg);
// Without this the unit is named after the bare executable and every
// app launched this way collides in the unit namespace.