154 lines
5.6 KiB
QML
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": ""
|
|
})
|
|
}
|