From f087984526c28ec5a1ad4386e737825bd0617c18 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 1 Sep 2026 02:24:29 +0000 Subject: [PATCH] Add AntiMicroX plumbing for a universal controller-combo hotkey MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wires up the infrastructure for RetroArch's own hotkeys (global across every libretro core already) to be matched by an equivalent for Dolphin/PCSX2/Azahar, none of which support gamepad-bound hotkeys natively (confirmed open feature requests: PCSX2/pcsx2#1082, azahar-emu/azahar#722; Dolphin's are hardcoded to keyboard only). AntiMicroX watches Wolf's virtual gamepad directly — a real uinput device per Wolf's own "inputtino" docs, not a proprietary channel — and injects whatever keyboard shortcut the focused emulator actually expects. Mechanism: GoW's own stock Sway config (baked into the esde/retroarch images) has a deliberate first-line extension point, `include /home/retro/.config/sway/custom-cfg` (confirmed by reading it directly out of a running container). Since /home/retro/.config is already the retro-home mount added earlier this session, writing a file to $GAME_STORAGE_DIR/retro-home/sway/custom-cfg on the host lands exactly there in both containers — zero changes to GoW's own image or scripts needed. Deliberately scoped to plumbing only: download AntiMicroX (reusing the _wolf_download_emulator_appimage helper added for PCSX2/Dolphin), add the Sway launch hook (floating window, not hidden, so it's reachable through the Moonlight stream), and document the actual one-time setup flow in the generated README. The button mapping itself, including AntiMicroX's own per-application Auto Profile switching, is built through its real GUI rather than a hand-authored .gamecontroller.amgp this repo can't verify blind. Marked experimental throughout (install prompt defaults to n, DRY-RUN summary, README) — this is unverified against a live session. --- services/wolf.sh | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/services/wolf.sh b/services/wolf.sh index 5cf6aa4..5ebde07 100644 --- a/services/wolf.sh +++ b/services/wolf.sh @@ -278,6 +278,9 @@ EOF echo " - Create bios/ + retroarch/{cores,shaders,overlays}/ on the game drive and pre-download RetroArch cores (~1.5 GB)" echo " - Offer to auto-download standalone emulator AppImages into emulators/:" echo " Azahar (3DS), PCSX2 (PS2), Dolphin (GameCube/Wii — unofficial community build)" + echo " - Offer to set up AntiMicroX (universal controller-combo hotkey, experimental —" + echo " downloads it and wires a Sway launch hook; the button mapping itself is" + echo " built later through AntiMicroX's own GUI)" return 0 fi @@ -840,6 +843,72 @@ UDEV _wolf_download_emulator_appimage \ "Dolphin (GameCube/Wii, community AppImage build)" "pkgforge-dev/Dolphin-emu-AppImage" "*[Dd]olphin*.AppImage" "$_EMU_DIR" + # ── Optional: AntiMicroX for a universal controller-combo hotkey ───────── + # RetroArch's own hotkeys (Settings -> Input -> Input Hotkey Binds) are + # global across every libretro core, but Dolphin/PCSX2/Azahar each run as + # standalone apps ES-DE launches directly and none of the three support + # gamepad-bound hotkeys natively (confirmed open feature requests: + # PCSX2/pcsx2#1082, azahar-emu/azahar#722; Dolphin's hotkeys are + # hardcoded to keyboard only). AntiMicroX bridges this by watching the + # real controller device (Wolf's virtual gamepad is a genuine uinput + # device — see games-on-whales/wolf's own docs on "inputtino" — so this + # is a real input device AntiMicroX can open, not a proprietary channel) + # and injecting whatever keyboard shortcut each app actually expects. + # + # GoW's own stock Sway config (/cfg/sway/config, baked into the esde and + # retroarch images — same one both apps' `launcher()` call copies) has a + # deliberate extension point at its very first line: + # include /home/retro/.config/sway/custom-cfg + # Since /home/retro/.config is already our own retro-home mount (see the + # esde/retroarch CATALOG mounts above), just writing a file to + # $GAME_STORAGE_DIR/retro-home/sway/custom-cfg on the host lands exactly + # there in the container, for both apps, with zero changes to GoW's own + # image or scripts needed. + # + # This only wires up the plumbing (download AntiMicroX, launch it + # visibly as a floating window every session). The actual button + # mapping — including AntiMicroX's own per-application "Auto Profile" + # switching (Options -> Settings -> Auto Profile in its GUI) needed to + # send a different key to each emulator from the same physical combo — + # has to be built once through AntiMicroX's own GUI while it's running; + # hand-authoring its .gamecontroller.amgp profile XML blind isn't + # something to guess at. Whatever gets saved there persists automatically + # (same retro-home mount), so it's a one-time setup. + local _AMX_DIR="$GAME_STORAGE_DIR/retro-home/antimicrox" + local _SWAY_CFG_DIR="$GAME_STORAGE_DIR/retro-home/sway" + mkdir -p "$_AMX_DIR" "$_SWAY_CFG_DIR" + + echo "" + log_info "AntiMicroX lets you map one controller combo (e.g. Select+Start) to a" + log_info "different real keyboard shortcut per emulator — RetroArch's own hotkeys" + log_info "already cover every RetroArch-driven system; this is for Dolphin/PCSX2/" + log_info "Azahar, none of which support gamepad hotkeys natively. EXPERIMENTAL:" + log_info "the actual button mapping has to be built once through its own GUI." + local _GET_AMX="" + prompt_yn "Set up AntiMicroX for a universal controller hotkey? (y/n):" "n" _GET_AMX + if [[ "$_GET_AMX" =~ ^[Yy]$ ]]; then + _wolf_download_emulator_appimage \ + "AntiMicroX" "AntiMicroX/antimicrox" "antimicrox*.AppImage" "$_AMX_DIR" + local _AMX_APP + _AMX_APP=$(ls "$_AMX_DIR"/antimicrox*.AppImage 2>/dev/null | head -1) + if [[ -n "$_AMX_APP" ]]; then + backup_if_exists "$_SWAY_CFG_DIR/custom-cfg" + cat > "$_SWAY_CFG_DIR/custom-cfg" << CFGEOF +# Written by services/wolf.sh — AntiMicroX: universal controller-combo hotkey. +# Launched as a normal floating window (not hidden) so its own GUI is +# reachable through the Moonlight stream for one-time profile setup — +# see ~/docker/wolf/README.md for how to build the actual button mapping. +for_window [app_id="antimicrox"] floating enable, resize set 480 360, move position 20 20 +exec /home/retro/.config/antimicrox/$(basename "$_AMX_APP") --appimage-extract-and-run & +CFGEOF + chown -R 1000:1000 "$_AMX_DIR" "$_SWAY_CFG_DIR" 2>/dev/null || true + log_success "AntiMicroX will launch (as a small floating window) alongside ES-DE/RetroArch." + log_info "First session: open its window, map your combo, save — it persists from then on." + else + log_warning "AntiMicroX download didn't produce a usable AppImage — skipping the Sway launch hook." + fi + fi + # ── App selection ───────────────────────────────────────────────────────── echo "" echo "═══════════════════════════════════════════════════════" @@ -3153,6 +3222,38 @@ auto-detected. Missing ones get offered again on a fresh install (\`sudo ./setup.sh wolf\`); to grab just one by hand, download its AppImage into \`emulators/\`, \`chmod +x\` it. +## AntiMicroX — universal controller-combo hotkey (experimental) +RetroArch's own hotkeys (Settings -> Input -> Input Hotkey Binds) already +cover every RetroArch-driven system, but Dolphin/PCSX2/Azahar don't support +gamepad-bound hotkeys natively — AntiMicroX watches the controller directly +and injects whatever keyboard shortcut each app actually expects, so one +physical combo (e.g. hold Select, press Start) can mean "exit" — or save +state, or anything else — everywhere. + +If you said yes to the AntiMicroX prompt during install, it launches +automatically as a small floating window every time ES-DE or RetroArch +starts. **Building the actual mapping is a one-time step, done through its +own GUI, not something this installer can pre-configure:** + +1. Start ES-DE (or RetroArch) from Moonlight as normal — AntiMicroX's small + window appears floating in the corner alongside it. +2. In AntiMicroX: set up your controller under its device list, then create + a profile — click a button in its UI, press the real combo on your + gamepad, assign it the keyboard key the target emulator expects for that + action (see each emulator's own Settings -> Input/Hotkeys for its actual + bindings — Dolphin/PCSX2 defaults are commonly F1-F4-range keys). +3. For a **different translation per emulator** from the same physical + combo, use AntiMicroX's own **Options -> Settings -> Auto Profile** — + add a rule per application (matched by window class/title) so e.g. + Select+Start sends Esc when Dolphin has focus but F4 when RetroArch does. +4. Save. It's written under \`~/.config/antimicrox/\` inside the container, + which is the same \`retro-home/\` mount everything else here persists + through — it'll auto-load on every future session with no further setup. + +To change the mapping later, just reopen AntiMicroX the same way. To remove +it entirely, delete \`retro-home/sway/custom-cfg\` and \`retro-home/antimicrox/\` +on the host and re-run \`sudo ./setup.sh wolf\`. + ## Troubleshooting: app exits immediately ("Permission denied") If a launcher (Steam, etc.) closes the moment it opens, its Wolf-managed home dir has root-owned files the in-container user (uid 1000) can't write. Fix: