From d904abe0768293b2322dbf355b6e41d94e769d78 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sun, 25 Apr 2021 23:13:52 +0200 Subject: gnu: kmscon: Open a new keymap-update FIFO once a request has been processed. Fixes . Reported by Maxim Cournoyer . Until now, as soon as you had selected the keyboard layout in the Guix System installer, kmscon would start spinning on epoll_wait(2) calls because of an event on the initial FIFO file descriptor (corresponding to the fact that the client closed it.) * gnu/packages/patches/kmscon-runtime-keymap-switch.patch: In 'uxkb_keymap_update_handler', add calls to 'ev_eloop_rm_fd', 'close', and 'uxkb_dev_keymap_update' In 'uxkb_dev_keymap_update', add call to 'unlink'. --- .../patches/kmscon-runtime-keymap-switch.patch | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'gnu/packages') diff --git a/gnu/packages/patches/kmscon-runtime-keymap-switch.patch b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch index deb5688daf..480aaecad2 100644 --- a/gnu/packages/patches/kmscon-runtime-keymap-switch.patch +++ b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch @@ -1,5 +1,9 @@ -By Mathieu Othacehe . -Modified by Florian Pelz . +Make kmscon listen to a FIFO in /tmp that clients can write to +to request a keymap change. + +Patch by Mathieu Othacehe . +Modified by Florian Pelz +and Ludovic Courtès . diff --git a/src/pty.c b/src/pty.c index 1443f4a..f64cb5b 100644 @@ -115,7 +119,7 @@ index 04e6cc9..ec44459 100644 uint16_t key_state, uint16_t code); diff --git a/src/uterm_input_uxkb.c b/src/uterm_input_uxkb.c -index 925c755..5d5c22e 100644 +index 925c755..8fe08f8 100644 --- a/src/uterm_input_uxkb.c +++ b/src/uterm_input_uxkb.c @@ -31,6 +31,9 @@ @@ -128,7 +132,7 @@ index 925c755..5d5c22e 100644 #include #include "shl_hook.h" #include "shl_llog.h" -@@ -178,6 +181,87 @@ static void timer_event(struct ev_timer *timer, uint64_t num, void *data) +@@ -178,6 +181,95 @@ static void timer_event(struct ev_timer *timer, uint64_t num, void *data) shl_hook_call(dev->input->hook, dev->input, &dev->repeat_event); } @@ -169,6 +173,13 @@ index 925c755..5d5c22e 100644 + model, layout, variant); + uxkb_desc_init(dev->input, model, layout, variant, options, NULL); + ++ /* The client will now close the FIFO. Close it too, and re-create a ++ * FIFO so other clients can eventually connect. */ ++ ev_eloop_rm_fd(fd); ++ close(dev->rupdate_fd); ++ dev->rupdate_fd = -1; ++ uxkb_dev_keymap_update(dev); ++ + dev->state = xkb_state_new(dev->input->keymap); + if (!dev->state) { + llog_error(dev->input, "cannot create XKB state"); @@ -186,6 +197,7 @@ index 925c755..5d5c22e 100644 + if (ret < 0) + return ret; + ++ (void) unlink(file); + ret = mkfifo(file, S_IRWXU); + if (ret < 0) { + llog_warn(dev->input, "could not open fifo"); -- cgit 1.4.1