enBoxer/examples/profile.yaml
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

148 lines
3.3 KiB
YAML

# Copy to ~/.config/enboxer/profile.yaml and edit.
# Keys use Mod+Key (Alt+G, Shift+F3). Letters are case-insensitive.
name: esdf-team
client: wow-retail
slots: 2
# Hyprland window match (regex). Wine/WoW class is often wow.exe or the wine prefix name.
window_match:
class: "(?i)wow|warcraft"
title: null
# Keys that are NEVER intercepted. Empty = no skip list.
# ESDF movement stays on the primary even if you later add a map for those letters.
passthrough: ["e", "s", "d", "f"]
# maps = only keys listed under `maps` (rest stay on the front window)
# mirror = clone keys to the other clients (passthrough still skipped)
# off = no intercept; the front window gets everything
mode_default: maps
# Optional: limit which keys mirror-mode clones. Empty = letters, digits, F-keys, etc.
repeater:
enabled: false
keys: []
game_binds:
interact: "g"
ctm_on: "Shift+F3"
ctm_off: "Shift+F4"
assist: "Shift+F2"
follow: "Shift+F1"
interact:
# standard: CTM on → IWT → wait → CTM off
# auto: CTM on → IWT (CTM stays on)
# hold: CTM on → IWT on press; CTM off on release
style: standard
walk_delay_ms: 2500
session_hotkeys:
mode_cycle: "Shift+Alt+M"
swap_next: "Ctrl+grave"
swap_prev: "Ctrl+Shift+grave"
focus_next: "Ctrl+Shift+N"
focus_prev: "Ctrl+Shift+P"
focus_main: "Ctrl+F1"
reset_all: "Ctrl+Shift+R"
stay_on_top: "Ctrl+Shift+T"
mouse_follow: "Ctrl+Shift+F"
mouse_broadcast: "Ctrl+Shift+B"
characters:
- slot: 1
name: Main
assist_key: "Shift+F2"
follow_key: "Shift+F1"
- slot: 2
name: Alt
assist_key: "F9"
follow_key: "F10"
groups:
alts:
slots: [2]
maps:
- name: bar_1
hotkey: "1"
steps:
- bind: assist
target: others
- key: "1"
target: all
- name: bar_2
hotkey: "2"
steps:
- bind: assist
target: others
- key: "2"
target: all
- name: follow_me
hotkey: "Alt+F"
steps:
- bind: follow
target: others
- name: assist_me
hotkey: "Alt+A"
steps:
- bind: assist
target: others
- name: loot
hotkey: "Alt+G"
steps:
- bind: assist
target: others
- bind: ctm_on
target: others
- bind: interact
target: others
- delay_ms: 2500
- bind: ctm_off
target: others
- name: interact_hold
hotkey: "Alt+H"
hold: true
steps:
- bind: ctm_on
target: others
- bind: interact
target: others
release_steps:
- bind: ctm_off
target: others
- name: rez_cycle
# Each press picks the next slot in order (1..=N, then wraps). State
# lives on the engine, keyed by this map name, so a second `rr`
# map keeps its own cursor.
hotkey: "Alt+R"
steps:
- key: "F8"
target: round_robin
# Window layout (pixels). Generate from the Layout page, then Save and Apply.
layout:
preset: main_strip
one_row: true
main_at_bottom: false
auto_apply: false
monitor: ""
slots: []
# Viewer sits on the current primary. Hover + pass_through sends keys/clicks to source_slot only.
video_fx:
- name: alt_party
enabled: false
source_slot: 2
source: { x: 0.0, y: 0.0, w: 0.40, h: 0.40 }
viewer: { x: 0.02, y: 0.02, w: 0.28, h: 0.28 }
pass_through: true
fps: 12