| Age | Commit message (Collapse) | Author | Files | Lines |
|
The repository had no name of its own, only the framework's. It is now
Keystone, in the README, AGENTS.md, the settings window, notes commit
messages, calctl's PRODID and the user page's User-Agent.
Its files move off quickshell's name too:
~/.config/quickshell/greetings -> ~/.config/keystone/
~/.config/quickshell/obs-scene-icons.json -> ~/.config/keystone/
$XDG_STATE_HOME/quickshell/desktop.json -> $XDG_STATE_HOME/keystone/
~/.config/quickshell is Quickshell's own default config directory (a
bare qs loads its shell.qml), so sharing it was a collision rather than
a home. There is no fallback to the old paths: the files are moved once.
The layer namespaces become keystone-*, and the Hyprland blur rules in
hypr-theme are renamed to match in the same change. A running shell
keeps its old namespaces until restarted.
Left alone: the retired standalone mail and vm shells' namespaces,
which their READMEs keep as history; Quickshell's own app id, binary
and process name; and the repository directory.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The appearance shell existed because a wallpaper picker needed more room
than the 600px drawer, so it ran as its own process with a full-screen
overlay. The settings window now gives it that room, and its five tabs
become five settings pages in the desktop process: Wallpaper, Theme,
Icons & cursor, Sunset and Idle. appearance/ is gone, and with it a
process, a keepalive window and a layer blur rule.
The files move to desktop/modules/appearance/ unchanged in what they do.
Each tab gets a small *Module.qml; the window's refresh-on-open calls the
singletons' refresh(), which the panel's show() used to. The two tabs that
were inline Components in AppearancePanel become ThemeTab and
WallpaperTab, owning the notices the panel printed. Sunset, Idle and
Icons drop their own Flickable so the page scrolls them and search can
reveal a row; the wallpaper list virtualises its rows and scrolls itself,
so it takes the page's new viewHeight instead.
Search finds a colour scheme and an icon or cursor theme by name.
The appearance IPC target moves to desktop/shell.qml with the same verbs,
so udt-steps and any keybind change only the path. Git now follows the
appearance pages and autostart in the sidebar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
AGENTS.md describes the hybrid model (desktop/ hosts drawer and island) and
gains the gotchas found while building the island: UseQApplication for tray
menus, WheelHandler vs MouseArea, accent colliding with green, xkb layout
switching, and the tray popup un-hovering the island. The Blur waybar
measurement becomes history. READMEs drop their present-tense waybar
references.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Modelled on window-switcher: a Scope with a 1x1 keepalive PanelWindow
plus a LazyLoader'd overlay, opened via IpcHandler (SUPER+k is bound
in a different repo). hyprctl binds -j is asked fresh on every opening
so the list matches whatever Hyprland has loaded, with Binds.group()
from task 1 turning it into the grid's {name, rows} groups.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Five components become three, and the Theme symlink count with them. Two
new notes: a pragma Singleton in a subdirectory resolves through a plain
directory import with no qmldir, and Virsh.sampling gates only the stats
poll, not the lifecycle stream that keeps the tile correct while the page
is closed.
|
|
The component is finished and on the user's ALT+TAB, so what is left is the
part that would otherwise have to be rediscovered. Most of the time this
build took went to three things that report success and then do nothing:
Hyprland 0.56.2 evaluating dispatch arguments as Lua, so the
documented-looking `focuswindow address:0x...` is a silent syntax error; a
focus dispatched while the overlay still holds an exclusive keyboard grab
being accepted and ignored; and a sort on a `focusHistoryID` property that
does not exist, comparing NaN and leaving an arbitrary order that looks
plausible. None of them logs anything.
Those six, plus the missing `0x` prefix, the empty `toplevels` before
`refreshToplevels()` and `ScreencopyView` reporting (-1, -1) rather than
(0, 0), generalise past this component, so they go in AGENTS.md next to the
other notes that exist because a commit message explained itself once. The
card geometry and the blank icon square are specific to the grid and stay in
the component README.
Also corrects the counts that four components made true and five do not: the
component lists, "the other three use ExclusionMode.Ignore", and the Theme
symlink note.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
|
|
Four of the notes generalise beyond this component. Two were measured while
building it: notmuch fails two different ways and only the rejected-query case
is detectable, the misparsed-query case returning a plausible wrong number
with exit 0; and notmuch deduplicates by message id, so one message with two
file paths is counted twice by a path glob and per-account counts then sum
above the total.
Two more were bugs found only by running the thing. Xapian replaces files on
commit, so a watch on a filename dies with it and the watch belongs on the
directory. And an INI section body is not everything up to the next bracket,
because values can contain brackets themselves: folders named [Gmail]/Bozze
ended a section before its label and three of five accounts quietly displayed
their raw key instead.
The Blur section gains the exclusion-zone note with its measured geometry,
since mail-overview is the first panel here that sits below waybar rather than
over it. The "Both" phrasing that assumed two components is now plural.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU
|
|
One drawer for how the desktop looks, on SUPER+Return, replacing the
qarma file dialog that key used to open. wallp is untouched and still
does the work: the panel calls it with H= and V= and it still runs from
a terminal.
Clicking a thumbnail stages it rather than setting it, so both screens
can be composed before anything changes and Apply is a single wallp
call. The mock screens show the result: the staged pick where there is
one, what is set where there is not, and the hovered thumbnail on the
targeted screen. They are drawn at the real proportions from hyprctl
monitors, DP-3 upright because it has transform=1, centred against each
other as Hyprland has them.
The scheme tab reads the palette pair unified-desktop-theme keeps for
each scheme, so the swatches are that scheme's real colours and the list
needs no edit when a scheme is added. Applying writes roles.conf and
runs install.sh, and reloads nothing, because install.sh reloads
nothing: the panel says what is still showing the old scheme rather than
pretending the switch is done.
Two QML traps are documented in AGENTS.md because neither announces
itself: there is no String.matchAll, which threw inside a try and left
every swatch empty, and assigning running = true to an already-running
Process does nothing, which stopped the scheme loader after the first
file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G7NRsGyF9jGfPYS4zPqpN7
|
|
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
|
|
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
|