aboutsummaryrefslogtreecommitdiffstats
path: root/window-switcher
AgeCommit message (Collapse)AuthorFilesLines
26 hoursfeat(window-switcher): the grid, the selection, and an empty stateDanilo M.1-8/+100
Columns are the window count capped at six and the grid centres, so one card sits dead centre and two straddle the middle. Cards grow to fill their row up to 640px: without a ceiling a lone preview becomes a full-screen mirror of the window it stands for. The close button leaves the overlay open, because closing is a side errand and a dismissal would mean reopening to close a second window. That makes an empty overlay reachable by closing the last window, so there is an empty state rather than a full-screen dim with nothing in it, which reads as a hang. The selection needs no reset. The LazyLoader destroys the overlay on close and constructs a new one on the next opening, verified with a build counter: two openings, two constructions. selectedIndex is therefore 0 on every showing by initialisation, and an explicit assignment in Component.onCompleted would be a no-op. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
26 hoursfeat(window-switcher): one card, with the preview fittedDanilo M.1-0/+136
The card box is a fixed 16:10 and the preview is fitted inside it rather than the card taking its preview's shape. DP-1 windows are near 21:9 and DP-3 reports transform=1, so its windows are portrait 9:16: a 4.4x span of aspect ratio in one grid, and ragged rows would break the alignment of the three text lines that make it scannable. Both corner overlays carry a scrim. They are drawn over an arbitrary window, so a themed icon can otherwise land on a same-coloured region and disappear. An uncaptured ScreencopyView reports sourceSize (-1, -1) rather than (0, 0), so the aspect ratio guard tests for a positive height. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
27 hoursfeat(window-switcher): the window model, filtered and sortedDanilo M.1-0/+67
One place for everything that touches Hyprland, so the UI never issues a dispatch itself. That matters more than usual here because dispatch arguments are Lua on 0.56.2 and the documented-looking form is a syntax error that fails silently, and because HyprlandToplevel.address omits the 0x prefix that a dispatch needs. focusHistoryID is not a HyprlandToplevel property, only a field of the raw hyprctl object, so reading it directly returned undefined and left the sort a no-op. It is read through lastIpcObject, with a missing one sorting last rather than as most recent. Only special: workspaces are filtered, matching the rofi script this replaces. Windows elsewhere are kept whatever their visibility, since jumping to another desktop is the point of a switcher. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
27 hoursfix(window-switcher): pick the screen the way the other components doDanilo M.1-1/+4
The screen was found by a name written inline, falling back to null. The other three panels all take a monitor property and fall back to screens[0], so this now does too: a machine without a DP-1 gets its first monitor rather than a null screen, and the name is in one place if it ever needs changing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
27 hoursfeat(window-switcher): the overlay skeleton, and a proven EscapeDanilo M.3-0/+109
A fifth component, so the same keepalive window as the other four: a config with no visible window exits without reporting anything, and this overlay is hidden almost always. Escape is handled on a focused Item inside the PanelWindow rather than on the window, because key events reach a focused item and Keys.onEscapePressed on a PanelWindow never fires. Proven before the grid is built on top of it, since keyboard navigation depends on the same grab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S