Commit Graph

45 Commits

Author SHA1 Message Date
server2 f8c17025ce The island opens with nothing playing too: the last song played (kept across restarts) with Play, which starts its player, and chips that start players 2026-10-19 11:55:50 +02:00
server2 aadf765d87 Idle pill: the words only where they fit with room at both ends, else the note alone, so it never nears the rim 2026-10-19 11:42:21 +02:00
server2 6399844731 New workspaces grow in; config saves don't redraw everything or race; media peek skips the player in front
- A workspace Hyprland makes for a switch (createworkspacev2) grows into the row
  over the slide instead of appearing at full size; the window keeps the full
  room meanwhile.
- Every config.toml save restarted the colour Animation, and Animation::new
  runs its clock even from a colour to itself, so every window redrew for 0.4 s
  per save. The colours now only fade when they change.
- The file watch could read config.toml halfway through the shell's own save
  and reset settings to their defaults. Saves and rereads share one lock, the
  file is written to a new file and renamed over, and the shell's own saves
  are skipped by the watch.
- A song change or new player only pops the island when the focused window
  isn't that player's app (parse::same_app, tested).
2026-10-15 11:28:44 +02:00
server2 5d322b940d Glass designs as settings: solid, frosted, liquid on every surface
appearance.surface.design picks the look (chips in the config window); each
design's opacity, rim and light are settings. surface::shell now draws the
island, idle pill, workspace and tray pills, tray menu, control centre and
popup, so a design applies everywhere. On see-through glass faces fade with
.opacity(). Shell text settings can list their allowed words (chips).
2026-10-15 03:05:06 +02:00
server2 7d8525e95c AGENTS.md: settings, config window, workspace ghost; condensed 2026-10-15 02:59:52 +02:00
server2 3b9929aff4 Esc closes the config window; a removed empty workspace closes up during the switch
Hyprland drops an empty workspace the moment it's left, so its number vanished
and the row jumped before the disc slid. Its slot now stays for the slide,
shrinking and fading, and the pill narrows with it.
2026-10-15 02:55:30 +02:00
server2 4fbfad3ce3 Config window: every setting in config.toml, Hyprland options from Hyprland
All tunable values (sizes, timings, text sizes, colours, polls, equalizer
presets and bands, hotspot, extra output) are settings declared once in
config.rs, read from ~/.config/amane/config.toml, applied live on save.
shell.conf's four values move over on first start.

settings.rs: a normal window (control centre gear, or ipc config) with a
page per part, a page per Hyprland category, search and reset per row.
hypr.rs: Hyprland's options from hyprctl descriptions/getoption, applied
with hl.config and kept in ~/.config/hypr/amane.lua.
2026-10-15 02:18:57 +02:00
server2 dfe3867529 Peeks start where the part is: no dip when the bar hides
Switching from a workspace with the bar shown to a fullscreen one slid
the bar away while the workspace peek slid in from hidden, so the pill
dipped and came back. A peek now starts from the part's current
position, so a shown pill stays still for the peek and then leaves.
The tray, which peeks don't show, slides away on its own.

Tested on DP-2 (2 -> 3 and back), frame by frame.
2026-10-15 01:14:55 +02:00
server2 200aff97ae AGENTS.md: control centre, tray, bar hiding and reserved space; new ground rules and test notes 2026-10-13 06:19:41 +02:00
server2 11646cafcf Reserve the top of every monitor for the bar
edge::spacer: a full-width, empty, click-through Background layer as tall
as the pills reach (TOP_GAP + COMPACT_H = 44 px) with Zone::Reserve.
Hyprland keeps tiled and maximised windows below it and lets fullscreen
windows cover it, so space is reserved exactly where the bar stays.
Verified: reserved 0 44 0 0 on all monitors, a tiled window moved from
y=636 to 680, a fullscreen one still covers 1920x1080, idle 0 frames.
2026-10-13 06:15:37 +02:00
server2 35386e84f1 Maps fit beside the media island
The map menus' width follows the monitor: from its right edge to the
island's compact pill, less a 16 px gap (the pill's pop is 15 px a side);
822 px on 1920. AREA_H 480, no alternating rings (simulated: no label
overlaps up to 8 nodes at this size). The password popup centres on it.
2026-10-13 06:09:06 +02:00
server2 a7c49a16c0 Ethernet details in the panel, smaller maps, no tray in workspace peeks
- control.rs: Menu::Ethernet; the panel morphs into the card's details
  (gathered off the drawing thread first) instead of a separate popup;
  prompt::copy now takes a callback so both use wl-copy the same way
