diff options
author | Franck Bui <fbui@suse.com> | 2023-04-20 09:27:52 +0200 |
---|---|---|
committer | Franck Bui <fbui@suse.com> | 2023-04-24 18:44:57 +0200 |
commit | c821ad7d607b21e807c56d9fa8843821c0fd383e (patch) | |
tree | d96643ddf3ee87bcacedbf92a333a79dd3cd2475 | |
parent | 3c7012cdda46f82324bb5a2ead86a6974bba8b91 (diff) | |
download | systemd-c821ad7d607b21e807c56d9fa8843821c0fd383e.tar.gz |
locale: convert generated vconsole keymap to x11 layout automatically
When doing x11->console conversions, find_converted_keymap() searches
automatically for a candidate in the converted keymap directory for a given x11
layout.
However doing console->x11 conversions, this automatic search is not done hence
simple conversion in this direction can't be achieved without populating
kbd-model-map with entries for converted keymaps.
For example, let's consider "at" layout which is not part of kbd-model-map. The
"at" x11 layout has a generated keymap
"/usr/share/kbd/keymaps/xkb/at.map.gz". If we configure "at" for the x11
layout, localed is able to automatically find the "at" converted vc layout and
the conversion just works :
$ localectl set-x11-keymap at
$ localectl
System Locale: LANG=en_US.UTF-8
VC Keymap: at
X11 Layout: at
However in the opposite direction, ie when setting the vc keymap to "at", no
conversion is done and the x11 layout is not defined:
$ localectl set-keymap at
$ localectl
System Locale: LANG=en_US.UTF-8
VC Keymap: at
X11 Layout: (unset)
This patch fixes this limitation as the implemenation is relatively simple and
it removes the need to populate kbd-model-map with (many) entries for converted
keymaps. However the patch doesn't remove the existing entries in kbd-model-map
which became unneeded after this change to be on the safe side.
Note: by default the automatically generated x11 keyboard configs use keyboard
model "microsoftpro" which should be equivalent to "pc105" model but with the
internet/media key mapping added.
-rw-r--r-- | src/locale/localed-util.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/src/locale/localed-util.c b/src/locale/localed-util.c index 65b6108e4e..bcd49fd618 100644 --- a/src/locale/localed-util.c +++ b/src/locale/localed-util.c @@ -655,6 +655,7 @@ static int read_next_mapping( int vconsole_convert_to_x11(const VCContext *vc, X11Context *ret) { _cleanup_fclose_ FILE *f = NULL; const char *map; + X11Context xc; int r; assert(vc); @@ -672,15 +673,12 @@ int vconsole_convert_to_x11(const VCContext *vc, X11Context *ret) { for (unsigned n = 0;;) { _cleanup_strv_free_ char **a = NULL; - X11Context xc; r = read_next_mapping(map, 5, UINT_MAX, f, &n, &a); if (r < 0) return r; - if (r == 0) { - *ret = (X11Context) {}; - return 0; - } + if (r == 0) + break; if (!streq(vc->keymap, a[0])) continue; @@ -697,6 +695,42 @@ int vconsole_convert_to_x11(const VCContext *vc, X11Context *ret) { return x11_context_copy(ret, &xc); } + + /* No custom mapping has been found, see if the keymap is a converted one. In such case deducing the + * corresponding x11 layout is easy. */ + _cleanup_free_ char *xlayout = NULL, *converted = NULL; + char *xvariant; + + xlayout = strdup(vc->keymap); + if (!xlayout) + return -ENOMEM; + xvariant = strchr(xlayout, '-'); + if (xvariant) { + xvariant[0] = '\0'; + xvariant++; + } + + /* Note: by default we use keyboard model "microsoftpro" which should be equivalent to "pc105" but + * with the internet/media key mapping added. */ + xc = (X11Context) { + .layout = xlayout, + .model = (char*) "microsoftpro", + .variant = xvariant, + .options = (char*) "terminate:ctrl_alt_bksp", + }; + + /* This sanity check seems redundant with the verification of the X11 layout done on the next + * step. However xkbcommon is an optional dependency hence the verification might be a NOP. */ + r = find_converted_keymap(&xc, &converted); + if (r < 0) + return r; + + if (r == 0 || x11_context_verify(&xc) < 0) { + *ret = (X11Context) {}; + return 0; + } + + return x11_context_copy(ret, &xc); } int find_converted_keymap(const X11Context *xc, char **ret) { |