From b8c602822cada409ba8864119a090dfd969953ac Mon Sep 17 00:00:00 2001 From: sezanzeb Date: Mon, 2 Nov 2020 20:55:17 +0100 Subject: [PATCH] some rearrangement --- README.md | 4 +- bin/key-mapper-gtk | 5 + data/key-mapper.glade | 434 +++++++++++++++++++++++------------------- data/screenshot.png | Bin 17915 -> 20863 bytes keymapper/presets.py | 7 + 5 files changed, 256 insertions(+), 194 deletions(-) diff --git a/README.md b/README.md index 5c6e48ff..9dadd6aa 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ work. # Running -``` +```bash sudo python3 setup.py install && sudo key-mapper-gtk -d ``` @@ -26,7 +26,7 @@ No idea which one are relevant at the moment sudo is required because some tests actually read /dev stuff. -``` +```bash sudo python3 setup.py install && sudo python3 tests/test.py ``` diff --git a/bin/key-mapper-gtk b/bin/key-mapper-gtk index 5231f456..2cb83806 100755 --- a/bin/key-mapper-gtk +++ b/bin/key-mapper-gtk @@ -129,7 +129,12 @@ class Window: else: logger.debug('Presets for "%s": %s', device, ', '.join(presets)) preset_selection = self.get('preset_selection') + + preset_selection.handler_block_by_func(self.on_select_preset) + # otherwise the handler is called with None for each removed preset preset_selection.remove_all() + preset_selection.handler_unblock_by_func(self.on_select_preset) + for preset in presets: preset_selection.append(preset, preset) # and select the newest one (on the top) diff --git a/data/key-mapper.glade b/data/key-mapper.glade index fb8b6e6e..e42f5d05 100644 --- a/data/key-mapper.glade +++ b/data/key-mapper.glade @@ -6,25 +6,49 @@ 450 False Key Mapper + False True False - vertical - + True False - 10 - 10 + vertical - + True False - Device - 10 - 0 + 10 + 10 + + + True + False + Device + 13 + 0 + + + False + True + 0 + + + + + True + False + + + + True + True + 1 + + False @@ -33,17 +57,192 @@ - + True False - - True + False True 1 + + + True + False + 10 + vertical + 10 + + + True + False + 10 + + + gtk-apply + 80 + True + True + True + True + + + False + True + 0 + + + + + gtk-save + 80 + True + True + True + True + + + False + True + 1 + + + + + gtk-new + 80 + True + True + True + True + + + + False + True + 2 + + + + + True + False + 0 + + + True + True + 3 + + + + + gtk-delete + 80 + True + True + True + True + + + False + True + 4 + + + + + False + True + 0 + + + + + True + False + 10 + + + 50 + True + False + preset + 13 + 0 + + + False + True + 0 + + + + + 200 + True + False + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + 10 + + + True + False + Rename + 13 + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 2 + + + + + False + True + 2 + + False @@ -59,31 +258,27 @@ False True - 10 1 - + + 200 True False - 10 vertical - 10 - + True False - 10 + 10 - - gtk-new - 80 + + 50 True - True - True - True - + False + Mapping + 0 True @@ -92,35 +287,21 @@ - - gtk-save + + gtk-add 80 True True True True + - True + False True 1 - - - gtk-delete - 80 - True - True - True - True - - - True - True - 2 - - False @@ -129,82 +310,48 @@ - + True False - 10 + 10 + 10 + 10 + 2 + 2 - 50 True False - preset - 10 - 0 + True + Mapping - False - True - 0 + 2 + 0 - - 200 + True False - + True + Key - True - True - 1 + 1 + 0 + + + - False + True True 1 - - - True - False - 10 - - - True - False - Rename - 10 - 0 - - - False - True - 0 - - - - - True - True - - - True - True - 1 - - - - - False - True - 2 - - False @@ -212,103 +359,6 @@ 2 - - - True - False - - - False - True - 10 - 3 - - - - - True - False - 10 - - - 50 - True - False - Mapping - 0 - - - True - True - 0 - - - - - gtk-add - 80 - True - True - True - True - - - - False - True - 1 - - - - - False - True - 4 - - - - - True - False - 10 - 10 - 10 - 10 - 10 - - - True - False - True - Mapping - - - 2 - 0 - - - - - True - False - True - Key - - - 1 - 0 - - - - - - - - True - True - 5 - - diff --git a/data/screenshot.png b/data/screenshot.png index a3b24312827356056aa91a7ed548d6caac18cccb..25786349fa3e5e8823bc432dd1a4e44dde201a85 100644 GIT binary patch literal 20863 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 ULz4rL{sz64Q+iPXe)sAB0HA`!82|tP diff --git a/keymapper/presets.py b/keymapper/presets.py index c9a27179..e607888c 100644 --- a/keymapper/presets.py +++ b/keymapper/presets.py @@ -42,14 +42,21 @@ def get_devices(): return _devices devices = [evdev.InputDevice(path) for path in evdev.list_devices()] + # group them together by usb device because there could be stuff like # "Logitech USB Keyboard" and "Logitech USB Keyboard Consumer Control" grouped = {} for device in devices: + # only keyboard devices + # https://www.kernel.org/doc/html/latest/input/event-codes.html + if not evdev.ecodes.EV_KEY in device.capabilities().keys(): + continue + usb = device.phys.split('/')[0] if grouped.get(usb) is None: grouped[usb] = [] grouped[usb].append((device.name, device.path)) + # now write down all the paths of that group result = {} for group in grouped.values():