03/04: gnu: kmscon: Add runtime keymap update support.
mothacehe pushed a commit to branch wip-newt-installer in repository guix. commit 875e11a5d0a43d44cff11223d77559dcb767c3b7 Author: Mathieu Othacehe Date: Fri Nov 16 20:40:26 2018 +0900 gnu: kmscon: Add runtime keymap update support. * gnu/packages/patches/kmscon-runtime-keymap-switch.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/terminals.scm (kmscon)[source]: Add patch. --- gnu/local.mk | 1 + .../patches/kmscon-runtime-keymap-switch.patch | 229 + gnu/packages/terminals.scm | 2 + 3 files changed, 232 insertions(+) diff --git a/gnu/local.mk b/gnu/local.mk index 2a90a85..457dfe0 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -843,6 +843,7 @@ dist_patch_DATA = \ %D%/packages/patches/kiki-missing-includes.patch \ %D%/packages/patches/kiki-portability-64bit.patch\ %D%/packages/patches/kmod-module-directory.patch \ + %D%/packages/patches/kmscon-runtime-keymap-switch.patch \ %D%/packages/patches/kobodeluxe-paths.patch \ %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch \ %D%/packages/patches/kobodeluxe-const-charp-conversion.patch \ diff --git a/gnu/packages/patches/kmscon-runtime-keymap-switch.patch b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch new file mode 100644 index 000..656c76f --- /dev/null +++ b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch @@ -0,0 +1,229 @@ +From 360d44d67e7be46108bec982ff2e79b89f04a9a3 Mon Sep 17 00:00:00 2001 +From: Mathieu Othacehe +Date: Thu, 15 Nov 2018 14:34:40 +0900 +Subject: [PATCH] add runtime keymap switch support. + +--- + src/pty.c | 23 ++- + src/uterm_input.c | 2 + + src/uterm_input_internal.h | 5 +++ + src/uterm_input_uxkb.c | 83 ++ + 4 files changed, 111 insertions(+), 2 deletions(-) + +diff --git a/src/pty.c b/src/pty.c +index 1443f4a..f64cb5b 100644 +--- a/src/pty.c b/src/pty.c +@@ -46,6 +46,8 @@ + + #define KMSCON_NREAD 16384 + ++#define INPUT_KEYMAP_UPDATE_FILE "/tmp/kmscon-%d-keymap-update" ++ + struct kmscon_pty { + unsigned long ref; + struct ev_eloop *eloop; +@@ -241,9 +243,22 @@ static bool pty_is_open(struct kmscon_pty *pty) + return pty->fd >= 0; + } + ++static int kmscon_keymap_update(pid_t pid) ++{ ++ char *file; ++ int ret; ++ ++ ret = asprintf(, INPUT_KEYMAP_UPDATE_FILE, pid); ++ if (ret < 0) ++ return ret; ++ ++ return setenv("KEYMAP_UPDATE", file, 1); ++} ++ + static void __attribute__((noreturn)) + exec_child(const char *term, const char *colorterm, char **argv, +- const char *seat, const char *vtnr, bool env_reset) ++ const char *seat, const char *vtnr, bool env_reset, ++ pid_t kmscon_pid) + { + char **env; + char **def_argv; +@@ -277,6 +292,8 @@ exec_child(const char *term, const char *colorterm, char **argv, + if (vtnr) + setenv("XDG_VTNR", vtnr, 1); + ++ kmscon_keymap_update(kmscon_pid); ++ + execve(argv[0], argv, environ); + + log_err("failed to exec child %s: %m", argv[0]); +@@ -383,12 +400,14 @@ static int pty_spawn(struct kmscon_pty *pty, int master, + unsigned short width, unsigned short height) + { + pid_t pid; ++ pid_t kmscon_pid; + struct winsize ws; + + memset(, 0, sizeof(ws)); + ws.ws_col = width; + ws.ws_row = height; + ++ kmscon_pid = getpid(); + pid = fork(); + switch (pid) { + case -1: +@@ -397,7 +416,7 @@ static int pty_spawn(struct kmscon_pty *pty, int master, + case 0: + setup_child(master, ); + exec_child(pty->term, pty->colorterm, pty->argv, pty->seat, +- pty->vtnr, pty->env_reset); ++ pty->vtnr, pty->env_reset, kmscon_pid); + exit(EXIT_FAILURE); + default: + log_debug("forking child %d", pid); +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, + if (ret) + goto err_rcodepoints; + ++ uxkb_dev_keymap_update(dev); ++ + if (input->awake > 0) { + ret = input_wake_up_dev(dev); + if (ret) +diff --git a/src/uterm_input_internal.h b/src/uterm_input_internal.h +index 04e6cc9..ec44459 100644 +--- a/src/uterm_input_internal.h b/src/uterm_input_internal.h +@@ -39,6 +39,8 @@ + #include "shl_misc.h" + #include "uterm_input.h" + ++#define INPUT_KEYMAP_UPDATE_FILE "/tmp/kmscon-%d-keymap-update" ++ + enum uterm_input_device_capability { + UTERM_DEVICE_HAS_KEYS = (1 << 0), + UTERM_DEVICE_HAS_LEDS = (1 << 1),
03/04: gnu: kmscon: Add runtime keymap update support.
mothacehe pushed a commit to branch wip-newt-installer in repository guix. commit 605d3e72491d25fbfcf3193fbc802a1e79c00c1b Author: Mathieu Othacehe Date: Fri Nov 16 20:40:26 2018 +0900 gnu: kmscon: Add runtime keymap update support. * gnu/packages/patches/kmscon-runtime-keymap-switch.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/terminals.scm (kmscon)[source]: Add patch. --- gnu/local.mk | 1 + .../patches/kmscon-runtime-keymap-switch.patch | 229 + gnu/packages/terminals.scm | 2 + 3 files changed, 232 insertions(+) diff --git a/gnu/local.mk b/gnu/local.mk index 026c647..0020a16 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -843,6 +843,7 @@ dist_patch_DATA = \ %D%/packages/patches/kiki-missing-includes.patch \ %D%/packages/patches/kiki-portability-64bit.patch\ %D%/packages/patches/kmod-module-directory.patch \ + %D%/packages/patches/kmscon-runtime-keymap-switch.patch \ %D%/packages/patches/kobodeluxe-paths.patch \ %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch \ %D%/packages/patches/kobodeluxe-const-charp-conversion.patch \ diff --git a/gnu/packages/patches/kmscon-runtime-keymap-switch.patch b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch new file mode 100644 index 000..656c76f --- /dev/null +++ b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch @@ -0,0 +1,229 @@ +From 360d44d67e7be46108bec982ff2e79b89f04a9a3 Mon Sep 17 00:00:00 2001 +From: Mathieu Othacehe +Date: Thu, 15 Nov 2018 14:34:40 +0900 +Subject: [PATCH] add runtime keymap switch support. + +--- + src/pty.c | 23 ++- + src/uterm_input.c | 2 + + src/uterm_input_internal.h | 5 +++ + src/uterm_input_uxkb.c | 83 ++ + 4 files changed, 111 insertions(+), 2 deletions(-) + +diff --git a/src/pty.c b/src/pty.c +index 1443f4a..f64cb5b 100644 +--- a/src/pty.c b/src/pty.c +@@ -46,6 +46,8 @@ + + #define KMSCON_NREAD 16384 + ++#define INPUT_KEYMAP_UPDATE_FILE "/tmp/kmscon-%d-keymap-update" ++ + struct kmscon_pty { + unsigned long ref; + struct ev_eloop *eloop; +@@ -241,9 +243,22 @@ static bool pty_is_open(struct kmscon_pty *pty) + return pty->fd >= 0; + } + ++static int kmscon_keymap_update(pid_t pid) ++{ ++ char *file; ++ int ret; ++ ++ ret = asprintf(, INPUT_KEYMAP_UPDATE_FILE, pid); ++ if (ret < 0) ++ return ret; ++ ++ return setenv("KEYMAP_UPDATE", file, 1); ++} ++ + static void __attribute__((noreturn)) + exec_child(const char *term, const char *colorterm, char **argv, +- const char *seat, const char *vtnr, bool env_reset) ++ const char *seat, const char *vtnr, bool env_reset, ++ pid_t kmscon_pid) + { + char **env; + char **def_argv; +@@ -277,6 +292,8 @@ exec_child(const char *term, const char *colorterm, char **argv, + if (vtnr) + setenv("XDG_VTNR", vtnr, 1); + ++ kmscon_keymap_update(kmscon_pid); ++ + execve(argv[0], argv, environ); + + log_err("failed to exec child %s: %m", argv[0]); +@@ -383,12 +400,14 @@ static int pty_spawn(struct kmscon_pty *pty, int master, + unsigned short width, unsigned short height) + { + pid_t pid; ++ pid_t kmscon_pid; + struct winsize ws; + + memset(, 0, sizeof(ws)); + ws.ws_col = width; + ws.ws_row = height; + ++ kmscon_pid = getpid(); + pid = fork(); + switch (pid) { + case -1: +@@ -397,7 +416,7 @@ static int pty_spawn(struct kmscon_pty *pty, int master, + case 0: + setup_child(master, ); + exec_child(pty->term, pty->colorterm, pty->argv, pty->seat, +- pty->vtnr, pty->env_reset); ++ pty->vtnr, pty->env_reset, kmscon_pid); + exit(EXIT_FAILURE); + default: + log_debug("forking child %d", pid); +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, + if (ret) + goto err_rcodepoints; + ++ uxkb_dev_keymap_update(dev); ++ + if (input->awake > 0) { + ret = input_wake_up_dev(dev); + if (ret) +diff --git a/src/uterm_input_internal.h b/src/uterm_input_internal.h +index 04e6cc9..ec44459 100644 +--- a/src/uterm_input_internal.h b/src/uterm_input_internal.h +@@ -39,6 +39,8 @@ + #include "shl_misc.h" + #include "uterm_input.h" + ++#define INPUT_KEYMAP_UPDATE_FILE "/tmp/kmscon-%d-keymap-update" ++ + enum uterm_input_device_capability { + UTERM_DEVICE_HAS_KEYS = (1 << 0), + UTERM_DEVICE_HAS_LEDS = (1 << 1),