diff --git a/services/wolf.sh b/services/wolf.sh index 2e7c322..416d29d 100644 --- a/services/wolf.sh +++ b/services/wolf.sh @@ -2384,12 +2384,27 @@ CATALOG = { f'{games}/retroarch:/home/retro/.config/retroarch:rw', f'{games}/esde-custom-systems:/home/retro/ES-DE/custom_systems:rw', f'{games}/esde-settings:/home/retro/ES-DE/settings:rw'], + # Steam Input needs /dev/uinput for the SAME reason the esde entry + # below needs it for AntiMicroX: it does not hand a game the raw + # controller device at all — it grabs the raw device exclusively for + # itself and creates its OWN synthetic virtual controller via uinput, + # then hands that synthetic device to the game. Confirmed live: + # without this, Steam's own controller test screen reads the raw + # device fine (it does not need uinput for that) and shows a correct + # Gamepad template, but every actual game — Steam title or non-Steam + # shortcut alike — sees no controller at all, since Steam Input can + # never create the virtual device it is supposed to hand off. Same + # devices= grant pattern as esde below: GOW_REQUIRED_DEVICES alone + # only gets the base image's entrypoint script to bind-mount the + # node; the container also needs Wolf's own create-time device grant + # to actually open it. env=['PROTON_LOG=1', 'RUN_SWAY=true', - 'GOW_REQUIRED_DEVICES=/dev/input/* /dev/dri/* /dev/nvidia*'], + 'GOW_REQUIRED_DEVICES=/dev/uinput /dev/input/* /dev/dri/* /dev/nvidia*'], cap_add=['SYS_ADMIN', 'SYS_NICE', 'SYS_PTRACE', 'NET_RAW', 'MKNOD', 'NET_ADMIN'], security_opt=['seccomp=unconfined', 'apparmor=unconfined'], ipc_mode='host', ulimits=[{'Name': 'nofile', 'Hard': 10240, 'Soft': 10240}], privileged=False, + devices=['/dev/uinput:/dev/uinput'], ), 'esde': dict( name='WolfES-DE', title='EmulationStation', @@ -4813,13 +4828,28 @@ CATALOG = { f'{games}/retroarch:/home/retro/.config/retroarch:rw', f'{games}/esde-custom-systems:/home/retro/ES-DE/custom_systems:rw', f'{games}/esde-settings:/home/retro/ES-DE/settings:rw'], + # Steam Input needs /dev/uinput for the SAME reason the esde entry + # below needs it for AntiMicroX: it does not hand a game the raw + # controller device at all — it grabs the raw device exclusively for + # itself and creates its OWN synthetic virtual controller via uinput, + # then hands that synthetic device to the game. Confirmed live: + # without this, Steam's own controller test screen reads the raw + # device fine (it does not need uinput for that) and shows a correct + # Gamepad template, but every actual game — Steam title or non-Steam + # shortcut alike — sees no controller at all, since Steam Input can + # never create the virtual device it is supposed to hand off. Same + # devices= grant pattern as esde below: GOW_REQUIRED_DEVICES alone + # only gets the base image's entrypoint script to bind-mount the + # node; the container also needs Wolf's own create-time device grant + # to actually open it. env=['PROTON_LOG=1', 'RUN_SWAY=true', - 'GOW_REQUIRED_DEVICES=/dev/input/* /dev/dri/* /dev/nvidia*'], + 'GOW_REQUIRED_DEVICES=/dev/uinput /dev/input/* /dev/dri/* /dev/nvidia*'], cap_add=['SYS_ADMIN', 'SYS_NICE', 'SYS_PTRACE', 'NET_RAW', 'MKNOD', 'NET_ADMIN'], security_opt=['seccomp=unconfined', 'apparmor=unconfined'], ipc_mode='host', ulimits=[{'Name': 'nofile', 'Hard': 10240, 'Soft': 10240}], privileged=False, + devices=['/dev/uinput:/dev/uinput'], ), 'esde': dict( name='WolfES-DE', title='EmulationStation',