Zbigniew Jędrzejewski-Szmek 930e1b
From 3f3485b6bc8995f0e51e6725d1a4d99d825c8188 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 930e1b
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 930e1b
Date: Mon, 18 Nov 2013 13:42:57 -0500
Zbigniew Jędrzejewski-Szmek 930e1b
Subject: [PATCH] localed: match converted keymaps before legacy
Zbigniew Jędrzejewski-Szmek 930e1b
Zbigniew Jędrzejewski-Szmek 930e1b
Before, X11 keymap fr-pc105-oss would be converted to fr,
Zbigniew Jędrzejewski-Szmek 930e1b
even though fr-oss exists. Now, if
Zbigniew Jędrzejewski-Szmek 930e1b
/usr/lib/kbd/keymaps/xkb/<layout>[-<variant>].map[.gz] exists,
Zbigniew Jędrzejewski-Szmek 930e1b
<layout>[-<variant>] will be used as the console keymap,
Zbigniew Jędrzejewski-Szmek 930e1b
falling back to the legacy mappings otherwise.
Zbigniew Jędrzejewski-Szmek 930e1b
Zbigniew Jędrzejewski-Szmek 930e1b
% sudo localectl set-x11-keymap pl pc105
Zbigniew Jędrzejewski-Szmek 930e1b
% localectl
Zbigniew Jędrzejewski-Szmek 930e1b
   System Locale: LANG=en_US.UTF-8
Zbigniew Jędrzejewski-Szmek 930e1b
       VC Keymap: pl                      (was pl2 before)
Zbigniew Jędrzejewski-Szmek 930e1b
      X11 Layout: pl
Zbigniew Jędrzejewski-Szmek 930e1b
       X11 Model: pc105
Zbigniew Jędrzejewski-Szmek 930e1b
% sudo localectl set-x11-keymap fr pc105 oss
Zbigniew Jędrzejewski-Szmek 930e1b
% localectl
Zbigniew Jędrzejewski-Szmek 930e1b
   System Locale: LANG=en_US.UTF-8
Zbigniew Jędrzejewski-Szmek 930e1b
       VC Keymap: fr-oss                  (was fr before)
Zbigniew Jędrzejewski-Szmek 930e1b
      X11 Layout: fr
Zbigniew Jędrzejewski-Szmek 930e1b
       X11 Model: pc105
Zbigniew Jędrzejewski-Szmek 930e1b
     X11 Variant: oss
Zbigniew Jędrzejewski-Szmek 930e1b
% sudo localectl set-x11-keymap fr pc105
Zbigniew Jędrzejewski-Szmek 930e1b
% localectl
Zbigniew Jędrzejewski-Szmek 930e1b
   System Locale: LANG=en_US.UTF-8
Zbigniew Jędrzejewski-Szmek 930e1b
       VC Keymap: fr
Zbigniew Jędrzejewski-Szmek 930e1b
      X11 Layout: fr
Zbigniew Jędrzejewski-Szmek 930e1b
       X11 Model: pc105
Zbigniew Jędrzejewski-Szmek 930e1b
% sudo localectl set-x11-keymap gb
Zbigniew Jędrzejewski-Szmek 930e1b
% localectl
Zbigniew Jędrzejewski-Szmek 930e1b
   System Locale: LANG=en_US.UTF-8
Zbigniew Jędrzejewski-Szmek 930e1b
       VC Keymap: gb                     (was uk before)
Zbigniew Jędrzejewski-Szmek 930e1b
      X11 Layout: gb
Zbigniew Jędrzejewski-Szmek 930e1b
Zbigniew Jędrzejewski-Szmek 930e1b
Conflicts:
Zbigniew Jędrzejewski-Szmek 930e1b
	src/locale/localed.c
Zbigniew Jędrzejewski-Szmek 930e1b
	src/shared/def.h
Zbigniew Jędrzejewski-Szmek 930e1b
---
Zbigniew Jędrzejewski-Szmek 930e1b
 src/locale/localectl.c |   8 +--
