summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/DesktopService.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/DesktopService.qml')
-rw-r--r--raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/DesktopService.qml94
1 files changed, 94 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/DesktopService.qml b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/DesktopService.qml
new file mode 100644
index 0000000..c9913e9
--- /dev/null
+++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/DesktopService.qml
@@ -0,0 +1,94 @@
+pragma Singleton
+
+pragma ComponentBehavior: Bound
+
+import QtQuick
+import Quickshell
+import Quickshell.Io
+
+Singleton {
+ id: root
+
+ property var _cache: ({})
+
+ function resolveIconPath(moddedAppId) {
+ if (!moddedAppId)
+ return "";
+
+ if (_cache[moddedAppId] !== undefined)
+ return _cache[moddedAppId];
+
+ const result = (function() {
+ // 1. Try heuristic lookup (standard)
+ const entry = DesktopEntries.heuristicLookup(moddedAppId);
+ let icon = Quickshell.iconPath(entry?.icon, true);
+ if (icon && icon !== "")
+ return icon;
+
+ // 2. Try the appId itself as an icon name
+ icon = Quickshell.iconPath(moddedAppId, true);
+ if (icon && icon !== "")
+ return icon;
+
+ // 3. Try variations of the appId (lowercase, last part)
+ const appIds = [moddedAppId.toLowerCase()];
+ const lastPart = moddedAppId.split('.').pop();
+ if (lastPart && lastPart !== moddedAppId) {
+ appIds.push(lastPart);
+ appIds.push(lastPart.toLowerCase());
+ }
+
+ for (const id of appIds) {
+ icon = Quickshell.iconPath(id, true);
+ if (icon && icon !== "")
+ return icon;
+ }
+
+ // 4. Deep search in all desktop entries (if the above fail)
+ // This is slow-ish but only happens once for failed icons
+ const strippedId = moddedAppId.replace(/-bin$/, "").toLowerCase();
+ const allEntries = DesktopEntries.applications.values;
+ for (let i = 0; i < allEntries.length; i++) {
+ const e = allEntries[i];
+ const eId = (e.id || "").toLowerCase();
+ const eName = (e.name || "").toLowerCase();
+ const eExec = (e.execString || "").toLowerCase();
+
+ if (eId.includes(strippedId) || eName.includes(strippedId) || eExec.includes(strippedId)) {
+ icon = Quickshell.iconPath(e.icon, true);
+ if (icon && icon !== "")
+ return icon;
+ }
+ }
+
+ // 5. Nix/Guix specific store check (as a last resort)
+ for (const appId of appIds) {
+ let execPath = entry?.execString?.replace(/\/bin.*/, "");
+ if (!execPath)
+ continue;
+
+ if (execPath.startsWith("/nix/store/") || execPath.startsWith("/gnu/store/")) {
+ const basePath = execPath;
+ const sizes = ["256x256", "128x128", "64x64", "48x48", "32x32", "24x24", "16x16"];
+
+ let iconPath = `${basePath}/share/icons/hicolor/scalable/apps/${appId}.svg`;
+ icon = Quickshell.iconPath(iconPath, true);
+ if (icon && icon !== "")
+ return icon;
+
+ for (const size of sizes) {
+ iconPath = `${basePath}/share/icons/hicolor/${size}/apps/${appId}.png`;
+ icon = Quickshell.iconPath(iconPath, true);
+ if (icon && icon !== "")
+ return icon;
+ }
+ }
+ }
+
+ return "";
+ })();
+
+ _cache[moddedAppId] = result;
+ return result;
+ }
+}