Skip to content

feat(tray): engine dropdown, app-fix chips with chimes, Pause Wind (0.18.0) - #316

Merged
Maxaubert merged 73 commits into
mainfrom
feat/315-tray-tools
Oct 2, 2026
Merged

Maxaubert merged 73 commits into
mainfrom
feat/315-tray-tools

Conversation

@Maxaubert

Copy link
Copy Markdown
Owner

Closes #315.

Stacks on #314 (tray flyout, #313). Merge order: #312, then #314, then this PR. Targets main so the diff includes #314 until it merges.

What

  • Flyout engine dropdown: per-window-kind engine (Game / Blurred window / Desktop / Other), hot session change identical to Settings.
  • Listen-and-chime chips: Mouse lock and Pass keys. Click, go to the app, the fix toggles for it, rising chime when added and falling chime when removed; persists to ini and profile.
  • Pause Wind chip (runtime only; TrayShared::paused + Local\Wind_TrayCommand).
  • Settings > Tray menu lists the four new items (off by default).
  • Custom synthesized enable/disable chimes (no Windows sounds, no Sonara sounds), embedded in WindTray, played via PlaySound.
  • Docs: spec table, architecture tray chapter, CLAUDE.md notes, assets/sounds/README.md. Version 0.18.0.

Chime candidates preview

Open assets/sounds/candidates/index.html (glassy, marimba, airy pluck pairs). Default is assets/sounds/chime_on.wav / chime_off.wav.

Gates

  • build.bat test: 527 test cases, 527 passed (192075 assertions)
  • build.bat check, build.bat (app), build.bat config: all exit 0
  • npx playwright test (ui): 105 passed
  • node tools/make_chimes.mjs --check: ok

Unsigned until SignPath enrolment.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG

Maxaubert and others added 30 commits October 1, 2026 17:55
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Settings.svelte rebuilt on the shell components: changes call setConfig at once,
keybind captures call setConfigPersist, the capsule counts values vs saved,
Save/Discard drive saveSession/discardSession. Close (Save / Discard / Keep for
this session), Quit Wind and profile-switch prompts; MPO and engine restart flows
kept. Profiles control moves to ui/src/general; draft recovery path removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Host logs launch -> NavigationCompleted and launch -> first paint (page posts
"ready" after two frames). Onboarding is a lazy chunk; the banner image loads
after first paint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Old vs new WindConfig.exe launch-to-first-paint, gate state and an honest
banner comment. Lazy loading gives about 30 ms faster navigation, no first-paint change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Skip a11y.spec.js and settings.spec.js (pre-redesign UI, rewritten in Task 12)
so the Playwright gate is green: 47 passed, 72 skipped, 0 failed. Correct the
start-up doc: no first-paint gain, navigation only, numbers taken at 63b4075
with a reconstructed old build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Rewrite settings.spec.js and a11y.spec.js for the new shell (groups and
navigation, theme cycle, light theme, focus order, keybind rules, labelled
controls on every page, dialogs, capsule, live region). Un-skip both; the
Playwright gate is now 81 passed, 0 skipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Aurora set through an inline background on a real element (url() in a custom property resolved
against dist/assets), one keycap per key with '+' separators and short Mouse names, filled ghost
Add key with icon, 62px rows, 13.5px titles and 12.5px descriptions, 220px sliders with unit
readout, capsule centred on the main area, sidebar icons at their requested size, version offset.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Title bar logo and window glyphs sized with svg.ic specificity (the base .wnd svg.ic rule was
overriding them), slider value gap, version offset, 24px gap under the banner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Task 13 verification: built screenshots saved next to the reference. No CSS change: rendered in the
same Chromium, the mock and the built UI differ by 0.0 (sidebar, capsule), 0.02 (title bar) and
under 1.4 mean grey levels (banner, rows), so the weight and brightness gaps against the reference
PNG are renderer differences, not token differences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Theme glyph in the title bar uses the mockup's 14px / 1.5 stroke; refreshed built-dark and built-light screenshots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Maxaubert and others added 24 commits October 2, 2026 01:29
…em reads hollow

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Hover fades 120 ms, press scale 0.97, chip ON/OFF cross-fade 150 ms, open fade 120 ms,
driven by a 16 ms timer only while animating; respects SPI_GETCLIENTAREAANIMATION.
Focus ring uses the Settings focus colour and shows only after Tab/arrows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…r flip, at the right edge (#313)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…e mark by the fps (#313)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…l session change (#315)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…lock (#315)

Tray block version 2: fgCategory and the last real foreground exe (seqlock,
activation count) published from an EVENT_SYSTEM_FOREGROUND hook, filtered so
the taskbar, tray flyouts, alt-tab, Start and Wind's own windows never count.
Pause Wind: the tray sets TrayShared::paused and signals Local\Wind_TrayCommand
(added to the idle wait set); hooks stop swallowing and release held keys, zoom
input is gated and a live zoom is brought back to 1x. Pure rules in
tray_publish.h with doctest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…a PlaySound (#315)

tools/make_chimes.mjs writes deterministic 48 kHz mono WAVs (rising on, falling off) plus three
candidate pairs and a preview page; WindTray embeds them as WAVE resources.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…use chip (#315)

Engine chip opens a captioned list (Auto / Transform / Render) for the kind of window that was in
front; a pick is a session change written to the live ini only, and the chip is disabled with a
"Main engine: X" list while the main engine is not Auto. Mouse lock and Pass keys chips listen for
the next real foreground app (chip and tray icon pulse, 20 s silent timeout, re-click cancels),
toggle the exe in lockApps / noSwallowApps in the live ini and the active profile, and play the
rising or falling chime. Pause chip drives the shared block; the tray icon gains pulse and pause
badges. Chips wrap to a second row after four. Render test gains --tools, --listen, --paused,
--engine-list, --category, --model and an --icon-test strip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
… Wind (#315)

Four new Toggles rows (off by default) with bare line icons matching the flyout glyphs and a
description each; trayModel mirrors the item keys in src/tray_items.cpp. Playwright updated for the
new rows and a new test covers defaults, icons, descriptions and the written trayToggles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
… Pass keys and Pause (#315)

- The engine item is a wide dropdown chip (two slots, value text, chevron) that picks the main
  engine `model` (Auto, Render, Transform, System, as in Settings). A pick writes the live ini as a
  session change, drops session.keep and restarts Wind with no prompt; a failed relaunch reverts.
- Chip rows hold at most four slots and every row, the last partial one included, is centred.
- Remove Mouse lock, Pass keys and Pause Wind with the listen state machine, icon pulse and badge,
  core pause gating, Wind_TrayCommand, fgCategory publishing, chimes and their tests. TrayShared is
  back to version 1. Unknown keys left in a user's ini are dropped silently.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…own and centred rows (#315)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…ckup v02 (#315)

Toggles become one stretched segmented bar (3, 2 or 1 fill the width, 1 px separators, outer
corners only), the engine dropdown sits 8 DIP below it with its list as wide as the field, no
zoom readout. Removes the centred chip rows (LayoutChips, ChipNeighbor) and their tests; adds
model tests for the new geometry, hit testing, list alignment and keyboard navigation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…ron, list card, row metrics)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
… edges becomes Keep cursor centred (#315)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
@Maxaubert
Maxaubert merged commit 3dace4b into main Oct 2, 2026
1 check passed
Maxaubert added a commit that referenced this pull request Oct 2, 2026
@Maxaubert
Maxaubert deleted the feat/315-tray-tools branch October 2, 2026 19:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tray: engine dropdown, app fixes manager, pause

1 participant