Zbigniew Jędrzejewski-Szmek 930e1b
 src/locale/localed.c   | 189 ++++++++++++++++++++++++++++---------------------
Zbigniew Jędrzejewski-Szmek 930e1b
 src/shared/def.h       |  13 ++++
Zbigniew Jędrzejewski-Szmek 930e1b
 3 files changed, 126 insertions(+), 84 deletions(-)
Zbigniew Jędrzejewski-Szmek 930e1b
Zbigniew Jędrzejewski-Szmek 930e1b
diff --git a/src/locale/localectl.c b/src/locale/localectl.c
Zbigniew Jędrzejewski-Szmek 930e1b
index 8259c0a..d3c6152 100644
Zbigniew Jędrzejewski-Szmek 930e1b
--- a/src/locale/localectl.c
Zbigniew Jędrzejewski-Szmek 930e1b
+++ b/src/locale/localectl.c
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -38,6 +38,7 @@
Zbigniew Jędrzejewski-Szmek 930e1b
 #include "set.h"
Zbigniew Jędrzejewski-Szmek 930e1b
 #include "path-util.h"
Zbigniew Jędrzejewski-Szmek 930e1b
 #include "utf8.h"
Zbigniew Jędrzejewski-Szmek 930e1b
+#include "def.h"
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
 static bool arg_no_pager = false;
