5.6 KiB
Goals
This is what the project is for. If a change fights this file, the change is wrong.
enBoxer is a Rust rewrite, for Arch Linux + Hyprland, of a Windows multibox controller, then extras on top. It lives in ~/git/enBoxer and ships to https://gitea.nettsi.de/en/enBoxer over HTTPS only (never SSH).
The user plays several World of Warcraft clients (Forever when it exists; until then retail-shaped macros). They move with ESDF, not WASD. They do not want the game to think they are botting: no DLL, no memory inject, no addon required in v1. Keys and clicks only. They will bind macros in-game themselves.
They do not want to test until they have to. Agents must not crash the Hyprland session: no live hyprctl dispatch that floats, moves, resizes, pins, or closes the user’s windows. Layout apply is opt-in (ENBOXER_ALLOW_LAYOUT=1 plus a GUI confirm). Do not launch Steam or unrelated programs.
Rewrite first (the original app)
That Windows app is a GUI with a window layout wizard. enBoxer must be the same kind of program, not a YAML daemon with a thin panel bolted on.
Control panel
- One native GUI (
enboxerwith no args). Menus, not only CLI. - File: save / reload / named profiles.
- Session: start/stop routing, three modes, capture list, passthrough, game binds.
- Layout: the important missing piece from the first GUI pass — see below.
- Maps: hotkeys and steps.
- Video FX: source and viewer rectangles.
- Macros: text to bind in WoW.
Window layout (from the source app’s wizard)
- Choose how many clients.
- Presets: all stacked, same-size grid, one large main + a strip of minions.
- Options: main at bottom, one row for small windows, stay-on-top / pin, which monitor.
- Per-slot x y w h (pixels), editable after generate.
- Drag-equivalent: Generate, Capture current positions, Save and Apply.
- Apply only when the user allows window moves (see Safety).
- Swap a minion into the main tile (Make main / swap next / per-slot swap hotkeys).
- Focus next / previous / main / slot N.
- Reset all to the saved layout.
- Auto-capture matching game windows by class/title regex (do not grab the whole desktop; empty match = match nothing).
Key delivery (rewrite, then the extra)
The Windows app cloned keys by posting messages and/or swapping which window was in front. enBoxer routes instead:
- maps — only configured hotkeys are intercepted and sent to
current/others/all/ groups. Everything else goes to the front client. - mirror — front client still gets the real key; the same key is cloned to the other game windows.
passthrough(ESDF by default, or empty, or WASD — user’s list, never hardcoded) is not cloned. - off — no intercept. All keys go to the front window. Mode-toggle still works.
Toggle: Shift+Alt+M (configurable) and GUI. Routing off when alt-tabbed to a non-game window. The machine is a normal PC.
Keys are Hyprland compositor events (send_shortcut / send_key_state). Wine on XWayland (usual WoW) accepts them unfocused. Native Wayland / winewayland: brief focus, send, restore. Not a physical /dev/input keyboard; not process injection.
Mouse click clone (optional): relative to each client. Do not leave the cursor stranded.
Interact / loot (on top of routing)
One press, not spam. Assist others → Click-to-Move on → Interact with Target once → wait walk_delay_ms → CTM off. Hold and auto styles exist. Macros: docs/MACROS.md. No addon until Forever exists and we know the API.
Extras on top of the rewrite
Video FX (live crop)
The user must be able to set:
- Source: which other client, which rectangle, what size.
- Viewer: where that crop is drawn on the primary, what size.
- Fractions
0–1of that window, or pixels if any value > 1. GUI Pick via slurp. - While the mouse is over the viewer: clicks and keys go only to that source, not to the primary and not to the rest of the team.
Today capture is grim (visible pixels) + mpv overlay. Covered/stacked sources need compositor window-export (hyprland-toplevel-export). Until that exists, keep the source on a visible output. Do not claim grim is good enough for a stacked layout.
Other extras (wanted, not all shipped)
- Named profiles (multiple teams).
- Type/clipboard broadcast to other clients (passwords,
/commands) without swapping windows. - Slot-number overlay on the layout (click to make main), like the source app.
- Borderless game windows via Hyprland rules, not inject.
- Follow/assist macros that follow who is currently main after a swap.
- Forever client check when that game exists (lean retail macros until proven otherwise).
Safety (non-negotiable)
- Default
enboxer run: keys only. No float/move/resize/pin. ENBOXER_ALLOW_LAYOUT=1required for apply/swap-geometry/reset.- GUI: checkbox “Allow moving game windows”, then a confirm before Apply.
- Example profile: Video FX off, layout tiles empty,
auto_apply: false. - Agents: unit tests only against Hyprland. No live dispatch that rearranges the user’s session. No Steam.
Done when
- GUI can configure all of the above without hand-editing YAML (YAML remains the store).
- Layout wizard + apply works when the user opts in, without off-monitor garbage.
- Maps / mirror / off work; ESDF passthrough is configurable.
- Video FX source/viewer/size + hover click and key pass-through work for visible sources; export for hidden sources is the remaining capture gap.
- No inject, no required addon, HTTPS remote is
en/enBoxer.