From ef7eb26ea5ff807258cf504ee9b66435b0d680f4 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 25 Nov 2024 18:16:21 +0100 Subject: Fix global hotkeys not working when connecting input after startup --- tools/gsr-global-hotkeys/main.c | 63 ++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 19 deletions(-) (limited to 'tools') diff --git a/tools/gsr-global-hotkeys/main.c b/tools/gsr-global-hotkeys/main.c index 98ec6cf..2823487 100644 --- a/tools/gsr-global-hotkeys/main.c +++ b/tools/gsr-global-hotkeys/main.c @@ -146,18 +146,29 @@ static int handle_events(struct libinput *libinput, key_mapper *mapper) { } static int run_mainloop(struct libinput *libinput, key_mapper *mapper) { - struct pollfd fd; - fd.fd = libinput_get_fd(libinput); - fd.events = POLLIN; - fd.revents = 0; + struct pollfd fds[2] = { + { + .fd = libinput_get_fd(libinput), + .events = POLLIN, + .revents = 0 + }, + { + .fd = STDOUT_FILENO, + .events = 0, + .revents = 0 + } + }; if(handle_events(libinput, mapper) != 0) { fprintf(stderr, "error: didn't receive device added events. Is this program not running as root?\n"); return -1; } - while(poll(&fd, 1, -1) >= 0) { - handle_events(libinput, mapper); + while(poll(fds, 2, -1) >= 0) { + if(fds[0].revents & POLLIN) + handle_events(libinput, mapper); + if(fds[1].revents & (POLLHUP|POLLERR)) + break; } return 0; @@ -197,6 +208,10 @@ static bool mapper_refresh_keymap(key_mapper *mapper) { } int main(void) { + int result = 0; + struct udev *udev = NULL; + struct libinput *libinput = NULL; + const uid_t user_id = getuid(); if(geteuid() != 0) { if(setuid(0) == -1) { @@ -205,43 +220,53 @@ int main(void) { } } - struct udev *udev = udev_new(); + udev = udev_new(); if(!udev) { fprintf(stderr, "error: udev_new failed\n"); - return 1; + result = 1; + goto done; } - struct libinput *libinput = libinput_udev_create_context(&interface, NULL, udev); + libinput = libinput_udev_create_context(&interface, NULL, udev); if(!libinput) { fprintf(stderr, "error: libinput_udev_create_context failed\n"); - return 1; + result = 1; + goto done; } if(libinput_udev_assign_seat(libinput, "seat0") != 0) { fprintf(stderr, "error: libinput_udev_assign_seat with seat0 failed\n"); - return 1; + result = 1; + goto done; } key_mapper mapper; mapper.xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if(!mapper.xkb_context) { fprintf(stderr, "error: xkb_context_new failed\n"); - return 1; + result = 1; + goto done; } if(!mapper_refresh_keymap(&mapper)) { fprintf(stderr, "error: key mapper failed\n"); - return 1; + result = 1; + goto done; } - setuid(user_id); - if(run_mainloop(libinput, &mapper) < 0) { fprintf(stderr, "error: failed to start main loop\n"); - return 1; + result = 1; + goto done; } - libinput_unref(libinput); - udev_unref(udev); - return 0; + done: + if(libinput) + libinput_unref(libinput); + + if(udev) + udev_unref(udev); + + setuid(user_id); + return result; } -- cgit v1.2.3