Zbigniew Jędrzejewski-Szmek 930e1b
 static enum transport {
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -533,15 +534,14 @@ static int nftw_cb(
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
 static int list_vconsole_keymaps(DBusConnection *bus, char **args, unsigned n) {
Zbigniew Jędrzejewski-Szmek 930e1b
         _cleanup_strv_free_ char **l = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
+        const char *dir;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
         keymaps = set_new(string_hash_func, string_compare_func);
Zbigniew Jędrzejewski-Szmek 930e1b
         if (!keymaps)
Zbigniew Jędrzejewski-Szmek 930e1b
                 return log_oom();
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-        nftw("/usr/share/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS);
Zbigniew Jędrzejewski-Szmek 930e1b
-        nftw("/usr/share/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS);
Zbigniew Jędrzejewski-Szmek 930e1b
-        nftw("/usr/lib/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS);
Zbigniew Jędrzejewski-Szmek 930e1b
-        nftw("/lib/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS);
Zbigniew Jędrzejewski-Szmek 930e1b
+        NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS)
Zbigniew Jędrzejewski-Szmek 930e1b
+                nftw(dir, nftw_cb, 20, FTW_MOUNT|FTW_PHYS);
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
         l = set_get_strv(keymaps);
Zbigniew Jędrzejewski-Szmek 930e1b
         if (!l) {
Zbigniew Jędrzejewski-Szmek 930e1b
diff --git a/src/locale/localed.c b/src/locale/localed.c
Zbigniew Jędrzejewski-Szmek 930e1b
index e160c04..b9b98f4 100644
Zbigniew Jędrzejewski-Szmek 930e1b
--- a/src/locale/localed.c
Zbigniew Jędrzejewski-Szmek 930e1b
+++ b/src/locale/localed.c
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -792,105 +792,135 @@ static int convert_vconsole_to_x11(DBusConnection *connection) {
Zbigniew Jędrzejewski-Szmek 930e1b
         return 0;
Zbigniew Jędrzejewski-Szmek 930e1b
 }
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-static int convert_x11_to_vconsole(DBusConnection *connection) {
Zbigniew Jędrzejewski-Szmek 930e1b
-        bool modified = false;
Zbigniew Jędrzejewski-Szmek 930e1b
+static int find_converted_keymap(char **new_keymap) {
Zbigniew Jędrzejewski-Szmek 930e1b
+        const char *dir;
Zbigniew Jędrzejewski-Szmek 930e1b
+        _cleanup_free_ char *n;
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+        if (state.x11_variant)
Zbigniew Jędrzejewski-Szmek 930e1b
+                n = strjoin(state.x11_layout, "-", state.x11_variant, NULL);
Zbigniew Jędrzejewski-Szmek 930e1b
+        else
Zbigniew Jędrzejewski-Szmek 930e1b
+                n = strdup(state.x11_layout);
Zbigniew Jędrzejewski-Szmek 930e1b
+        if (!n)
Zbigniew Jędrzejewski-Szmek 930e1b
+                return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-        assert(connection);
Zbigniew Jędrzejewski-Szmek 930e1b
+        NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                _cleanup_free_ char *p = NULL, *pz = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-        if (isempty(state.x11_layout)) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                p = strjoin(dir, "xkb/", n, ".map", NULL);
Zbigniew Jędrzejewski-Szmek 930e1b
+                pz = strjoin(dir, "xkb/", n, ".map.gz", NULL);
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (!p || !pz)
Zbigniew Jędrzejewski-Szmek 930e1b
+                        return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                modified =
Zbigniew Jędrzejewski-Szmek 930e1b
-                        !isempty(state.vc_keymap) ||
Zbigniew Jędrzejewski-Szmek 930e1b
-                        !isempty(state.vc_keymap_toggle);
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (access(p, F_OK) == 0 || access(pz, F_OK) == 0) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                        *new_keymap = n;
Zbigniew Jędrzejewski-Szmek 930e1b
+                        n = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
+                        return 1;
Zbigniew Jędrzejewski-Szmek 930e1b
+                }
Zbigniew Jędrzejewski-Szmek 930e1b
+        }
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                free_data_x11();
Zbigniew Jędrzejewski-Szmek 930e1b
-        } else {
Zbigniew Jędrzejewski-Szmek 930e1b
-                FILE *f;
Zbigniew Jędrzejewski-Szmek 930e1b
-                unsigned n = 0;
Zbigniew Jędrzejewski-Szmek 930e1b
-                unsigned best_matching = 0;
Zbigniew Jędrzejewski-Szmek 930e1b
-                char *new_keymap = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
+        return 0;
Zbigniew Jędrzejewski-Szmek 930e1b
+}
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                f = fopen(SYSTEMD_KBD_MODEL_MAP, "re");
Zbigniew Jędrzejewski-Szmek 930e1b
-                if (!f)
Zbigniew Jędrzejewski-Szmek 930e1b
-                        return -errno;
Zbigniew Jędrzejewski-Szmek 930e1b
+static int find_legacy_keymap(char **new_keymap) {
Zbigniew Jędrzejewski-Szmek 930e1b
+        _cleanup_fclose_ FILE *f;
Zbigniew Jędrzejewski-Szmek 930e1b
+        unsigned n = 0;
Zbigniew Jędrzejewski-Szmek 930e1b
+        unsigned best_matching = 0;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                for (;;) {
Zbigniew Jędrzejewski-Szmek 930e1b
-                        char **a;
Zbigniew Jędrzejewski-Szmek 930e1b
-                        unsigned matching = 0;
Zbigniew Jędrzejewski-Szmek 930e1b
-                        int r;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                        r = read_next_mapping(f, &n, &a);
Zbigniew Jędrzejewski-Szmek 930e1b
-                        if (r < 0) {
Zbigniew Jędrzejewski-Szmek 930e1b
-                                fclose(f);
Zbigniew Jędrzejewski-Szmek 930e1b
-                                return r;
Zbigniew Jędrzejewski-Szmek 930e1b
-                        }
Zbigniew Jędrzejewski-Szmek 930e1b
+        f = fopen(SYSTEMD_KBD_MODEL_MAP, "re");
Zbigniew Jędrzejewski-Szmek 930e1b
+        if (!f)
Zbigniew Jędrzejewski-Szmek 930e1b
+                return -errno;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                        if (r == 0)
Zbigniew Jędrzejewski-Szmek 930e1b
-                                break;
Zbigniew Jędrzejewski-Szmek 930e1b
+        for (;;) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                _cleanup_strv_free_ char **a = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
+                unsigned matching = 0;
Zbigniew Jędrzejewski-Szmek 930e1b
+                int r;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                        /* Determine how well matching this entry is */
Zbigniew Jędrzejewski-Szmek 930e1b
-                        if (streq_ptr(state.x11_layout, a[1]))
Zbigniew Jędrzejewski-Szmek 930e1b
-                                /* If we got an exact match, this is best */
Zbigniew Jędrzejewski-Szmek 930e1b
-                                matching = 10;
Zbigniew Jędrzejewski-Szmek 930e1b
-                        else {
Zbigniew Jędrzejewski-Szmek 930e1b
-                                size_t x;
Zbigniew Jędrzejewski-Szmek 930e1b
-
Zbigniew Jędrzejewski-Szmek 930e1b
-                                x = strcspn(state.x11_layout, ",");
Zbigniew Jędrzejewski-Szmek 930e1b
-
Zbigniew Jędrzejewski-Szmek 930e1b
-                                /* We have multiple X layouts, look
Zbigniew Jędrzejewski-Szmek 930e1b
-                                 * for an entry that matches our key
Zbigniew Jędrzejewski-Szmek 930e1b
-                                 * with the everything but the first
Zbigniew Jędrzejewski-Szmek 930e1b
-                                 * layout stripped off. */
Zbigniew Jędrzejewski-Szmek 930e1b
-                                if (x > 0 &&
Zbigniew Jędrzejewski-Szmek 930e1b
-                                    strlen(a[1]) == x &&
Zbigniew Jędrzejewski-Szmek 930e1b
-                                    strneq(state.x11_layout, a[1], x))
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        matching = 5;
Zbigniew Jędrzejewski-Szmek 930e1b
-                                else  {
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        size_t w;
Zbigniew Jędrzejewski-Szmek 930e1b
-
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        /* If that didn't work, strip
Zbigniew Jędrzejewski-Szmek 930e1b
-                                         * off the other layouts from
Zbigniew Jędrzejewski-Szmek 930e1b
-                                         * the entry, too */
Zbigniew Jędrzejewski-Szmek 930e1b
-
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        w = strcspn(a[1], ",");
Zbigniew Jędrzejewski-Szmek 930e1b
-
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        if (x > 0 && x == w &&
Zbigniew Jędrzejewski-Szmek 930e1b
-                                            memcmp(state.x11_layout, a[1], x) == 0)
Zbigniew Jędrzejewski-Szmek 930e1b
-                                                matching = 1;
Zbigniew Jędrzejewski-Szmek 930e1b
-                                }
Zbigniew Jędrzejewski-Szmek 930e1b
+                r = read_next_mapping(f, &n, &a);
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (r < 0)
Zbigniew Jędrzejewski-Szmek 930e1b
+                        return r;
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (r == 0)
Zbigniew Jędrzejewski-Szmek 930e1b
+                        break;
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                /* Determine how well matching this entry is */
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (streq_ptr(state.x11_layout, a[1]))
Zbigniew Jędrzejewski-Szmek 930e1b
+                        /* If we got an exact match, this is best */
Zbigniew Jędrzejewski-Szmek 930e1b
+                        matching = 10;
Zbigniew Jędrzejewski-Szmek 930e1b
+                else {
Zbigniew Jędrzejewski-Szmek 930e1b
+                        size_t x;
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                        x = strcspn(state.x11_layout, ",");
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                        /* We have multiple X layouts, look for an
Zbigniew Jędrzejewski-Szmek 930e1b
+                         * entry that matches our key with everything
Zbigniew Jędrzejewski-Szmek 930e1b
+                         * but the first layout stripped off. */
Zbigniew Jędrzejewski-Szmek 930e1b
+                        if (x > 0 &&
Zbigniew Jędrzejewski-Szmek 930e1b
+                            strlen(a[1]) == x &&
Zbigniew Jędrzejewski-Szmek 930e1b
+                            strneq(state.x11_layout, a[1], x))
Zbigniew Jędrzejewski-Szmek 930e1b
+                                matching = 5;
Zbigniew Jędrzejewski-Szmek 930e1b
+                        else  {
Zbigniew Jędrzejewski-Szmek 930e1b
+                                size_t w;
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                                /* If that didn't work, strip off the
Zbigniew Jędrzejewski-Szmek 930e1b
+                                 * other layouts from the entry, too */
Zbigniew Jędrzejewski-Szmek 930e1b
+                                w = strcspn(a[1], ",");
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                                if (x > 0 && x == w &&
Zbigniew Jędrzejewski-Szmek 930e1b
+                                    memcmp(state.x11_layout, a[1], x) == 0)
Zbigniew Jędrzejewski-Szmek 930e1b
+                                        matching = 1;
Zbigniew Jędrzejewski-Szmek 930e1b
                         }
Zbigniew Jędrzejewski-Szmek 930e1b
+                }
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (matching > 0 &&
Zbigniew Jędrzejewski-Szmek 930e1b
+                    streq_ptr(state.x11_model, a[2])) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                        matching++;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                        if (matching > 0 &&
Zbigniew Jędrzejewski-Szmek 930e1b
-                            streq_ptr(state.x11_model, a[2])) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                        if (streq_ptr(state.x11_variant, a[3])) {
Zbigniew Jędrzejewski-Szmek 930e1b
                                 matching++;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                                if (streq_ptr(state.x11_variant, a[3])) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                                if (streq_ptr(state.x11_options, a[4]))
Zbigniew Jędrzejewski-Szmek 930e1b
                                         matching++;
Zbigniew Jędrzejewski-Szmek 930e1b
-
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        if (streq_ptr(state.x11_options, a[4]))
Zbigniew Jędrzejewski-Szmek 930e1b
-                                                matching++;
Zbigniew Jędrzejewski-Szmek 930e1b
-                                }
Zbigniew Jędrzejewski-Szmek 930e1b
                         }
Zbigniew Jędrzejewski-Szmek 930e1b
+                }
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                        /* The best matching entry so far, then let's
Zbigniew Jędrzejewski-Szmek 930e1b
-                         * save that */
Zbigniew Jędrzejewski-Szmek 930e1b
-                        if (matching > best_matching) {
Zbigniew Jędrzejewski-Szmek 930e1b
-                                best_matching = matching;
Zbigniew Jędrzejewski-Szmek 930e1b
+                /* The best matching entry so far, then let's save that */
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (matching > best_matching) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                        best_matching = matching;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                                free(new_keymap);
Zbigniew Jędrzejewski-Szmek 930e1b
-                                new_keymap = strdup(a[0]);
Zbigniew Jędrzejewski-Szmek 930e1b
+                        free(*new_keymap);
Zbigniew Jędrzejewski-Szmek 930e1b
+                        *new_keymap = strdup(a[0]);
Zbigniew Jędrzejewski-Szmek 930e1b
+                        if (!*new_keymap)
Zbigniew Jędrzejewski-Szmek 930e1b
+                                return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 930e1b
+                }
Zbigniew Jędrzejewski-Szmek 930e1b
+        }
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                                if (!new_keymap) {
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        strv_free(a);
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        fclose(f);
Zbigniew Jędrzejewski-Szmek 930e1b
-                                        return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 930e1b
-                                }
Zbigniew Jędrzejewski-Szmek 930e1b
-                        }
Zbigniew Jędrzejewski-Szmek 930e1b
+        return 0;
Zbigniew Jędrzejewski-Szmek 930e1b
+}
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                        strv_free(a);
Zbigniew Jędrzejewski-Szmek 930e1b
-                }
Zbigniew Jędrzejewski-Szmek 930e1b
+static int convert_x11_to_vconsole(DBusConnection *connection) {
Zbigniew Jędrzejewski-Szmek 930e1b
+        bool modified = false;
Zbigniew Jędrzejewski-Szmek 930e1b
+        int r;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
-                fclose(f);
Zbigniew Jędrzejewski-Szmek 930e1b
+        assert(connection);
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+        if (isempty(state.x11_layout)) {
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                modified =
Zbigniew Jędrzejewski-Szmek 930e1b
+                        !isempty(state.vc_keymap) ||
Zbigniew Jędrzejewski-Szmek 930e1b
+                        !isempty(state.vc_keymap_toggle);
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                free_data_x11();
Zbigniew Jędrzejewski-Szmek 930e1b
+        } else {
Zbigniew Jędrzejewski-Szmek 930e1b
+                char *new_keymap = NULL;
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+                r = find_converted_keymap(&new_keymap);
Zbigniew Jędrzejewski-Szmek 930e1b
+                if (r < 0)
Zbigniew Jędrzejewski-Szmek 930e1b
+                        return r;
Zbigniew Jędrzejewski-Szmek 930e1b
+                else if (r == 0) {
Zbigniew Jędrzejewski-Szmek 930e1b
+                        r = find_legacy_keymap(&new_keymap);
Zbigniew Jędrzejewski-Szmek 930e1b
+                        if (r < 0)
Zbigniew Jędrzejewski-Szmek 930e1b
+                                return r;
Zbigniew Jędrzejewski-Szmek 930e1b
+                }
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
                 if (!streq_ptr(state.vc_keymap, new_keymap)) {
Zbigniew Jędrzejewski-Szmek 930e1b
                         free(state.vc_keymap);
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -907,7 +937,6 @@ static int convert_x11_to_vconsole(DBusConnection *connection) {
Zbigniew Jędrzejewski-Szmek 930e1b
         if (modified) {
Zbigniew Jędrzejewski-Szmek 930e1b
                 dbus_bool_t b;
Zbigniew Jędrzejewski-Szmek 930e1b
                 DBusMessage *changed;
Zbigniew Jędrzejewski-Szmek 930e1b
-                int r;
Zbigniew Jędrzejewski-Szmek 930e1b
 
Zbigniew Jędrzejewski-Szmek 930e1b
                 r = write_data_vconsole();
Zbigniew Jędrzejewski-Szmek 930e1b
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 930e1b
diff --git a/src/shared/def.h b/src/shared/def.h
Zbigniew Jędrzejewski-Szmek 930e1b
index e4ef735..58c834c 100644
Zbigniew Jędrzejewski-Szmek 930e1b
--- a/src/shared/def.h
Zbigniew Jędrzejewski-Szmek 930e1b
+++ b/src/shared/def.h
Zbigniew Jędrzejewski-Szmek 930e1b
@@ -41,3 +41,16 @@
Zbigniew Jędrzejewski-Szmek 930e1b
 #define LOWERCASE_LETTERS "abcdefghijklmnopqrstuvwxyz"
Zbigniew Jędrzejewski-Szmek 930e1b
 #define UPPERCASE_LETTERS "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Zbigniew Jędrzejewski-Szmek 930e1b
 #define LETTERS LOWERCASE_LETTERS UPPERCASE_LETTERS
Zbigniew Jędrzejewski-Szmek 930e1b
+
Zbigniew Jędrzejewski-Szmek 930e1b
+#ifdef HAVE_SPLIT_USR
Zbigniew Jędrzejewski-Szmek 930e1b
+#define KBD_KEYMAP_DIRS                         \
Zbigniew Jędrzejewski-Szmek 930e1b
+        "/usr/share/keymaps/\0"                 \
Zbigniew Jędrzejewski-Szmek 930e1b
+        "/usr/share/kbd/keymaps/\0"             \
Zbigniew Jędrzejewski-Szmek 930e1b
+        "/usr/lib/kbd/keymaps/\0"               \
Zbigniew Jędrzejewski-Szmek 930e1b
+        "/lib/kbd/keymaps/\0"
Zbigniew Jędrzejewski-Szmek 930e1b
+#else
Zbigniew Jędrzejewski-Szmek 930e1b
+#define KBD_KEYMAP_DIRS                         \
Zbigniew Jędrzejewski-Szmek 930e1b
+        "/usr/share/keymaps/\0"                 \
Zbigniew Jędrzejewski-Szmek 930e1b
+        "/usr/share/kbd/keymaps/\0"             \
Zbigniew Jędrzejewski-Szmek 930e1b
+        "/usr/lib/kbd/keymaps/\0"
Zbigniew Jędrzejewski-Szmek 930e1b
+#endif