From b2e718f5a7b18db2f9991876f3d0886c8de4e00c Mon Sep 17 00:00:00 2001 From: Tin Lai Date: Tue, 6 Feb 2024 17:19:00 +1000 Subject: [PATCH] add text to avoid empty input for workaround For the `input` workaround, we add a space key event to input some text before pressing the enter key. This avoid the error that happens due to gtk preventing empty input. Signed-off-by: Tin Lai --- howdy/src/pam/enter_device.cc | 25 +++++++++++++++++++++++++ howdy/src/pam/enter_device.hh | 1 + howdy/src/pam/main.cc | 4 ++++ 3 files changed, 30 insertions(+) diff --git a/howdy/src/pam/enter_device.cc b/howdy/src/pam/enter_device.cc index 0114d8d7..9f47e3db 100644 --- a/howdy/src/pam/enter_device.cc +++ b/howdy/src/pam/enter_device.cc @@ -11,6 +11,7 @@ EnterDevice::EnterDevice() libevdev_set_name(dev_ptr, "enter device"); libevdev_enable_event_type(dev_ptr, EV_KEY); + libevdev_enable_event_code(dev_ptr, EV_KEY, KEY_SPACE, nullptr); libevdev_enable_event_code(dev_ptr, EV_KEY, KEY_ENTER, nullptr); int err; @@ -24,6 +25,30 @@ EnterDevice::EnterDevice() raw_uinput_device.reset(uinput_dev_ptr); }; +void EnterDevice::send_space_press() const { + auto *uinput_dev_ptr = raw_uinput_device.get(); + + int err; + if ((err = libevdev_uinput_write_event(uinput_dev_ptr, EV_KEY, KEY_SPACE, + 1)) != 0) { + throw std::runtime_error(std::string("Failed to write event: ") + + strerror(-err)); + } + + if ((err = libevdev_uinput_write_event(uinput_dev_ptr, EV_KEY, KEY_SPACE, + 0)) != 0) { + throw std::runtime_error(std::string("Failed to write event: ") + + strerror(-err)); + } + + if ((err = libevdev_uinput_write_event(uinput_dev_ptr, EV_SYN, SYN_REPORT, + 0)) != 0) + { + throw std::runtime_error(std::string("Failed to write event: ") + + strerror(-err)); + }; +} + void EnterDevice::send_enter_press() const { auto *uinput_dev_ptr = raw_uinput_device.get(); diff --git a/howdy/src/pam/enter_device.hh b/howdy/src/pam/enter_device.hh index acdadd15..372c1ac2 100644 --- a/howdy/src/pam/enter_device.hh +++ b/howdy/src/pam/enter_device.hh @@ -12,6 +12,7 @@ class EnterDevice { public: EnterDevice(); + void send_space_press() const; void send_enter_press() const; ~EnterDevice() = default; }; diff --git a/howdy/src/pam/main.cc b/howdy/src/pam/main.cc index d1b8e347..464b388e 100644 --- a/howdy/src/pam/main.cc +++ b/howdy/src/pam/main.cc @@ -409,6 +409,10 @@ auto identify(pam_handle_t *pamh, int flags, int argc, const char **argv, enter_device.send_enter_press(); } + // try it one more time with an non-empty input field + enter_device.send_space_press(); + enter_device.send_enter_press(); + if (retries == MAX_RETRIES) { syslog(LOG_WARNING, "Failed to send enter input before the retries limit");