- prompt.rs: the Details popup is gone
- map.rs: 920x460, at most 8 nodes, lighter nearness pull (simulated:
  no label overlaps up to 8 nodes while drifting)
- workspaces.rs: a peek on a workspace change shows the workspaces alone
2026-10-13 05:40:44 +02:00
server2 1e99d7264c Tray, fullscreen-only hiding, peeks, Ethernet details, wider maps
- tray.rs: the shell serves org.kde.StatusNotifierWatcher (only when no other
  watcher runs) and is its host; icons from the theme or from IconPixmap
  (png.rs, a stdlib png writer); left/middle/right click and scroll; dbusmenu
  menus drawn in the island's look; tray IPC verbs for testing
- edge.rs: the bar hides only on monitors showing a fullscreen window, driven
  by Hyprland's event socket; peeks of the workspaces (with the disc sliding)
  and the island (song change, new player), with a pop on the island
- prompt.rs: Ethernet details popup (addresses, gateway, DNS, MAC copyable)
- map.rs: 1100x560 maps, every other node a ring further in
- tools/fake_tray.py: a fake tray app, by bus name or by path
2026-10-13 04:58:08 +02:00
server2 b14df3a435 Control centre: popups via iwctl/bluetoothctl, one-shape menus, search rings, Ethernet and link speeds, auto-hiding bar
- prompt.rs: popup for Wi-Fi passwords, Bluetooth PINs/passkeys/codes, saved
  passwords (Copy through wl-copy on stdin) and failure reasons; joins through
  iwctl, pairs through a bluetoothctl session; only popups with a field take
  the keyboard (an exclusive grab let stray keystrokes close failure popups)
- menus: the panel is the only shape; the menu window fades its content in
  once the panel has taken the menu's size
- maps: clicking the bubble searches again (iwctl scan, bluetoothctl scan)
  with rings running out from the click
- Ethernet tile and pill icon from sysfs; link speed badges (Ethernet speed,
  Wi-Fi RxBitrate from iwd diagnostics, at most once a minute)
- edge.rs: bar hidden until the pointer rests on the top edge; nothing is
  read or drawn while hidden
- IPC: control wifi join|password|search, bluetooth pair|connect|search,
  prompt answer|cancel, status prompt=
2026-10-13 02:59:22 +02:00
server2 afe963dfea Revert "control centre: ask for Wi-Fi passwords and Bluetooth PINs in a popup"
This reverts commit 4d4166dadc.
2026-10-12 01:14:39 +02:00
server2 4d4166dadc control centre: ask for Wi-Fi passwords and Bluetooth PINs in a popup
The shell registers as iwd's agent and as BlueZ's default agent (KeyboardDisplay),
each only while its daemon runs (GetNameOwner, never a call that would start it), and
again after a restart. RequestPassphrase, RequestPinCode, RequestPasskey,
RequestConfirmation, RequestAuthorization, DisplayPinCode and DisplayPasskey show a
small popup over the control centre that takes the keyboard (Enter answers, Escape
cancels); the answer is the reply to the daemon's call. Amane can only reply with
success, so Cancel leaves the call unanswered and cancels the pairing or the joining.
New Wi-Fi networks with a password are clickable on the map now; IPC control prompt
answer|cancel.
2026-10-11 08:56:13 +02:00
server2 8fa951fe15 control centre: Wi-Fi and Bluetooth menus as a map around this desktop
The menus are 820 px wide (the panel resizes to them). This desktop is a bubble in
the middle, networks and devices float around it, nearer the stronger (or the more
connected) they are, rings ripple out while scanning. Each is tied to the bubble by a
line: grey and wobbling while idle, running out from the bubble after a click until
it's connected, solid with a travelling pulse once connected.

