Files
hermes-config/skills/gaming/game-streaming/scripts/diagnose-uinput.sh
T
2026-07-12 10:17:17 -04:00

60 lines
1.8 KiB
Bash

#!/bin/bash
# Quick diagnostic: is uinput functional on this kernel?
# Sunshine uses libevdev/uinput for keyboard/mouse injection, NOT XTEST.
# If this script fails, all input will be silently broken regardless of
# Moonlight settings, admin rights, or WM choice.
set -e
echo "=== uinput diagnostic for Sunshine game streaming ==="
echo "Kernel: $(uname -r)"
echo ""
# Check 1: basic device node
if [ -e /dev/uinput ]; then
echo "[PASS] /dev/uinput exists"
else
echo "[FAIL] /dev/uinput does not exist"
exit 1
fi
# Check 2: writable
if [ -w /dev/uinput ]; then
echo "[PASS] /dev/uinput is writable"
else
echo "[FAIL] /dev/uinput is NOT writable"
echo " Fix: sudo usermod -a -G input $USER && newgrp input"
exit 1
fi
# Check 3: libevdev uinput create (the exact API Sunshine uses)
python3 -c '
import ctypes, sys
libevdev = ctypes.CDLL("libevdev.so.2")
dev = libevdev.libevdev_new()
if not dev:
print("[FAIL] libevdev_new() returned NULL")
sys.exit(1)
libevdev.libevdev_set_name(dev, b"diagnose-uinput")
libevdev.libevdev_enable_event_type(dev, 1) # EV_KEY
uinput_fd = ctypes.c_int(-1)
ret = libevdev.libevdev_uinput_create_from_device(dev, 3, ctypes.byref(uinput_fd))
libevdev.libevdev_free(dev)
if ret == 0 and uinput_fd.value >= 0:
print(f"[PASS] uinput device created (fd={uinput_fd.value})")
import os; os.close(uinput_fd.value)
elif ret < 0:
import errno
errname = errno.errorcode.get(-ret, f"unknown({ret})")
print(f"[FAIL] uinput create returned {ret} (errno: {errname})")
if ret == -25:
print(" ENOTTY: uinput interface broken on this kernel (known on 7.0.0-22)")
print(" Workaround: Steam Remote Play or boot older kernel")
sys.exit(1)
else:
print(f"[FAIL] uinput create returned {ret}")
sys.exit(1)
'
echo ""
echo "=== Diagnostic complete ==="