From 2bf7e94be8b562d84223e690a7f3e187d93d44b7 Mon Sep 17 00:00:00 2001 From: Bonk Date: Mon, 5 May 2025 09:35:57 +0200 Subject: [PATCH 01/19] added woraround for joysticks with no buttons (e.g: Thrustmaster T-Rudder) --- evdevremapkeys/evdevremapkeys.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 0f9d9a2..a88dfca 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -292,7 +292,10 @@ def register_device(device, loop: AbstractEventLoop): del caps[ecodes.EV_SYN] remappings = device['remappings'] - extended = set(caps[ecodes.EV_KEY]) + if( not ecodes.EV_KEY in caps ): + extended = set() + else: + extended = set(caps[ecodes.EV_KEY]) modifier_groups = [] if 'modifier_groups' in device: @@ -311,6 +314,7 @@ def flatmap(lst): extended.update([remapping['code']]) caps[ecodes.EV_KEY] = list(extended) + print(caps) output = UInput(caps, name=device['output_name']) print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) task = loop.create_task( From 91be7d398c50c107e7184218bfa213aac7a5ec05 Mon Sep 17 00:00:00 2001 From: Bonk Date: Mon, 5 May 2025 09:40:03 +0200 Subject: [PATCH 02/19] fix whitespace --- evdevremapkeys/evdevremapkeys.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index a88dfca..b33ff2c 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -295,7 +295,7 @@ def register_device(device, loop: AbstractEventLoop): if( not ecodes.EV_KEY in caps ): extended = set() else: - extended = set(caps[ecodes.EV_KEY]) + extended = set(caps[ecodes.EV_KEY]) modifier_groups = [] if 'modifier_groups' in device: From d994621fabe470cad18eb6ffd0195a6a884a9a6d Mon Sep 17 00:00:00 2001 From: Bonk Date: Mon, 5 May 2025 09:48:20 +0200 Subject: [PATCH 03/19] remove print --- evdevremapkeys/evdevremapkeys.py | 1 - 1 file changed, 1 deletion(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index b33ff2c..364acde 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -314,7 +314,6 @@ def flatmap(lst): extended.update([remapping['code']]) caps[ecodes.EV_KEY] = list(extended) - print(caps) output = UInput(caps, name=device['output_name']) print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) task = loop.create_task( From 9e5f6d6c709d7ab039bceebc1693958517eb41cb Mon Sep 17 00:00:00 2001 From: Bonk Date: Mon, 5 May 2025 16:46:53 +0200 Subject: [PATCH 04/19] 1 button fix hardcode to 288 --- evdevremapkeys/evdevremapkeys.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 364acde..9db008b 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -293,7 +293,7 @@ def register_device(device, loop: AbstractEventLoop): remappings = device['remappings'] if( not ecodes.EV_KEY in caps ): - extended = set() + extended = set([288]) else: extended = set(caps[ecodes.EV_KEY]) @@ -314,6 +314,7 @@ def flatmap(lst): extended.update([remapping['code']]) caps[ecodes.EV_KEY] = list(extended) + print(caps) output = UInput(caps, name=device['output_name']) print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) task = loop.create_task( From 75cb20bad24f41383cae4aab98b8a59aa4efd7b5 Mon Sep 17 00:00:00 2001 From: Bonk Date: Wed, 7 May 2025 12:32:21 +0200 Subject: [PATCH 05/19] made dummy buttons, vendor and product ids configurable. eg: device: - input_name: "Thrustmaster T-Rudder" output_name: "T-Rudder" product_id: 0x1234 dummy_buttons: [304, 305] remappings: {} --- evdevremapkeys/evdevremapkeys.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 9db008b..8551e9b 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -293,10 +293,14 @@ def register_device(device, loop: AbstractEventLoop): remappings = device['remappings'] if( not ecodes.EV_KEY in caps ): - extended = set([288]) + extended = set() else: extended = set(caps[ecodes.EV_KEY]) + if 'dummy_buttons' in device: #add dummy buttons + extended |= set(device['dummy_buttons']) + + print(extended) modifier_groups = [] if 'modifier_groups' in device: modifier_groups = device['modifier_groups'] @@ -314,8 +318,14 @@ def flatmap(lst): extended.update([remapping['code']]) caps[ecodes.EV_KEY] = list(extended) - print(caps) - output = UInput(caps, name=device['output_name']) + + output = UInput(caps, + name=device['output_name'], + vendor=input.info.vendor if not 'vendor_id' in device else device['vendor_id'], + product=input.info.product if not 'product_id' in device else device['product_id'], + version=input.info.version if not 'version' in device else device['version'], + bustype=0x06 if not 'bustype' in device else device['bustype'], # USB 0x06, virtual 0x03 etc + ) print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) task = loop.create_task( handle_events(input, output, remappings, modifier_groups), From de7cbcbff9b3084528d2a4d80026467a709d455d Mon Sep 17 00:00:00 2001 From: Bonk Date: Wed, 7 May 2025 12:45:33 +0200 Subject: [PATCH 06/19] cleaned print --- evdevremapkeys/evdevremapkeys.py | 1 - 1 file changed, 1 deletion(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 319aac6..342cc46 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -317,7 +317,6 @@ def register_device(device, loop: AbstractEventLoop): if 'dummy_buttons' in device: #add dummy buttons extended |= set(device['dummy_buttons']) - print(extended) modifier_groups = [] if "modifier_groups" in device: modifier_groups = device["modifier_groups"] From a211cc3ff0080da4021b883cab3401304fcc4cc2 Mon Sep 17 00:00:00 2001 From: Bonk Date: Tue, 27 May 2025 12:44:55 +0200 Subject: [PATCH 07/19] reusing and config --- evdevremapkeys/evdevremapkeys.py | 46 +++++++++++++++++++++----------- hogs.yaml | 15 +++++++++++ rudder.yaml | 6 +++++ 3 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 hogs.yaml create mode 100644 rudder.yaml diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 342cc46..026b9b8 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -71,11 +71,9 @@ async def handle_events( output.write_event(event) output.syn() finally: - del registered_devices[input.path] - print( - "Unregistered: %s, %s, %s" % (input.name, input.path, input.phys), - flush=True, - ) + registered_devices[input.path]["input"] = None + registered_devices[input.path]["task"] = None + print(f"Device disconnected: {input.name} ({input.path}) {input.phys}", flush=True) input.close() @@ -282,26 +280,37 @@ def find_input(device): devices = [InputDevice(fn) for fn in evdev.list_devices()] for input in devices: + #print(registered_devices) + #print(input.path) if name is not None and input.name != name: continue if phys is not None and input.phys != phys: continue if fn is not None and input.path != fn: continue - if input.path in registered_devices: + if input.path in registered_devices and registered_devices[input.path]["input"] != None: continue return input return None def register_device(device, loop: AbstractEventLoop): + #print("reg dev", flush=True) for value in registered_devices.values(): - if device == value["device"]: + if device == value["device"] and value["task"]: return value["task"] input = find_input(device) if input is None: return None + + #reuse output + existing_output = None + for val in registered_devices.values(): + if val["device"] == device: + existing_output = val["output"] + break + input.grab() caps = input.capabilities() @@ -335,14 +344,20 @@ def flatmap(lst): caps[ecodes.EV_KEY] = list(extended) - output = UInput(caps, - name=device['output_name'], - vendor=input.info.vendor if not 'vendor_id' in device else device['vendor_id'], - product=input.info.product if not 'product_id' in device else device['product_id'], - version=input.info.version if not 'version' in device else device['version'], - bustype=0x06 if not 'bustype' in device else device['bustype'], # USB 0x06, virtual 0x03 etc - ) - print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) + if not existing_output: + + output = UInput(caps, + name=device['output_name'], + vendor=input.info.vendor if not 'vendor_id' in device else device['vendor_id'], + product=input.info.product if not 'product_id' in device else device['product_id'], + version=input.info.version if not 'version' in device else device['version'], + bustype=0x06 if not 'bustype' in device else device['bustype'], # USB 0x06, virtual 0x03 etc + ) + print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) + else: + output = existing_output + print('Reused: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) + task = loop.create_task( handle_events(input, output, remappings, modifier_groups), name=input.name ) @@ -350,6 +365,7 @@ def flatmap(lst): "task": task, "device": device, "input": input, + "output": output } return task diff --git a/hogs.yaml b/hogs.yaml new file mode 100644 index 0000000..e320886 --- /dev/null +++ b/hogs.yaml @@ -0,0 +1,15 @@ +devices: + - input_name: "Thustmaster Joystick - HOTAS Warthog" + output_name: "Joystick - HOTAS Warthog" + version: 42 + remappings: {} + - input_name: "Thrustmaster Throttle - HOTAS Warthog" + output_name: "Throttle - HOTAS Warthog" + version: 42 + remappings: {} + - input_name: "Thrustmaster T-Rudder" + output_name: "T-Rudder" + product_id: 0x1234 + version: 42 + dummy_buttons: [304, 305] + remappings: {} diff --git a/rudder.yaml b/rudder.yaml new file mode 100644 index 0000000..77cc328 --- /dev/null +++ b/rudder.yaml @@ -0,0 +1,6 @@ +devices: + - input_name: "Thrustmaster T-Rudder" + output_name: "T-Rudder" + product_id: 0x1234 + dummy_buttons: [304, 305] + remappings: {} From 44c091811b3cb68b4173b9d4045fbd3efa83e32e Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 15:18:53 +0200 Subject: [PATCH 08/19] formatting --- evdevremapkeys/evdevremapkeys.py | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 319aac6..b585b7b 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -308,15 +308,15 @@ def register_device(device, loop: AbstractEventLoop): # EV_SYN is automatically added to uinput devices del caps[ecodes.EV_SYN] - remappings = device['remappings'] - if( not ecodes.EV_KEY in caps ): - extended = set() + remappings = device["remappings"] + if not ecodes.EV_KEY in caps: + extended = set() else: - extended = set(caps[ecodes.EV_KEY]) + extended = set(caps[ecodes.EV_KEY]) + + if "dummy_buttons" in device: # add dummy buttons + extended |= set(device["dummy_buttons"]) - if 'dummy_buttons' in device: #add dummy buttons - extended |= set(device['dummy_buttons']) - print(extended) modifier_groups = [] if "modifier_groups" in device: @@ -336,14 +336,19 @@ def flatmap(lst): caps[ecodes.EV_KEY] = list(extended) - output = UInput(caps, - name=device['output_name'], - vendor=input.info.vendor if not 'vendor_id' in device else device['vendor_id'], - product=input.info.product if not 'product_id' in device else device['product_id'], - version=input.info.version if not 'version' in device else device['version'], - bustype=0x06 if not 'bustype' in device else device['bustype'], # USB 0x06, virtual 0x03 etc + output = UInput( + caps, + name=device["output_name"], + vendor=input.info.vendor if not "vendor_id" in device else device["vendor_id"], + product=input.info.product + if not "product_id" in device + else device["product_id"], + version=input.info.version if not "version" in device else device["version"], + bustype=0x06 + if not "bustype" in device + else device["bustype"], # USB 0x06, virtual 0x03 etc ) - print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) + print("Registered: %s, %s, %s" % (input.name, input.path, input.phys), flush=True) task = loop.create_task( handle_events(input, output, remappings, modifier_groups), name=input.name ) From b8d618823c9c2b950d6c1dd6e3f0515440ec1303 Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 15:32:32 +0200 Subject: [PATCH 09/19] only set overrides if explicitly specified --- evdevremapkeys/evdevremapkeys.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index b585b7b..fa81e85 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -336,18 +336,14 @@ def flatmap(lst): caps[ecodes.EV_KEY] = list(extended) - output = UInput( - caps, - name=device["output_name"], - vendor=input.info.vendor if not "vendor_id" in device else device["vendor_id"], - product=input.info.product - if not "product_id" in device - else device["product_id"], - version=input.info.version if not "version" in device else device["version"], - bustype=0x06 - if not "bustype" in device - else device["bustype"], # USB 0x06, virtual 0x03 etc - ) + extra_options = {"name": device["output_name"]} + + for k, v in device.items(): + if k in ["vendor_id", "product_id", "version", "bustype"]: + extra_options[k] = v + + output = UInput(caps, extra_options) + print("Registered: %s, %s, %s" % (input.name, input.path, input.phys), flush=True) task = loop.create_task( handle_events(input, output, remappings, modifier_groups), name=input.name From 4316e4f968985cfb79ce951cf34ffeed886dc051 Mon Sep 17 00:00:00 2001 From: bonkzwonil Date: Fri, 30 May 2025 15:56:17 +0200 Subject: [PATCH 10/19] feature: overrides and dummy buttons (#1) * formatting * only set overrides if explicitly specified * typo * formatting * names * reusing * linting --- evdevremapkeys/evdevremapkeys.py | 55 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 026b9b8..91739d7 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -73,7 +73,9 @@ async def handle_events( finally: registered_devices[input.path]["input"] = None registered_devices[input.path]["task"] = None - print(f"Device disconnected: {input.name} ({input.path}) {input.phys}", flush=True) + print( + f"Device disconnected: {input.name} ({input.path}) {input.phys}", flush=True + ) input.close() @@ -280,22 +282,25 @@ def find_input(device): devices = [InputDevice(fn) for fn in evdev.list_devices()] for input in devices: - #print(registered_devices) - #print(input.path) + # print(registered_devices) + # print(input.path) if name is not None and input.name != name: continue if phys is not None and input.phys != phys: continue if fn is not None and input.path != fn: continue - if input.path in registered_devices and registered_devices[input.path]["input"] != None: + if ( + input.path in registered_devices + and registered_devices[input.path]["input"] is not None + ): continue return input return None def register_device(device, loop: AbstractEventLoop): - #print("reg dev", flush=True) + # print("reg dev", flush=True) for value in registered_devices.values(): if device == value["device"] and value["task"]: return value["task"] @@ -304,28 +309,28 @@ def register_device(device, loop: AbstractEventLoop): if input is None: return None - #reuse output + # reuse output existing_output = None for val in registered_devices.values(): if val["device"] == device: existing_output = val["output"] break - + input.grab() caps = input.capabilities() # EV_SYN is automatically added to uinput devices del caps[ecodes.EV_SYN] - remappings = device['remappings'] - if( not ecodes.EV_KEY in caps ): - extended = set() + remappings = device["remappings"] + if ecodes.EV_KEY not in caps: + extended = set() else: - extended = set(caps[ecodes.EV_KEY]) + extended = set(caps[ecodes.EV_KEY]) + + if "dummy_buttons" in device: # add dummy buttons + extended |= set(device["dummy_buttons"]) - if 'dummy_buttons' in device: #add dummy buttons - extended |= set(device['dummy_buttons']) - modifier_groups = [] if "modifier_groups" in device: modifier_groups = device["modifier_groups"] @@ -344,20 +349,16 @@ def flatmap(lst): caps[ecodes.EV_KEY] = list(extended) + extra_options = {"name": device["output_name"]} + + for k, v in device.items(): + if k in ["vendor", "product", "version", "bustype"]: + extra_options[k] = v + if not existing_output: + output = UInput(caps, **extra_options) - output = UInput(caps, - name=device['output_name'], - vendor=input.info.vendor if not 'vendor_id' in device else device['vendor_id'], - product=input.info.product if not 'product_id' in device else device['product_id'], - version=input.info.version if not 'version' in device else device['version'], - bustype=0x06 if not 'bustype' in device else device['bustype'], # USB 0x06, virtual 0x03 etc - ) - print('Registered: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) - else: - output = existing_output - print('Reused: %s, %s, %s' % (input.name, input.path, input.phys), flush=True) - + print("Registered: %s, %s, %s" % (input.name, input.path, input.phys), flush=True) task = loop.create_task( handle_events(input, output, remappings, modifier_groups), name=input.name ) @@ -365,7 +366,7 @@ def flatmap(lst): "task": task, "device": device, "input": input, - "output": output + "output": output, } return task From a9ba35fe7b810f3dea26bd715684cd009e6a9993 Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 16:03:43 +0200 Subject: [PATCH 11/19] deleted configfile --- hogs.yaml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 hogs.yaml diff --git a/hogs.yaml b/hogs.yaml deleted file mode 100644 index 1d5a02c..0000000 --- a/hogs.yaml +++ /dev/null @@ -1,15 +0,0 @@ -devices: - - input_name: "Thustmaster Joystick - HOTAS Warthog" - output_name: "Joystick - HOTAS Warthog" - version: 42 - remappings: {} - - input_name: "Thrustmaster Throttle - HOTAS Warthog" - output_name: "Throttle - HOTAS Warthog" - version: 42 - remappings: {} - - input_name: "Thrustmaster T-Rudder" - output_name: "T-Rudder" - product: 0x1234 - version: 42 - dummy_buttons: [304, 305] - remappings: {} From fa9233645dcf0a4e4d218c00efd09d5557953f4d Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 16:05:32 +0200 Subject: [PATCH 12/19] example rudder yaml --- rudder.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rudder.yaml b/rudder.yaml index 77cc328..a7fd980 100644 --- a/rudder.yaml +++ b/rudder.yaml @@ -1,6 +1,6 @@ devices: - input_name: "Thrustmaster T-Rudder" output_name: "T-Rudder" - product_id: 0x1234 + product: 0x1234 dummy_buttons: [304, 305] remappings: {} From 00ccf69017c2a226cf40f86e657c5491324d1142 Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 16:08:43 +0200 Subject: [PATCH 13/19] linting --- evdevremapkeys/evdevremapkeys.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 2c532d0..abf08e1 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -357,11 +357,13 @@ def flatmap(lst): if not existing_output: output = UInput(caps, **extra_options) - print("Registered: %s, %s, %s" % (input.name, input.path, input.phys), flush=True) + print( + "Registered: %s, %s, %s" % (input.name, input.path, input.phys), flush=True + ) else: output = existing_output print("Reused: %s, %s, %s" % (input.name, input.path, input.phys), flush=True) - + task = loop.create_task( handle_events(input, output, remappings, modifier_groups), name=input.name ) From f1f2ddd2df4cb5288ea6d0de9f0d9ae37397b4cd Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 16:17:04 +0200 Subject: [PATCH 14/19] added examplefile --- examples/advanced_config.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/advanced_config.yaml b/examples/advanced_config.yaml index 0a1b9d9..b7517e7 100644 --- a/examples/advanced_config.yaml +++ b/examples/advanced_config.yaml @@ -47,3 +47,9 @@ devices: - code: KEY_A value: [1,0,1,0] repeat: true +- input_name: "Thrustmaster T-Rudder" # Example for using rudder pedals without buttons (and a changed productid to make wine recognize it) + output_name: "T-Rudder" + product: 0x1234 + dummy_buttons: [304, 305] + remappings: {} + From d802c5fe47b87f3721d4ec02984600f3751842b7 Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 16:17:58 +0200 Subject: [PATCH 15/19] deleted extra sample file --- rudder.yaml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 rudder.yaml diff --git a/rudder.yaml b/rudder.yaml deleted file mode 100644 index a7fd980..0000000 --- a/rudder.yaml +++ /dev/null @@ -1,6 +0,0 @@ -devices: - - input_name: "Thrustmaster T-Rudder" - output_name: "T-Rudder" - product: 0x1234 - dummy_buttons: [304, 305] - remappings: {} From 53be50033dedc560970948b401c6d1d7476bb479 Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 17:13:11 +0200 Subject: [PATCH 16/19] removed extra reusing feature --- evdevremapkeys/evdevremapkeys.py | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index abf08e1..d0da7f4 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -71,8 +71,7 @@ async def handle_events( output.write_event(event) output.syn() finally: - registered_devices[input.path]["input"] = None - registered_devices[input.path]["task"] = None + del registered_devices[input.path] print( f"Device disconnected: {input.name} ({input.path}) {input.phys}", flush=True ) @@ -290,32 +289,21 @@ def find_input(device): continue if fn is not None and input.path != fn: continue - if ( - input.path in registered_devices - and registered_devices[input.path]["input"] is not None - ): + if input.path in registered_devices: continue return input return None def register_device(device, loop: AbstractEventLoop): - # print("reg dev", flush=True) for value in registered_devices.values(): - if device == value["device"] and value["task"]: + if device == value["device"]: return value["task"] input = find_input(device) if input is None: return None - # reuse output - existing_output = None - for val in registered_devices.values(): - if val["device"] == device: - existing_output = val["output"] - break - input.grab() caps = input.capabilities() @@ -355,14 +343,8 @@ def flatmap(lst): if k in ["vendor", "product", "version", "bustype"]: extra_options[k] = v - if not existing_output: - output = UInput(caps, **extra_options) - print( - "Registered: %s, %s, %s" % (input.name, input.path, input.phys), flush=True - ) - else: - output = existing_output - print("Reused: %s, %s, %s" % (input.name, input.path, input.phys), flush=True) + output = UInput(caps, **extra_options) + print("Registered: %s, %s, %s" % (input.name, input.path, input.phys), flush=True) task = loop.create_task( handle_events(input, output, remappings, modifier_groups), name=input.name @@ -371,7 +353,6 @@ def flatmap(lst): "task": task, "device": device, "input": input, - "output": output, } return task From 1f87bb7d2ee25ca80186d0d4e6f22dacf6d6b734 Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 17:15:27 +0200 Subject: [PATCH 17/19] disconnected -> unregistered wording --- evdevremapkeys/evdevremapkeys.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index d0da7f4..cf286eb 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -73,7 +73,7 @@ async def handle_events( finally: del registered_devices[input.path] print( - f"Device disconnected: {input.name} ({input.path}) {input.phys}", flush=True + f"Unregistered: {input.name} ({input.path}) {input.phys}", flush=True ) input.close() From 128fe1415a5154bf3fd8b6dfc19ffb0663fa675b Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 17:15:45 +0200 Subject: [PATCH 18/19] linting --- evdevremapkeys/evdevremapkeys.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index cf286eb..2d9b677 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -72,9 +72,7 @@ async def handle_events( output.syn() finally: del registered_devices[input.path] - print( - f"Unregistered: {input.name} ({input.path}) {input.phys}", flush=True - ) + print(f"Unregistered: {input.name} ({input.path}) {input.phys}", flush=True) input.close() From bc82d92cad59a1d661c2355d4d6bb78f6acb2bff Mon Sep 17 00:00:00 2001 From: Bonk Date: Fri, 30 May 2025 17:16:06 +0200 Subject: [PATCH 19/19] removed garbage --- evdevremapkeys/evdevremapkeys.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/evdevremapkeys/evdevremapkeys.py b/evdevremapkeys/evdevremapkeys.py index 2d9b677..3689f35 100755 --- a/evdevremapkeys/evdevremapkeys.py +++ b/evdevremapkeys/evdevremapkeys.py @@ -279,8 +279,6 @@ def find_input(device): devices = [InputDevice(fn) for fn in evdev.list_devices()] for input in devices: - # print(registered_devices) - # print(input.path) if name is not None and input.name != name: continue if phys is not None and input.phys != phys: