aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
31 hoursrefactor(theme): read the palette from unified-desktop-themeDanilo M.4-35/+72
Both components had their own copy of the Macchiato colours, and the second copy appeared the moment there was a second component. Editing the palette meant editing it in as many places as there were shells, and they would have drifted. They now read ~/.cache/wal/udt-palette.qml, which udt-accent generates from unified-desktop-theme's palette.rasi. The file is watched, so a palette change reaches a running shell in place, the same way the accent already did. What is left in Theme.qml is a fallback, used before the file has been read and on a machine where unified-desktop-theme is not installed, which is what keeps each directory runnable on its own. The file is parsed rather than imported: a generated QML singleton cannot be imported without a qmldir beside it, and the wal cache has no reason to carry one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G7NRsGyF9jGfPYS4zPqpN7
31 hoursfeat(vm-manager): libvirt VM drawerDanilo M.8-0/+999
A top drawer on the secondary monitor showing every libvirt machine: its state, live statistics while it runs, the actions that make sense in that state, and the snapshot list. SUPER+v toggles it over IPC. This replaces the menu half of rofi-qemu.sh, which is still in ~/bin but no longer bound. A dmenu row can only ever be a string, so the script could not show what a machine is actually doing, and the snapshots it could create were never listed anywhere. Everything shells out to virsh, the same commands the script used, so there is no libvirt binding and no new dependency. State changes arrive by `virsh event --all --loop` rather than polling, which means a machine started from virt-manager or the CLI updates the drawer too. Statistics do need a 2 second timer, but it only runs while the drawer is open. Memory, filesystem usage and the address come from qemu-guest-agent, so they are absent for the first seconds after boot and on any machine without the agent. Those rows show a dash rather than falling back to libvirt's own figures: balloon.current is memory allocated rather than used and reads full forever, and block.allocation is qcow2 growth on the host rather than usage inside the guest. Either would be quietly wrong. Destructive actions are gated, which the rofi version did not do at all: Delete VM requires the name typed, since it runs undefine with --remove-all-storage and erases the disk image, and reset, force stop, snapshot revert and snapshot delete each take a confirmation click. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G7NRsGyF9jGfPYS4zPqpN7
32 hoursfeat: quickshell repo with volume OSDDanilo M.6-0/+698
Scaffold the repo that will hold quickshell implementations, each in its own directory with its own README, and add the first one. volume-osd shows an on-screen display for output and input volume. It watches PipeWire through Quickshell's native service rather than polling wpctl, so it appears for any volume change, not only for the keybinds: pavucontrol, a per-application slider, or a phone acting as a remote. One widget serves both directions, showing whichever device moved last. Colours follow unified-desktop-theme: Catppuccin Macchiato fixed, with the accent read from the file udt-accent already writes and watched, so it tracks the wallpaper. Lavender is the fallback, which keeps the directory runnable where that file does not exist. The frosting is the compositor's: the panel draws translucent and Hyprland blurs behind it via a layerrule matched on the window's namespace. That avoids a MultiEffect and an offscreen blur pass in QML, and degrades to flat translucent without the rule. Two details are documented in the component README because both were wrong before they were right: PwObjectTracker is required or the volume reads stale, and a node reports its initial volume before `ready` goes true, so the ready check alone suppresses the startup values. An extra guard on top of it ate the user's first keypress instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G7NRsGyF9jGfPYS4zPqpN7