From 63c86e950b59ba1b29df367065ee2623b0335906 Mon Sep 17 00:00:00 2001 From: Xavier Lhinares <60365026+XLhinares@users.noreply.github.com> Date: Sun, 15 Mar 2026 16:17:49 +0800 Subject: bar: allow setting custom workspace app icons in shell.json (#1214) * bar: allow setting custom workspace app icons in shell.json * rename to windowIcons and use regex field for regex Also allow specifying regex flags and exact name * add default config (fix steam icons) --------- Co-authored-by: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> --- README.md | 6 ++++++ config/BarConfig.qml | 6 ++++++ config/Config.qml | 3 ++- utils/Icons.qml | 30 ++++++++++++++++++++++++++---- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0b0ec20..bd2ef13 100644 --- a/README.md +++ b/README.md @@ -420,6 +420,12 @@ default, you must create it manually. "name": "steam", "icon": "sports_esports" } + ], + "windowIcons": [ + { + "regex": "steam(_app_(default|[0-9]+))?", + "icon": "sports_esports" + } ] }, "excludedScreens": [""], diff --git a/config/BarConfig.qml b/config/BarConfig.qml index 6254d94..2e04108 100644 --- a/config/BarConfig.qml +++ b/config/BarConfig.qml @@ -79,6 +79,12 @@ JsonObject { property string activeLabel: "󰮯" property string capitalisation: "preserve" // upper, lower, or preserve - relevant only if label is empty property list specialWorkspaceIcons: [] + property list windowIcons: [ + { + regex: "steam(_app_(default|[0-9]+))?", + icon: "sports_esports" + } + ] } component ActiveWindow: JsonObject { diff --git a/config/Config.qml b/config/Config.qml index 2a261e7..584aeba 100644 --- a/config/Config.qml +++ b/config/Config.qml @@ -176,7 +176,8 @@ Singleton { occupiedLabel: bar.workspaces.occupiedLabel, activeLabel: bar.workspaces.activeLabel, capitalisation: bar.workspaces.capitalisation, - specialWorkspaceIcons: bar.workspaces.specialWorkspaceIcons + specialWorkspaceIcons: bar.workspaces.specialWorkspaceIcons, + windowIcons: bar.workspaces.windowIcons }, activeWindow: { compact: bar.activeWindow.compact, diff --git a/utils/Icons.qml b/utils/Icons.qml index c06cbf8..34f8049 100644 --- a/utils/Icons.qml +++ b/utils/Icons.qml @@ -79,6 +79,26 @@ Singleton { Office: "content_paste" }) + // Checks if a name matches an icon config. Icon configs can have the following keys: + // - name: The exact name of the icon + // - regex: A regex to match against the name (takes priority over name) + // - flags: The regex flags (only used if regex is set) + // - icon: The icon to use + function matchIconConfig(name: string, iconConfig: var): bool { + if (!iconConfig.icon) + return false; + + if (iconConfig.regex) { + const re = new RegExp(iconConfig.regex, iconConfig.flags ?? ""); + if (re.test(name)) + return true; + } else if (iconConfig.name === name) { + return true; + } + + return false; + } + function getAppIcon(name: string, fallback: string): string { const icon = DesktopEntries.heuristicLookup(name)?.icon; if (fallback !== "undefined") @@ -87,6 +107,10 @@ Singleton { } function getAppCategoryIcon(name: string, fallback: string): string { + for (const iconConfig of Config.bar.workspaces.windowIcons) + if (matchIconConfig(name, iconConfig)) + return iconConfig.icon; + const categories = DesktopEntries.heuristicLookup(name)?.categories; if (categories) @@ -188,11 +212,9 @@ Singleton { function getSpecialWsIcon(name: string): string { name = name.toLowerCase().slice("special:".length); - for (const iconConfig of Config.bar.workspaces.specialWorkspaceIcons) { - if (iconConfig.name === name) { + for (const iconConfig of Config.bar.workspaces.specialWorkspaceIcons) + if (matchIconConfig(name, iconConfig)) return iconConfig.icon; - } - } if (name === "special") return "star"; -- cgit v1.2.3-freya