From: "pelzflorian (Florian Pelz)" <pelzflorian@pelzflorian.de>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: 40493@debbugs.gnu.org
Subject: bug#40493: installer: Provide a way to select multiple keyboard layouts
Date: Wed, 8 Apr 2020 11:58:12 +0200 [thread overview]
Message-ID: <20200408095812.v3kuwakueh44g6mp@pelzflorian.localdomain> (raw)
In-Reply-To: <87wo6r6ngn.fsf@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 725 bytes --]
On Tue, Apr 07, 2020 at 10:38:16PM +0200, Ludovic Courtès wrote:
> I think the approach is OK, even as-is. We can then improve it by
> (hopefully) replacing the hard-coded list of non-Latin layouts (ar, jp,
> etc.) with code that determines whether the main layout is Latin or not.
>
I am still doing final testing, but I believe I can push the attached
patch.
> > + (match first-layout
> > + (("ar" "azerty") (list "ar,fr" "azerty," "grp:alt_shift_toggle"))
> ^
> Remove comma?
The comma is needed, for example the Japanese Kana ("jp" "kana")
layout breaks otherwise. I believe the reason is that the "kana"
variant gets applied to "us" layout.
Regards,
Florian
[-- Attachment #2: 0001-installer-Allow-Alt-Shift-toggle-from-non-Latin-keyb.patch --]
[-- Type: text/plain, Size: 12075 bytes --]
From 68fc18d2816e3997f38d0a3c69566d85b26c8719 Mon Sep 17 00:00:00 2001
From: Florian Pelz <pelzflorian@pelzflorian.de>
Date: Wed, 8 Apr 2020 11:46:16 +0200
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Subject: [PATCH] installer: Allow Alt+Shift toggle from non-Latin keyboard
layouts.
Fixes <https://bugs.gnu.org/40493>.
* gnu/installer/newt/keymap.scm (%non-latin-layouts): New variable.
(toggleable-latin-layout): New procedure to compute combined layouts.
(run-keymap-page): Use it.
(keyboard-layout->configuration): Apply it in config.scm.
* gnu/installer/newt/help.scm (run-help-page): Mention Alt+Shift.
* gnu/installer/keymap.scm (kmscon-update-keymap): Pass on XKB options.
* gnu/installer/record.scm (<installer>): Adjust code comments.
* gnu/installer.scm (apply-keymap): Pass on XKB options.
(installer-steps): Adjust code comments.
* gnu/packages/patches/kmscon-runtime-keymap-switch.patch: Apply XKB options.
---
gnu/installer.scm | 14 ++++---
gnu/installer/keymap.scm | 8 +++-
gnu/installer/newt/help.scm | 5 ++-
gnu/installer/newt/keymap.scm | 40 ++++++++++++++++---
gnu/installer/record.scm | 3 +-
.../kmscon-runtime-keymap-switch.patch | 27 ++++---------
6 files changed, 63 insertions(+), 34 deletions(-)
diff --git a/gnu/installer.scm b/gnu/installer.scm
index 75c5a01570..72b7d195fd 100644
--- a/gnu/installer.scm
+++ b/gnu/installer.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2018, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -170,9 +171,9 @@ been performed at build time."
(define apply-keymap
;; Apply the specified keymap. Use the default keyboard model.
#~(match-lambda
- ((layout variant)
+ ((layout variant options)
(kmscon-update-keymap (default-keyboard-model)
- layout variant))))
+ layout variant options))))
(define* (compute-keymap-step context)
"Return a gexp that runs the keymap-page of INSTALLER and install the
@@ -235,12 +236,13 @@ selected keymap."
;; The installer runs in a kmscon virtual terminal where loadkeys
;; won't work. kmscon uses libxkbcommon as a backend for keyboard
- ;; input. It is possible to update kmscon current keymap by sending it
- ;; a keyboard model, layout and variant, in a somehow similar way as
- ;; what is done with setxkbmap utility.
+ ;; input. It is possible to update kmscon current keymap by sending
+ ;; it a keyboard model, layout, variant and options, in a somehow
+ ;; similar way as what is done with setxkbmap utility.
;;
;; So ask for a keyboard model, layout and variant to update the
- ;; current kmscon keymap.
+ ;; current kmscon keymap. For non-Latin layouts, we add an
+ ;; appropriate second layout and toggle via Alt+Shift.
(installer-step
(id 'keymap)
(description (G_ "Keyboard mapping selection"))
diff --git a/gnu/installer/keymap.scm b/gnu/installer/keymap.scm
index df9fc5e441..d520b782fd 100644
--- a/gnu/installer/keymap.scm
+++ b/gnu/installer/keymap.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -154,8 +155,8 @@ Configuration Database, describing possible XKB configurations."
((models layouts)
(values models layouts)))))
-(define (kmscon-update-keymap model layout variant)
- "Update kmscon keymap with the provided MODEL, LAYOUT and VARIANT."
+(define (kmscon-update-keymap model layout variant options)
+ "Update kmscon keymap with the provided MODEL, LAYOUT, VARIANT and OPTIONS."
(and=>
(getenv "KEYMAP_UPDATE")
(lambda (keymap-file)
@@ -175,4 +176,7 @@ Configuration Database, describing possible XKB configurations."
(put-u8 port 0)
(format port variant)
+ (put-u8 port 0)
+
+ (format port options)
(put-u8 port 0))))))
diff --git a/gnu/installer/newt/help.scm b/gnu/installer/newt/help.scm
index a488f5fa2a..3ccfaf2e54 100644
--- a/gnu/installer/newt/help.scm
+++ b/gnu/installer/newt/help.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -31,7 +32,9 @@
(cons (G_ "Change keyboard layout") keyboard-layout-selection)))
(result
(run-listbox-selection-page
- #:info-text (G_ "This is the help menu, please choose an action.")
+ #:info-text (G_ "This is the help menu. Here you can change your
+keyboard layout. Non-Latin layouts can also be toggled with Alt+Shift.
+Please choose an action.")
#:title (G_ "Installation help")
#:listbox-items items
#:listbox-item->text car
diff --git a/gnu/installer/newt/keymap.scm b/gnu/installer/newt/keymap.scm
index 0147a0b9d5..475ffc2261 100644
--- a/gnu/installer/newt/keymap.scm
+++ b/gnu/installer/newt/keymap.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -112,10 +113,35 @@ You can switch to different layout at any time from the help menu.")))
variants))
(cut append <> <>)))
+(define %non-latin-layouts
+ ;; List of keyboard layouts marked as $nonlatin in xkeyboard-config.
+ '("am" "ara" "ben" "bd" "bg" "bt" "by" "cs" "deva" "ge" "gh"
+ "gr" "guj" "guru" "il" "in" "ir" "iku" "jp" "kan" "kh" "kr"
+ "la" "lao" "lk" "mk" "mm" "mn" "mv" "mal" "olck" "ori" "pk"
+ "ru" "scc" "sy" "syr" "tel" "th" "tj" "tam" "ua" "uz"
+ ;; The list from xkeyboard-config is incomplete. Add more layouts when
+ ;; noticed:
+ "et"))
+
+(define (toggleable-latin-layout layout variant)
+ "If LAYOUT is a non-Latin layout, return a new combined layout,
+a variant, and options that allow the user to switch between the
+non-Latin and the Latin layout. Otherwise, return LAYOUT, VARIANT,
+and the empty string."
+ (if (member layout %non-latin-layouts)
+ (let ((latin-layout (if (string=? variant "azerty") "fr" "us")))
+ (list
+ (string-append layout "," latin-layout)
+ (string-append variant ",") ;comma to use variant only for non-Latin
+ "grp:alt_shift_toggle"))
+ (list layout variant "")))
+
(define* (run-keymap-page layouts #:key (context #f))
"Run a page asking the user to select a keyboard layout and variant. LAYOUTS
-is a list of supported X11-KEYMAP-LAYOUT. Return a list of two elements, the
-names of the selected keyboard layout and variant."
+is a list of supported X11-KEYMAP-LAYOUT. For non-Latin keyboard layouts, a
+second layout and toggle options will be added automatically. Return a list
+of three elements, the names of the selected keyboard layout, variant and
+options."
(define keymap-steps
(list
(installer-step
@@ -151,14 +177,18 @@ names of the selected keyboard layout and variant."
(lambda (variant)
(gettext (x11-keymap-variant-name variant)
"xkeyboard-config")))))
- (list layout (or variant ""))))
+ (apply toggleable-latin-layout
+ (list layout (or variant "")))))
(format-result
(run-installer-steps #:steps keymap-steps)))
(define (keyboard-layout->configuration keymap)
"Return the operating system configuration snippet to install KEYMAP."
(match keymap
- ((name "")
+ ((name "" "")
`((keyboard-layout (keyboard-layout ,name))))
- ((name variant)
+ ((name variant "grp:alt_shift_toggle")
+ `((keyboard-layout (keyboard-layout ,name ,variant
+ #:options '("grp:alt_shift_toggle")))))
+ ((name variant _)
`((keyboard-layout (keyboard-layout ,name ,variant))))))
diff --git a/gnu/installer/record.scm b/gnu/installer/record.scm
index 78acf50c63..13acd33fc6 100644
--- a/gnu/installer/record.scm
+++ b/gnu/installer/record.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -63,7 +64,7 @@
(exit-error installer-exit-error)
;; procedure void -> void
(final-page installer-final-page)
- ;; procedure (layouts context) -> (list layout variant)
+ ;; procedure (layouts context) -> (list layout variant options)
(keymap-page installer-keymap-page)
;; procedure: (#:key supported-locales iso639-languages iso3166-territories)
;; -> glibc-locale
diff --git a/gnu/packages/patches/kmscon-runtime-keymap-switch.patch b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch
index 656c76fa40..deb5688daf 100644
--- a/gnu/packages/patches/kmscon-runtime-keymap-switch.patch
+++ b/gnu/packages/patches/kmscon-runtime-keymap-switch.patch
@@ -1,14 +1,5 @@
-From 360d44d67e7be46108bec982ff2e79b89f04a9a3 Mon Sep 17 00:00:00 2001
-From: Mathieu Othacehe <m.othacehe@gmail.com>
-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(-)
+By Mathieu Othacehe <m.othacehe@gmail.com>.
+Modified by Florian Pelz <pelzflorian@pelzflorian.de>.
diff --git a/src/pty.c b/src/pty.c
index 1443f4a..f64cb5b 100644
@@ -124,7 +115,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..4760972 100644
+index 925c755..5d5c22e 100644
--- a/src/uterm_input_uxkb.c
+++ b/src/uterm_input_uxkb.c
@@ -31,6 +31,9 @@
@@ -137,7 +128,7 @@ index 925c755..4760972 100644
#include <xkbcommon/xkbcommon.h>
#include "shl_hook.h"
#include "shl_llog.h"
-@@ -178,6 +181,86 @@ static void timer_event(struct ev_timer *timer, uint64_t num, void *data)
+@@ -178,6 +181,87 @@ static void timer_event(struct ev_timer *timer, uint64_t num, void *data)
shl_hook_call(dev->input->hook, dev->input, &dev->repeat_event);
}
@@ -145,11 +136,11 @@ index 925c755..4760972 100644
+{
+ struct uterm_input_dev *dev = data;
+ char in;
-+ char keymap[3][255];
++ char keymap[4][255];
+ int pos = 0;
+ int curr_keymap = 0;
+ int ret;
-+ char *model, *layout, *variant;
++ char *model, *layout, *variant, *options;
+
+ if (!(mask & EV_READABLE))
+ return;
@@ -159,6 +150,7 @@ index 925c755..4760972 100644
+ model = keymap[0];
+ layout = keymap[1];
+ variant = keymap[2];
++ options = keymap[3];
+
+ do {
+ ret = read(dev->rupdate_fd, &in, sizeof(in));
@@ -175,7 +167,7 @@ index 925c755..4760972 100644
+
+ llog_info(dev->input, "HANDLER CALLED %s|%s|%s\n",
+ model, layout, variant);
-+ uxkb_desc_init(dev->input, model, layout, variant, NULL, NULL);
++ uxkb_desc_init(dev->input, model, layout, variant, options, NULL);
+
+ dev->state = xkb_state_new(dev->input->keymap);
+ if (!dev->state) {
@@ -224,6 +216,3 @@ index 925c755..4760972 100644
int uxkb_dev_init(struct uterm_input_dev *dev)
{
int ret;
---
-2.17.1
-
--
2.26.0
next prev parent reply other threads:[~2020-04-08 9:59 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-07 17:12 bug#40493: installer: Provide a way to select multiple keyboard layouts Mathieu Othacehe
2020-04-07 17:50 ` pelzflorian (Florian Pelz)
2020-04-07 20:38 ` Ludovic Courtès
2020-04-07 21:56 ` pelzflorian (Florian Pelz)
2020-04-08 9:58 ` pelzflorian (Florian Pelz) [this message]
2020-04-08 13:22 ` Ludovic Courtès
2020-04-09 4:14 ` pelzflorian (Florian Pelz)
2020-04-09 4:21 ` pelzflorian (Florian Pelz)
2020-04-09 7:25 ` Mathieu Othacehe
2020-04-09 7:36 ` pelzflorian (Florian Pelz)
2020-04-09 15:24 ` Ludovic Courtès
2020-04-09 7:54 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200408095812.v3kuwakueh44g6mp@pelzflorian.localdomain \
--to=pelzflorian@pelzflorian.de \
--cc=40493@debbugs.gnu.org \
--cc=ludo@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).