enBoxer/CHANGELOG.md
en 9d2f51685d Finish the project (T7..T15): layout wizard, broadcast, overlay, dmabuf, teams
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
2026-09-15 17:18:37 +02:00

3.2 KiB
Raw Blame History

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: grim region 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; grim capture
  • enboxer run clears binds on ctrl-c; empty window_match matches nothing
  • Live check: send_shortcut to an unfocused XWayland window; overlay window class enboxer-vfx
  • Per-character assist_key / follow_key; map steps using bind: assist|follow resolve to the current main's keys
  • Layout wizard borderless toggle installs a Hyprland window_rule (rounding 0, border_size 0) on run
  • Layout page: drag canvas over the monitor rectangle; tile moves clamp to the monitor bounds
  • T8: clipboard IPC verb clipboard reads wl-paste / xclip and 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_others routing (others_clients helper, excludes leader, per-char × per-slot plan) and for apply_layout short-circuiting when ENBOXER_ALLOW_LAYOUT is unset
  • T9 (real): src/wayland_layer.rszwlr_layer_shell_v1 Wayland client with shm-backed buffers, 3×5 bitmap digit glyphs, wl_pointer click routing; per-slot OverlayHandle via OverlayHub in session::run. Live path gated behind ENBOXER_ENABLE_OVERLAY=1; cargo test does not connect to Wayland
  • T10 (real): src/toplevel_export.rszwlr_export_dmabuf_unstable_v1 Wayland client; per-frame format negotiation (ARGB8888 / XRGB8888), synthetic-PNG fallback for tests. Live path gated behind ENBOXER_ENABLE_TOPLEVEL=1; gbm_bo_map is documented as the upgrade step for actual pixel reads
  • T13: mirror-mode mouse click broadcast — hypr::deliver_click posts 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_all with 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 calls lutris CLI