03/04: gnu: kmscon: Add runtime keymap update support.

2018-11-16 Thread Mathieu Othacehe
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.

2018-11-16 Thread Mathieu Othacehe
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),