The map is one Canvas: node discs and icons are shapes in it (glyph_shapes), the node
widgets only take the pointer. Seven icon Canvas widgets had cost 4.6 ms of gpu a
frame and halved the frame rate; now 1.8 ms at 60 fps. The menu window is sized to
its menu.
2026-10-11 02:58:50 +02:00
server2 7bbb23d9ca control centre: pill shows only running services, struck tiles, menus close in place
The pill drops the icon of a service that isn't running (iwd, bluetoothd, the openvpn
service) and is as wide as what it shows. A tile whose service isn't running is grey
with a grey strike through its icon. Leaving a menu with the pointer fades its content
where it is and shrinks it straight into the pill; the panel no longer grows back to
its full size on the way.
2026-10-10 12:32:44 +02:00
server2 318b2a8443 control centre: menus for Wi-Fi, Bluetooth, VPN and Sound in their own window
The tile or block grows into its menu; the panel fades its content and takes the
menu's size underneath. Wi-Fi lists networks (join saved/open, disconnect, stop
iwd), Bluetooth lists devices, VPN has a switch per openvpn service, Sound has
every output with its own slider and a default picker. A second Sound slider for
the output named by extra_output in shell.conf (NR515). Screen and keyboard light
are written to sysfs directly: logind refuses a shell without a seat.
2026-10-10 12:13:34 +02:00
server2 1b571abef0 control centre: status pill top right that opens into a macOS-like panel
Wi-Fi and hotspot (iwd, never D-Bus-activated by a read), VPN (openrc openvpn.*),
Bluetooth (bluez), battery, volume, screen and keyboard light, performance mode
(platform profile + governor + EPP through doas -n), and the external GPU with the
programs using it (drm fdinfo). Icons move to glyph.rs.
2026-10-10 11:33:04 +02:00
server2 54f51c5671 AGENTS.md: full handoff for a new session
where everything lives (repo, library, skill, desktop and its Hyprland
setup), the user's ground rules, the current state (master, the three
open glass branches with benchmark numbers, what runs on the desktop),
architecture including hover, instant transport, monitors, theme and
idle pill, Hyprland 0.56 pitfalls, performance rules, develop and test
workflow, open threads
2026-10-10 03:22:56 +02:00
server2 826401e28b README: amane run works now; tools: anim counts 20-500 ms gaps
- README install: the desktop's amane CLI saves ~/.cache/amane/amane-shell,
  so amane compile + amane run is the way to start the shell
- amane-remote.sh anim: with one window per monitor, gaps of 500 ms and
  more are other islands resting, not stutter
