Files
quickshell/modules/bar/states/Apps/AppsState.qml
T
2026-06-14 00:49:24 +02:00

154 lines
5.6 KiB
QML

pragma Singleton
import QtQuick
import Quickshell
import Quickshell.Io
Item {
id: root
// Per-workspace icon cache: maps workspaceId -> array of icon strings
property var workspaceIcons: ({})
function iconsForWorkspace(workspaceId) {
return root.workspaceIcons[workspaceId] || []
}
function matchIcon(name) {
if (!name) return ""
var lower = name.toLowerCase()
if (iconMap[lower]) return iconMap[lower]
for (var key in iconMap) {
if (key.endsWith("*") && key.startsWith("*")) {
var middle = key.slice(1, -1)
if (lower.indexOf(middle) !== -1) return iconMap[key]
} else if (key.endsWith("*")) {
var prefix = key.slice(0, -1)
if (lower.startsWith(prefix)) return iconMap[key]
} else if (key.startsWith("*")) {
var suffix = key.slice(1)
if (lower.endsWith(suffix)) return iconMap[key]
}
}
return ""
}
Process {
id: clientsProc
command: ["hyprctl", "clients", "-j"]
running: true
stdout: StdioCollector {
onStreamFinished: {
try {
var data = JSON.parse(this.text.trim())
var newIcons = {}
for (var i = 0; i < data.length; i++) {
var client = data[i]
var wid = client.workspace.id
var icon = root.matchIcon(client.initialTitle) || root.matchIcon(client.initialClass)
if (icon) {
if (!newIcons[wid]) newIcons[wid] = []
newIcons[wid].push(icon)
}
}
root.workspaceIcons = newIcons
} catch (e) {
// hyprctl output was not valid JSON
}
}
}
}
Timer {
interval: 1000
running: true
repeat: true
triggeredOnStart: true
onTriggered: clientsProc.running = true
}
readonly property var iconMap: ({
"grayjay": "",
"ablaze floorp": "",
"floorp": "",
"librewolf": "",
"midori": "",
"brave-browser": "",
"chromium": "",
"org.mozilla.thunderbird": "󰇮",
"kitty": "",
"alacritty": "",
"vlc media player": "󰕼",
"mpv": "",
"ffplay": "",
"org.kde.kdenlive": "",
"discord": "",
"vesktop": "",
"signal": "󰭹",
"xyz.chatboxapp.app": "",
"visual studio code": "",
"vscodium": "",
"jetbrains-idea": "",
"jetbrains-studio": "",
"org.xfce.mousepad": "󱩼",
"org.keepassxc.keepassxc": "",
"yubico authenticator": "",
"com.nextcloud*": "󰅟",
"octopi": "󰒚",
"steam*": "",
"org.prismlauncher*": "󰍳",
"minecraft*": "󰍳",
"game": "",
"blender": "",
"krita": "",
"virt*": "",
"remote-viewer": "",
"qpwgraph": "󱡫",
"carla": "󱡫",
"com.obsproject.studio": "󰨜",
"hyprland-share-picker": "󱎴",
"libreoffice-startcenter": "",
"libreoffice-base": "",
"libreoffice-calc": "󱎏",
"libreoffice-draw": "󱎐",
"libreoffice-impress": "",
"libreoffice-math": "",
"libreoffice-writer": "󱎒",
"*rnote": "󱩼",
"xreader": "󱩼",
"*xournalpp*": "󱩼",
"qpdfview.local.qpdfview": "󱩼",
"mission center": "",
"qdirstat": "󰋊",
"disks": "󰋊",
"nemo": "󰉋",
"org.gnome.nautilus": "󰉋",
"org.kde.dolphin": "󰉋",
"xdg-desktop-portal-gtk": "󰉋",
"nwg-look": "",
"qt5ct": "",
"qt6ct": "",
"sddm-conf": "",
"blueman*": "󰂯",
"nm-connection-editor": "󱛆",
"calculator": "󰪚",
"*vpn": "󰳌",
"*cisco*": "󰳌",
"*qbittorrent*": "󰉍",
"xilinx*": "",
"vsim": "",
"*boxbuddy*": "󰒋",
"fladder": "󰼁",
"crunchyroll": "",
"netflix": "",
"primevideo": "󰯜",
"viewnior": "",
"gimp": "󱇣",
"*inkscape*": "󱇣",
"lightburn": "󱇣",
"wofi": "",
"org.gnome.Settings": "",
"pavucontrol": "",
"nm-applet": "󱛆"
})
}