.pragma library // Copyright (C) 2026 Danilo M. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // The default sink's icon name. Thresholds in thirds, as waybar's wb-icon did. function volumeIcon(volume, muted) { // !(> 0) also catches a volume not populated yet (undefined, NaN), which // would otherwise fall through every test and read as high. if (muted || !(volume > 0)) return "audio-volume-muted"; if (volume < 0.33) return "audio-volume-low"; if (volume < 0.66) return "audio-volume-medium"; return "audio-volume-high"; } // A VM's dot colour as a Theme property name, or "" for no dot. States are // the names Virsh._stateName gives libvirt's enum: "blocked" is what virsh // list prints as idle, "suspended" is pmsuspended. A shut-off VM only gets a // dot when it carries a managed save, because starting it is then a restore. function vmRole(vm) { if (!vm || !vm.state) return ""; if (vm.state === "shut off") return vm.saved ? "blue" : ""; return ({ "running": "green", "paused": "yellow", "blocked": "yellow", "shutting down": "yellow", "suspended": "accent", "crashed": "red", })[vm.state] || ""; } // Flag image for a Hyprland active_keymap string, wb-lang's mapping. function flagFor(keymap) { if (!keymap || keymap.startsWith("Italian")) return "flag-it.svg"; return "burger.svg"; } // Active capture kinds as Theme property names, in a fixed order so the // sliver's segments do not shuffle. function privacyRoles(mic, cam, loc, scr) { const out = []; if (mic) out.push("green"); if (cam) out.push("yellow"); if (loc) out.push("blue"); if (scr) out.push("red"); return out; } // Hyprland's openwindow event data: "address,workspace,class,title". The // title is last and may contain commas, so only the first three fields are // read. function parseOpenWindow(data) { const p = String(data || "").split(","); return { address: p[0] || "", workspace: p[1] || "", appClass: p[2] || "" }; }