gamecube pad V1
This commit is contained in:
103
gamecube-pad/gamecube-pad.py
Normal file
103
gamecube-pad/gamecube-pad.py
Normal file
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env python3
|
||||
import evdev
|
||||
import uinput
|
||||
import subprocess
|
||||
import time
|
||||
import os
|
||||
|
||||
DEVICE_NAMES = ["8BitDo NGC Modkit"]
|
||||
BUTTON_MAP = {
|
||||
"304": "KEY_ENTER",
|
||||
"305": None,
|
||||
"311": "KEY_LEFTALT",
|
||||
"307": "KEY_RIGHT",
|
||||
"308": "KEY_LEFT",
|
||||
}
|
||||
|
||||
events = [
|
||||
uinput.KEY_LEFT, uinput.KEY_RIGHT,
|
||||
uinput.KEY_ENTER, uinput.KEY_ESC, uinput.KEY_LEFTALT
|
||||
]
|
||||
keyboard = uinput.Device(events)
|
||||
|
||||
def find_device():
|
||||
for path in evdev.list_devices():
|
||||
try:
|
||||
dev = evdev.InputDevice(path)
|
||||
if any(dn in dev.name for dn in DEVICE_NAMES):
|
||||
return path
|
||||
except Exception:
|
||||
continue
|
||||
return None
|
||||
|
||||
def is_dolphin_running():
|
||||
try:
|
||||
output = subprocess.check_output(
|
||||
["flatpak", "ps", "--columns=name"]
|
||||
).decode()
|
||||
return "org.DolphinEmu.dolphin-emu" in output
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
pressed_keys = set()
|
||||
|
||||
def handle_device(dev_path):
|
||||
dev = evdev.InputDevice(dev_path)
|
||||
try:
|
||||
for event in dev.read_loop():
|
||||
if event.type != evdev.ecodes.EV_KEY:
|
||||
continue
|
||||
|
||||
key_code = str(event.code)
|
||||
|
||||
# mettre à jour l'état des touches pressées
|
||||
if event.value == 1:
|
||||
pressed_keys.add(key_code)
|
||||
elif event.value == 0:
|
||||
pressed_keys.discard(key_code)
|
||||
|
||||
# logique R + B → Alt+Esc
|
||||
if "311" in pressed_keys and "305" in pressed_keys:
|
||||
keyboard.emit(uinput.KEY_LEFTALT, 1)
|
||||
keyboard.emit(uinput.KEY_ESC, 1)
|
||||
keyboard.emit(uinput.KEY_ESC, 0)
|
||||
keyboard.emit(uinput.KEY_LEFTALT, 0)
|
||||
else:
|
||||
# envoyer les touches normales sauf celles mappées à None
|
||||
if key_code in BUTTON_MAP:
|
||||
mapped_key = BUTTON_MAP[key_code]
|
||||
if mapped_key is not None: # uniquement si mapped_key n'est pas None ou vide
|
||||
keyboard.emit(getattr(uinput, mapped_key), event.value)
|
||||
except OSError:
|
||||
dev.close()
|
||||
raise
|
||||
|
||||
def main():
|
||||
connected = False
|
||||
time.sleep(5) # délai pour que uinput et le serveur graphique soient prêts
|
||||
while True:
|
||||
dev_path = find_device()
|
||||
if dev_path and not connected:
|
||||
print(f"[+] Manette connectée: {dev_path}")
|
||||
connected = True
|
||||
if not is_dolphin_running():
|
||||
try:
|
||||
subprocess.Popen(["flatpak", "run", "org.DolphinEmu.dolphin-emu"])
|
||||
except Exception as e:
|
||||
print(f"[!] Impossible de lancer Dolphin: {e}")
|
||||
try:
|
||||
handle_device(dev_path)
|
||||
except OSError:
|
||||
print("[-] Manette déconnectée")
|
||||
connected = False
|
||||
try:
|
||||
subprocess.Popen(["flatpak", "kill", "org.DolphinEmu.dolphin-emu"])
|
||||
except Exception as e:
|
||||
print(f"[!] Impossible de tuer Dolphin: {e}")
|
||||
elif not dev_path and connected:
|
||||
print("[-] Manette déconnectée")
|
||||
connected = False
|
||||
time.sleep(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user