The workspace/window panel couldn't be scrolled: it snapped back to the top
about once a second. Nothing to do with the hologram overlay (a DrawingArea
with can_target=False that only ever queue_draw()s itself) — it was the 1 Hz
refresh that start_polling() runs while the menu is open. Both of its
callbacks called _rebuild_panel(), which did _clear(self._panel) and rebuilt
every widget, including a fresh Gtk.ScrolledWindow for the list. Emptying
scrolled content collapses the scroll adjustment's upper bound, so its value
is clamped back to 0 and the viewport jumps to the top.
The panel scaffolding (header, layout stack + switcher, list scroller) is now
built once in _build_panel_scaffold() and refreshed in place by _update_panel:
* The layout tabs are the same for every workspace — only the selection is
per-workspace, and _sync_layout_controls() already refreshes that — so
they no longer get torn down either.
* _update_window_list() compares the sorted window addresses with the last
set. Unchanged: row contents (title, ws N, icon) are updated in place, so
a retitled window can't move the viewport. Changed: only the rows are
rebuilt, and both scrollers' offsets are saved and restored on idle, once
the new rows are allocated and the adjustment's upper is no longer stale.
* _rebuild_strip() gets the same signature guard, so the poll stops
resetting the compact strip's horizontal scroll and no longer tears down a
grouped app's instance popover while it's open. It keys on addresses only:
strip titles are tooltip/popover-only and refresh on the next real change.
Applied identically to hyprlua and hyprdrive.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
config.json gains a "layouts" key to narrow which hypr/layouts-discovered
layouts astro-menu offers (and reorder them), plus per-layout option
overrides (trim directions, hide fit_method/stepper), without touching the
.lua layout sources.
Also: the taskbar's workspace/layout panel now polls every second while the
menu is open, since switching workspaces doesn't notify (or get blocked by)
the menu and the panel previously only refreshed on open.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bordered()'s glow re-strokes the rounded ring at widths up to border+22, so half
of each stroke falls outside the ring path. GTK clips a DrawingArea to its own
square allocation: along the straight edges that trims the outward spill to
nothing, but inside each corner the square patch between the arc and the widget
corner is still in-allocation and got painted solid accent red — square corners
peeking out from behind every rounded card border.
Clip the glow passes to the ring's outer silhouette (the widget rect rounded by
radius + border/2, exactly where the crisp stroke's outer edge runs) so the
bloom only reads inward. Crisp stroke and fill are unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Second daily-driving pass over the Cosmonaut Shell suite.
Animations (all four surfaces):
- Removed every slide-in reveal; each surface now only "materialises out of
static" (compositor no_anim layerrule + in-app hologram intro). Longer, noisier,
gradual fade-in: the content opacity ramps 0->1 (fade_widget) instead of a solid
haze block popping on. Added a quick reverse "dissolve into static" outro on
close. horizon-dock/orbit-menu use a slower 2.4s intro. Fixed a warm-reopen bug
where a stale frame-clock baseline skipped the intro entirely.
horizon-dock:
- Center planet: bigger, sinks ~1/4 below the screen edge, translucent holographic
body with a wide bloom halo, specular sheen, rim glow and a breathing pulse.
- Ornamental satellite glyphs: two rings framing the windows orbit, each with a
random 3-7 satellites whose motion source is randomised (toward-cursor / mouseX
/ mouseY), so the quiet edges feel alive.
- Super+D now opens horizon-dock (astro-menu moved to Super+Shift+D).
orbit-menu:
- Classic dmenu mode: `--dmenu` reads newline items from stdin, shows them as ring
nodes, prints the choice to stdout (exit 1 on cancel). Standalone NON_UNIQUE app
so it never routes to the resident daemon; scripts/orbit-dmenu.sh wraps it with
the gtk4-layer-shell preload.
astro-menu (sci-fi rework):
- Replaced the map module with "Ship Systems": a Gtk.Grid system monitor backed by
backend/sysmon.sh. CPU->Thrusters, GPU->Hyperdrive, RAM->Life Support Systems,
Storage->Cargo Hold (one aligned row per mounted drive with capacity), each a
bracketed -<████░░░░>- usage meter + -( 54°C )- temperature readout.
- Renamed Bluetooth -> System Radio, Network -> Laser Antenna Uplink.
- Weather gains a "Planetary Environment Report" headline.
station-bar:
- The battery readout uses a fuel-tank glyph (the ship runs on fuel).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Daily-driving pass over the Cosmonaut Shell suite: transparency, holographic
effects, and layout/geometry fixes across every component built for the DE.
Global holographic layer (astro-menu/horizon-dock/station-bar lib/hologram.py):
- edge-fade mask (A8 DEST_OUT) so scanlines fade out at panel borders
- magenta particle field; "materialize from static" noise-mask intro animation
- optional clip_func so the mask follows non-rectangular / animated content
- universal `* { background-color: transparent }` at USER+1 to defeat the
CyberQueer theme painting opaque bg on plain containers; blur layer_rules
astro-menu: magenta text (alt red) for readability; thinner, glowier borders;
rounded map-texture corners; fixed transparency stacking + square corners.
orbit-menu: scanline mask now follows the zoom transition into a submenu.
horizon-dock: reworked into an orbit-menu node ~1/3 on-screen (<=2/3 width) with
horizon perspective (arched orbit rows), a non-functional center clock-sphere,
orbit glyph decorations, graceful edge fade-out, and centered/filled orbits;
tray removed; giant-surface clip fixed.
station-bar: redesigned as an extra Horizon Dock orbit — bare glowing color-coded
glyphs (no pills), width-adaptive, one bar per monitor, Super+Z toggles the
focused monitor's bar. Clickable HUD trapezoid around the title opens Astro Menu.
Workspaces are now per-monitor: each bar shows only its own monitor's workspaces
and highlights that monitor's active workspace. Populated workspaces show the
station glyph, empty ones the bare spaceship + number; the focused one is framed
by a `-< >-` reticle with the rocket prepended when there's a station to dock at.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New leaner Hyprland DE (setup/modules/Desktop-Environments/hyprdrive.sh),
a sibling of hyprlua that drops the older EWW/nwg-shell/wofi/walker/
ulauncher stack in favor of a purpose-built, GTK4 layer-shell component
suite sharing one CyberQueer hologram visual language:
- orbit-menu radial power/utility menu (focal-point zoom nav, holographic
overlay, cosmetic satellites)
- horizon-dock hover-scrollable orbital app dock (open windows/favorites/
all apps orbits, SNI tray satellite)
- astro-menu astal-menu re-themed as a hologram info display (Location/
Weather/Bluetooth/Network quads, taskbar, app drawer)
- station-bar the EWW top bar's replacement ("Voidstation Status Bar"):
a thin curved layer-shell bar tracking Hyprland workspaces/
active window natively over .socket2.sock, no polling
Every component now shares one consistent hologram treatment: translucent
violet panel/node fills (replacing solid gray), a config-toggleable
scanline+sweep+noise overlay (lib/hologram.py, ported to horizon-dock and
station-bar to match orbit-menu/astro-menu), and glow-on-hover throughout.
Also adds horizon-dock to hyprlua (built there first, before hyprdrive
existed) and wires dependency checks, config-updater entries, and
apply-theme.sh color sync for every new component across both DEs.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nu8JkQ95hPAT8vADeGDAmL