]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
locale: when no xvariant match select the entry with an empty xvariant 27355/head
authorFranck Bui <fbui@suse.com>
Thu, 20 Apr 2023 07:47:35 +0000 (09:47 +0200)
committerFranck Bui <fbui@suse.com>
Wed, 26 Apr 2023 06:15:17 +0000 (08:15 +0200)
When doing a conversion and the specified 'xc->xvariant' has no match, select
the x11 layout entry with a matching layout and an empty xvariant if such entry
exists. It's still better than no conversion at all.

src/locale/localed-util.c
src/locale/test-localed-util.c
test/units/testsuite-73.sh

index bcd49fd618b9ca140a85926e239802effba7c161..02fac9786b27f5140805e34f19b142a6dfc1524c 100644 (file)
@@ -722,6 +722,11 @@ int vconsole_convert_to_x11(const VCContext *vc, X11Context *ret) {
         /* 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 && xc.variant) {
+                /* If we still haven't find a match, try with no variant, it's still better than nothing.  */
+                xc.variant = NULL;
+                r = find_converted_keymap(&xc, &converted);
+        }
         if (r < 0)
                 return r;
 
@@ -890,8 +895,17 @@ int x11_convert_to_vconsole(const X11Context *xc, VCContext *ret) {
         }
 
         r = find_converted_keymap(xc, &keymap);
-        if (r == 0)
+        if (r == 0) {
                 r = find_legacy_keymap(xc, &keymap);
+                if (r == 0 && xc->variant)
+                        /* If we still haven't find a match, try with no variant, it's still better than
+                         * nothing.  */
+                        r = find_converted_keymap(
+                                        &(X11Context) {
+                                                .layout = xc->layout,
+                                        },
+                                        &keymap);
+        }
         if (r < 0)
                 return r;
 
index f57c9ba1f88d04fe3dc2a494628576af0b522da5..cb66dffd4888c128f1d9c7ae5db4bcc105a20449 100644 (file)
@@ -44,6 +44,7 @@ TEST(find_converted_keymap) {
 
         assert_se(r == 1);
         assert_se(streq(ans, "pl"));
+        ans = mfree(ans);
 
         assert_se(find_converted_keymap(
                         &(X11Context) {
@@ -73,6 +74,7 @@ TEST(find_legacy_keymap) {
 TEST(vconsole_convert_to_x11) {
         _cleanup_(x11_context_clear) X11Context xc = {};
         _cleanup_(vc_context_clear) VCContext vc = {};
+        int r;
 
         log_info("/* test empty keymap */");
         assert_se(vconsole_convert_to_x11(&vc, &xc) >= 0);
@@ -111,6 +113,34 @@ TEST(vconsole_convert_to_x11) {
         assert_se(vconsole_convert_to_x11(&vc, &xc) >= 0);
         assert_se(streq(xc.layout, "us"));
         assert_se(xc.variant == NULL);
+        x11_context_clear(&xc);
+
+        /* "gh" has no mapping in kbd-model-map and kbd provides a converted keymap for this layout. */
+        log_info("/* test with a converted keymap (gh:) */");
+        assert_se(free_and_strdup(&vc.keymap, "gh") >= 0);
+        r = vconsole_convert_to_x11(&vc, &xc);
+        if (r == 0) {
+                log_info("Skipping rest of %s: keymaps are not installed", __func__);
+                return;
+        }
+        assert_se(r > 0);
+        assert_se(streq(xc.layout, "gh"));
+        assert_se(xc.variant == NULL);
+        x11_context_clear(&xc);
+
+        log_info("/* test with converted keymap and with a known variant (gh:ewe) */");
+        assert_se(free_and_strdup(&vc.keymap, "gh-ewe") >= 0);
+        assert_se(vconsole_convert_to_x11(&vc, &xc) > 0);
+        assert_se(streq(xc.layout, "gh"));
+        assert_se(streq(xc.variant, "ewe"));
+        x11_context_clear(&xc);
+
+        log_info("/* test with converted keymap and with an unknown variant (gh:ewe) */");
+        assert_se(free_and_strdup(&vc.keymap, "gh-foobar") > 0);
+        assert_se(vconsole_convert_to_x11(&vc, &xc) > 0);
+        assert_se(streq(xc.layout, "gh"));
+        assert_se(xc.variant == NULL);
+        x11_context_clear(&xc);
 }
 
 TEST(x11_convert_to_vconsole) {
index e5ac09c2e3533dcc430576078bbf96aa36c1716a..56000b96d20f770dc06406f5a3398b9bb6f9070b 100755 (executable)
@@ -273,15 +273,15 @@ test_vc_keymap() {
             assert_in "XKBVARIANT=intl" "$vc"
             assert_in "XKBOPTIONS=terminate:ctrl_alt_bksp" "$vc"
         elif [[ "$i" =~ ^us-.* ]]; then
-            assert_in "X11 Layout: .unset." "$output"
-            assert_not_in "X11 Model:" "$output"
-            assert_not_in "X11 Variant:" "$output"
-            assert_not_in "X11 Options:" "$output"
+            assert_in "X11 Layout: us" "$output"
+            assert_in "X11 Model: microsoftpro" "$output"
+            assert_in "X11 Variant:" "$output"
+            assert_in "X11 Options: terminate:ctrl_alt_bksp" "$output"
 
-            assert_not_in "XKBLAYOUT" "$vc"
-            assert_not_in "XKBMODEL" "$vc"
-            assert_not_in "XKBVARIANT" "$vc"
-            assert_not_in "XKBOPTIONS" "$vc"
+            assert_in "XKBLAYOUT=us" "$vc"
+            assert_in "XKBMODEL=microsoftpro" "$vc"
+            assert_in "XKBVARIANT=" "$vc"
+            assert_in "XKBOPTIONS=terminate:ctrl_alt_bksp" "$vc"
         fi
     done