| Age | Commit message (Collapse) | Author | Files | Lines |
|
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
|
|
The layer surface announced itself as window-switcher, while the other
components all use a quickshell- prefix and the blur rules in
decorations.lua match on it. A rule for the odd one out would have been
the only one in that file matching a bare name, so the component matches
the convention instead.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
|
|
Picking a window focused nothing, and focus returned to whatever had it
before. The overlay holds keyboard focus exclusively, and the compositor
will not move window focus out from under that grab: the dispatch is
accepted, reports ok, and is then ignored. Nothing in the log says so,
which is why this looked like a dispatch that had worked.
Closing first in the same turn is not enough either, because close() only
clears a property and the layer surface survives until the frame after,
so the dispatch still lands inside the grab. The target is now remembered
and focused once the surface is actually gone.
Tested in both directions, since the case that exposed it was
cross-monitor: DP-1 to a window on DP-3, and back.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
|
|
Only the width was clamped, so rows were free to run off the top and
bottom of the screen. A centred Grid has no way to scroll to a card that
lands there, so the cards were unreachable rather than merely cramped: at
19 windows on a 1080-tall screen the fourth row was clipped, and it grew
worse from there.
Cards now shrink to fit the available height as well, which leaves every
count up to 18 exactly as it was, since the width term still wins there.
Thirty windows fit in 995px.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|