2026-10-10 00:42:18 +02:00
server2 036b326b04 theme: react to file changes instead of polling
the Theme service waits on amane::watch_file (inotify on the folder, so
matugen's rename-over saves count) for both ~/.config/amane/theme and
shell.conf, settles 50 ms for multi-write saves, and skips writes that
change nothing. measured on the desktop: rename-over, in-place and sed -i
writes picked up in 55-68 ms (was up to 500 ms), identical rewrites
ignored, no activity while idle (was 4 reads a second). deleting the
theme file takes effect at the next start
2026-10-09 04:44:02 +02:00
server2 d04cbac8d4 AGENTS.md: theme.rs and the colour flow 2026-10-09 04:29:41 +02:00
server2 eabda748f5 colours from the wallpaper through matugen
- matugen/amane.colors: a matugen template (primary, on_primary,
  primary_container, primary_fixed, on_surface, on_surface_variant,
  outline_variant, surface_container high/normal/lowest) that skwd-wall
  renders into ~/.config/amane/theme on every new wallpaper
- theme.rs: a Theme service reads that file and shell.conf twice a
  second (matugen replaces its output, which a file watch can lose) and
  fades all ten colours together on one Animation; without a theme file
  the shell keeps its pink on purple
- the island, the idle pill and the workspace pill draw with the theme;
  white overlays (chips, tracks, hover tints) stay as they are
- shell.conf: cover_colors (true: the open media card and equalizer take
  the cover's gradient as background, accents stay the wallpaper's) and
  transition_ms (0 switches instantly), both applied without a restart
- parse: settings() and rgb(), with a test (6 pass)
- checked on the desktop with a hand-written theme file: pill, workspace
  pill and card recolour, cover_colors switches the card background live
2026-10-09 04:28:39 +02:00
server2 2870ebbd13 island: an idle pill while no player is open
the island is always there now: with no player it shows a pill with a
drawn music note and 'Nothing playing', in the cover gradient with the
pink glow. click-through, static (draws once). checked on all 4 monitors
2026-10-08 11:45:26 +02:00
server2 ecd9a8d3b0 AGENTS.md: workspace clicks use the lua dispatch, never visible(false) 2026-10-08 11:40:22 +02:00
server2 66bf25f7dd fix workspace clicks and the island stuck after a hidden start
- workspace pill: clicks did nothing. amane's Workspaces::focus sends
  'dispatch workspace N', which hyprland 0.56 with a lua config turns into
  hl.dispatch(workspace N) and rejects. dispatch the lua form the user's
  keybinds use, hl.dsp.focus({ workspace = N }), through hyprctl on its own
  thread (named workspaces with negative ids are left out)
- island: 'magic-island has no child to draw' at startup without a player,
  and the island then never appeared. hyprland 0.56 configures a layer
  surface before its first commit (seen with WAYLAND_DEBUG), so a window
  that starts visible(false) gets a size, amane runs the empty view, logs,
  and waits for frame callbacks an undrawn surface never gets. with no
  player the island is now an empty click-through window instead
- verified on the desktop: 0 'no child' lines, island draws at startup and
  shows on all 4 monitors when a player starts
2026-10-08 11:38:16 +02:00
server2 c749ca9d9d AGENTS.md: workspaces.rs, cover loader at 250 ms 2026-10-08 02:30:27 +02:00
server2 9329d250f6 workspaces: a pill top left on every monitor with its workspaces
- one window per monitor (namespace magic-workspaces, Overlay like the
  island), showing that monitor's hyprland workspaces in the island's
  look: cover gradient, pink glow
- focused workspace pink, shown-elsewhere soft pink, empty ones dim;
  hover eases in (one at a time), a click switches workspace
- special workspaces are skipped; name-only ones show their first letter
- event-driven through Workspaces: redraws only on hyprland events and
  hover
2026-10-08 02:09:25 +02:00
server2 ddaef1f805 tools: start leaves a shell it didn't start alone
the user may run amane from a terminal; start used to crash into it with
'amane is already running'. now it says which pid runs and stops
2026-10-08 01:37:10 +02:00
server2 9d6a13f876 island: transport buttons answer at once
- play/pause flips its icon (card and pill) the moment it's clicked; the
  clicked state is shown until the player has answered
- after play/pause, next or previous, Media is read again at 150 and
  600 ms instead of waiting for its once-a-second poll, so title, time
  and play state follow within a fraction of a second
- the cover loader checks 4 times a second instead of once
- ipc: island play-pause, the same path as a click (keybinds, tests)
2026-10-08 01:37:10 +02:00
server2 e847cbde73 tools: pick the live hyprland instance
$XDG_RUNTIME_DIR/hypr keeps folders of dead instances, and the newest one
isn't always alive; take the newest with a .socket.sock
2026-10-08 01:25:33 +02:00
server2 7844a98828 island: card on one monitor, live bars only on the focused one
- the card opens on the monitor that was clicked (keybinds: the focused
  monitor); the others keep their pill. moving the card to another monitor
  restarts its open animation there
- only the focused monitor's window (and the one with the card) reads
  Spectrum, so the other pills show still bars and rest
- hover lights only the pill under the pointer
- measured with music on 3 monitors: pill 10.7% of a core (was 27.5%),
  open card 20.7% (was 58%), ~62 frames a second in total, 0-1 slow
  frames per open/close (was 7-14), back to one island's cost
2026-10-08 01:25:33 +02:00
server2 967ff37b78 spectrum: kill a cava left by an earlier shell on start
stopping the shell leaves its cava running (parent 1), reading on from a
closed pipe and ignoring SIGTERM; every restart while music played leaked
one. on start, pkill -KILL -f our cava.conf before starting our own
2026-10-08 01:25:33 +02:00
server2 85416b501e island: on every monitor (experiment)
window_per_monitor with the same view: every monitor shows the island,
all sharing one state (open, hover, player). measured with music on 3
monitors: 180 frames a second in total, pill 27% of a core (was 9%),
open card 58% (was 21%), gpu 1.4 / 3.0 ms per frame each; open/close
drops 7-14 of ~175 frames (was 0-1)
2026-10-06 19:09:18 +02:00
server2 0f6fb88e58 tools: start waits for the old shell to exit
an old shell can take a few seconds to let go of amane's socket, and the
new one then panics with 'amane is already running'; wait up to 5 s
2026-10-06 19:09:11 +02:00
server2 dfc9a19860 island: the pill gets the card's faint pink glow
one pink glow for the pill and the open card (opacity 0.3, blur 22),
0.7 while the pill is hovered; the dark drop shadow is gone. same single
shadow as before, so no extra cost (pill 1.3 ms gpu)
2026-10-06 16:59:59 +02:00
server2 b74e727305 island: glowing card, hover on eq bands and time bar, bold transport
- the open card keeps a faint pink glow: the pill's shadow blends from a
  dark drop shadow to a centred pink glow (opacity 0.3, blur 22, inside
  the window margin); measured 2.95 ms gpu with the card open, as before
- eq bands: hovered, the track widens 4 px and brightens, the knob grows
  25% with a full pink ring, the frequency label turns pink
- time bar: hovered, the track thickens 4 px and brightens, the knob grows
- previous/play-pause/next: no halo, circle or growth any more; they go
  bold instead (an outline of the glyph's own colour, 0 to 2 px; pause bars
  widen), and glowing() is gone
2026-10-06 16:58:05 +02:00
server2 fc90260d5d island: animated hover on the island and every button
- each hovered spot eases a highlight in and out over 220 ms
- pill: widens 10 px and its drop shadow turns into a centred pink glow
  (the same shadow the pill already had, so no extra cost)
- previous/next: swell 12%, icon turns pink, pink halo; play/pause swells
  10%, halo, its pink warms toward white
- chips and presets brighten and grow 4-6%, dropdown rows slide right
- halos only exist while hovered (a shadow is two gpu layers per frame)
- one button lit at a time, and highlights reset when the card or the
  dropdown changes: amane matches hover targets by position in the frame,
  so a target that disappears never hears the pointer leave
2026-10-06 16:38:18 +02:00
server2 c228f40154 remove src.before-test, the pre-island hello-world backup 2026-10-06 15:45:00 +02:00
server2 a8cd23546d docs: README, AGENTS.md, test tools in tools/
- README: features, layout, requirements, install, IPC, runtime files, limits
- AGENTS.md: the user's ground rules (branch + approval, never touch real
  players' sound), architecture, measured performance rules, type-check
  and test loop, desktop test driver and its pitfalls, open threads
- tools/: amane-remote.sh and fake_mpris.py, so the test loop doesn't
  depend on the Hermes skill
- .gitignore: the Cargo files amane generates
2026-10-06 15:41:48 +02:00
server2 c55e4cfbed island: cover gradient background, unmirrored pill levels
- the pill, the card and the fade veils share one 150-degree gradient from
  the cover's palette (most common, second, background), each darkened to
  a fixed brightness so white text stays readable; veils span the whole
  shape so their gradient lines up with the backdrop's
- measured on the desktop: card open 3.1 ms gpu (solid fill was ~3), pill
  1.7 ms (was 1.0), open/close animation unchanged (1 and 0 slow frames)
- pill levels: lows left, highs right, no mirroring; every bar still grows
  up and down from the middle line
2026-10-06 15:25:13 +02:00
server2 e7ff054fb1 island: open in two phases, live levels in the pill
- one linear timeline: the pill fades out, the empty shape grows, then the
  card fades in on the settled shape (and backwards on close)
- fades use a surface-coloured veil instead of .opacity(), and the shape
  has no clip, so neither costs a gpu layer
- measured on the desktop: open went from 11 frames over 20 ms to 1,
  close from 4 to 0
- the spectrum capture runs whenever the shown player plays, and the pill
  shows it as 7 mirrored, glowing bars (about 9% of one core while playing)
2026-10-06 03:44:00 +02:00
server2 93c57b93c4 Initial 2026-10-06 03:28:55 +02:00