summary refs log tree commit diff
path: root/gnu/packages/patches/kmscon-runtime-keymap-switch.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/kmscon-runtime-keymap-switch.patch')
-rw-r--r--gnu/packages/patches/kmscon-runtime-keymap-switch.patch49
1 files changed, 37 insertions, 12 deletions
diff --git a/gnu/packages/patches/kmscon-runtime-keymap-switch.patch b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch
index deb5688daf..6692e761bc 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 <m.othacehe@gmail.com>.
-Modified by Florian Pelz <pelzflorian@pelzflorian.de>.
+Make kmscon listen to a FIFO in /tmp that clients can write to
+to request a keymap change.
+
+Patch by Mathieu Othacehe <m.othacehe@gmail.com>.
+Modified by Florian Pelz <pelzflorian@pelzflorian.de>
+and Ludovic Courtès <ludo@gnu.org>.
 
 diff --git a/src/pty.c b/src/pty.c
 index 1443f4a..f64cb5b 100644
@@ -75,11 +79,13 @@ diff --git a/src/uterm_input.c b/src/uterm_input.c
 index 6fcbc4b..990a09d 100644
 --- a/src/uterm_input.c
 +++ b/src/uterm_input.c
-@@ -178,6 +178,8 @@ static void input_new_dev(struct uterm_input *input,
+@@ -178,6 +178,10 @@ static void input_new_dev(struct uterm_input *input,
  	if (ret)
  		goto err_rcodepoints;
  
-+	uxkb_dev_keymap_update(dev);
++       /* Add the FIFO fd only to the first input poll loop. */
++       if (shl_dlist_empty(&input->devices))
++       	uxkb_dev_keymap_update(dev);
 +
  	if (input->awake > 0) {
  		ret = input_wake_up_dev(dev);
@@ -115,7 +121,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 +134,7 @@ index 925c755..5d5c22e 100644
  #include <xkbcommon/xkbcommon.h>
  #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,106 @@ static void timer_event(struct ev_timer *timer, uint64_t num, void *data)
  	shl_hook_call(dev->input->hook, dev->input, &dev->repeat_event);
  }
  
@@ -167,13 +173,31 @@ index 925c755..5d5c22e 100644
 +
 +	llog_info(dev->input, "HANDLER CALLED %s|%s|%s\n",
 +		  model, layout, variant);
-+	uxkb_desc_init(dev->input, model, layout, variant, options, NULL);
 +
-+	dev->state = xkb_state_new(dev->input->keymap);
-+	if (!dev->state) {
-+		llog_error(dev->input, "cannot create XKB state");
-+		return;
-+	}
++	struct uterm_input *input = dev->input;
++	struct shl_dlist *iter;
++
++       /* Apply the new layout to all the inputs. */
++       shl_dlist_for_each(iter, &input->devices) {
++       	struct uterm_input_dev *dev;
++		dev = shl_dlist_entry(iter,
++					struct uterm_input_dev,
++					list);
++	        uxkb_desc_init(dev->input, model, layout, variant, options, NULL);
++               dev->state = xkb_state_new(dev->input->keymap);
++               if (!dev->state) {
++               	llog_error(dev->input, "cannot create XKB state");
++                      	return;
++                }
++       }
++
++	/* 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);
++
 +}
 +
 +int uxkb_dev_keymap_update(struct uterm_input_dev *dev)
@@ -186,6 +210,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");