From f8eb77cad7b3326b15c4a24729071304f9c8e236 Mon Sep 17 00:00:00 2001 From: max Date: Mon, 14 Dec 2020 20:02:44 +0100 Subject: [PATCH] Register keys for keypress only when needed there seems to be an issue that with too many registered events some window manager cannot recognize the device as input device with systemd 247. PixlOne#166 --- src/logid/InputDevice.cpp | 19 +++++++++++++------ src/logid/InputDevice.h | 1 + src/logid/actions/KeypressAction.cpp | 2 ++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/logid/InputDevice.cpp b/src/logid/InputDevice.cpp index 644b907..9fdd333 100644 --- a/src/logid/InputDevice.cpp +++ b/src/logid/InputDevice.cpp @@ -43,12 +43,7 @@ InputDevice::InputDevice(const char* name) device = libevdev_new(); libevdev_set_name(device, name); - ///TODO: Is it really a good idea to enable all events? libevdev_enable_event_type(device, EV_KEY); - // KEY_ROTATE_LOCK_TOGGLE is the highest key mapped by - // /usr/share/X11/xkb/keycodes/evdev - for(unsigned int i = 0; i <= KEY_ROTATE_LOCK_TOGGLE; i++) - libevdev_enable_event_code(device, EV_KEY, i, nullptr); libevdev_enable_event_type(device, EV_REL); for(unsigned int i = 0; i < REL_CNT; i++) libevdev_enable_event_code(device, EV_REL, i, nullptr); @@ -68,6 +63,18 @@ InputDevice::~InputDevice() libevdev_free(device); } +void InputDevice::registerKey(uint code) +{ + libevdev_enable_event_code(device, EV_KEY, code, nullptr); + int err = libevdev_uinput_create_from_device(device, + LIBEVDEV_UINPUT_OPEN_MANAGED, &ui_device); + + if(err != 0) { + libevdev_free(device); + throw std::system_error(-err, std::generic_category()); + } +} + void InputDevice::moveAxis(uint axis, int movement) { _sendEvent(EV_REL, axis, movement); @@ -123,4 +130,4 @@ void InputDevice::_sendEvent(uint type, uint code, int value) { libevdev_uinput_write_event(ui_device, type, code, value); libevdev_uinput_write_event(ui_device, EV_SYN, SYN_REPORT, 0); -} \ No newline at end of file +} diff --git a/src/logid/InputDevice.h b/src/logid/InputDevice.h index d5e5a47..5bd1eee 100644 --- a/src/logid/InputDevice.h +++ b/src/logid/InputDevice.h @@ -44,6 +44,7 @@ namespace logid explicit InputDevice(const char *name); ~InputDevice(); + void registerKey(uint code); void moveAxis(uint axis, int movement); void pressKey(uint code); void releaseKey(uint code); diff --git a/src/logid/actions/KeypressAction.cpp b/src/logid/actions/KeypressAction.cpp index da097cc..a71546b 100644 --- a/src/logid/actions/KeypressAction.cpp +++ b/src/logid/actions/KeypressAction.cpp @@ -64,9 +64,11 @@ KeypressAction::Config::Config(Device* device, libconfig::Setting& config) : auto& key = keys[i]; if(key.isNumber()) { _keys.push_back(key); + virtual_input->registerKey(key); } else if(key.getType() == libconfig::Setting::TypeString) { try { _keys.push_back(virtual_input->toKeyCode(key)); + virtual_input->registerKey(virtual_input->toKeyCode(key)); } catch(InputDevice::InvalidEventCode& e) { logPrintf(WARN, "Line %d: Invalid keycode %s, skipping." , key.getSourceLine(), key.c_str());