Layout wizard (T7):
- App::layout_canvas with monitor backgrounds, click-to-select, draggable tiles
- borderless Hyprland window_rule on run
- App::refresh_monitors + Refresh monitors button; monitors cache for canvas sync
Routing extras (T8, T13, T14):
- clipboard IPC verb (wl-paste / xclip -> Ctrl+V to non-leader slots)
- mirror-mode mouse click broadcast via hypr::deliver_click
- round_robin / rr bind target rotates through ALL slots (leader included)
Slot overlay (T9 real):
- src/wayland_layer.rs: zwlr_layer_shell_v1 client, shm buffers, 3x5 bitmap
digit glyphs, wl_pointer click -> swap <slot>
- gated ENBOXER_ENABLE_OVERLAY=1; cargo test does not connect
Covered-window VFX capture (T10 real):
- src/toplevel_export.rs: zwlr_export_dmabuf_unstable_v1 client
- ARGB8888 / XRGB8888 format negotiation, synthetic-PNG fallback for tests
- gated ENBOXER_ENABLE_TOPLEVEL=1; gbm_bo_map upgrade documented
Teams + Lutris launcher (T15):
- src/team.rs: Team, list_teams, teams_dir, current_team
- src/lutris.rs: LutrisGame parser, load_all with bad-YAML tolerance
- src/launcher.rs: SpawnPlan merges Lutris config + per-character wine-prefix
- GUI: Teams menu (New / Switch / Refresh / Show / Delete) + Launch menu
- Lutris picker visible only in New-team flow; direct Wine spawn, no lutris CLI
Tests: 89 passed; 0 failed (up from 24).
Clippy: clean with -D warnings.
Safety:
- No live hyprctl dispatch that moves / resizes / pins / closes the session.
- All Wayland paths feature-gated; cargo test does not connect.
- apply_layout still gated by allow_layout + confirm_apply.
Files: 14 modified + 6 new (src/{launcher,lutris,overlay,team,toplevel_export,wayland_layer}.rs)
Diff: +1570 / -29
3.2 KiB
3.2 KiB
Changelog
0.1.0 — unreleased
- Rust CLI daemon:
enboxer run|press|status|macros|doctor - YAML profile: maps, targets (
current/others/all/ groups),game_binds - Configurable
passthrough(empty by default; example profile uses ESDF) - Hyprland 0.56 Lua binds installed only while a managed game or VFX overlay is focused
- Key delivery via
hl.dsp.send_shortcut/send_key_state(no game injection) - Stock loot map: assist → CTM on → Interact with Target once → delay → CTM off
- Video FX:
grimregion capture, overlay viewer, hover pass-through to source slot - Unit tests for hotkey parse, passthrough, targets, loot sequence, example profile load
- Bind IPC line no longer duplicated
ipc(Hyprland hotkeys actually reach the daemon) - Video FX overlay is
mpv(--wayland-app-id=enboxer-vfx) with JSON reload;grimcapture enboxer runclears binds on ctrl-c; emptywindow_matchmatches nothing- Live check:
send_shortcutto an unfocused XWayland window; overlay window classenboxer-vfx - Per-character
assist_key/follow_key; map steps usingbind: assist|followresolve to the current main's keys - Layout wizard
borderlesstoggle installs a Hyprlandwindow_rule(rounding 0, border_size 0) onrun - Layout page: drag canvas over the monitor rectangle; tile moves clamp to the monitor bounds
- T8: clipboard IPC verb
clipboardreadswl-paste/xclipand delivers Ctrl+V to every non-leader captured slot; GUI button on Session page; routing plan unit-tested - T11: named-profiles list in File menu (
Load named…submenu) with Refresh; listing helper unit-tested against a tempdir - T12: unit test for
type_to_othersrouting (others_clientshelper, excludes leader, per-char × per-slot plan) and forapply_layoutshort-circuiting whenENBOXER_ALLOW_LAYOUTis unset - T9 (real):
src/wayland_layer.rs—zwlr_layer_shell_v1Wayland client with shm-backed buffers, 3×5 bitmap digit glyphs,wl_pointerclick routing; per-slotOverlayHandleviaOverlayHubinsession::run. Live path gated behindENBOXER_ENABLE_OVERLAY=1;cargo testdoes not connect to Wayland - T10 (real):
src/toplevel_export.rs—zwlr_export_dmabuf_unstable_v1Wayland client; per-frame format negotiation (ARGB8888 / XRGB8888), synthetic-PNG fallback for tests. Live path gated behindENBOXER_ENABLE_TOPLEVEL=1;gbm_bo_mapis documented as the upgrade step for actual pixel reads - T13: mirror-mode mouse click broadcast —
hypr::deliver_clickposts compositor pointer events to every non-leader captured slot; press-and-hold guard deferred - T14: round-robin bind target (
round_robin/rr) — rotates through ALL slots including the leader, in slot-number order, wrapping; per-map cursor - T15: Teams + Lutris launcher.
src/team.rs(Team, list_teams, teams_dir, current_team),src/lutris.rs(LutrisGame parser,load_allwith bad-YAML tolerance),src/launcher.rs(SpawnPlan merging Lutris config with per-character wine-prefix override). GUI: Teams menu (New / Switch / Refresh / Show / Delete) and Launch menu (per-character + Launch all); Lutris picker visible only in the New-team flow. Direct Wine spawn — never callslutrisCLI