summaryrefslogtreecommitdiffstats
path: root/src/locale
diff options
context:
space:
mode:
Diffstat (limited to 'src/locale')
-rw-r--r--src/locale/localed-util.c16
-rw-r--r--src/locale/test-localed-util.c30
2 files changed, 45 insertions, 1 deletions
diff --git a/src/locale/localed-util.c b/src/locale/localed-util.c
index bcd49fd618..02fac9786b 100644
--- a/src/locale/localed-util.c
+++ b/src/locale/localed-util.c
@@ -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;
diff --git a/src/locale/test-localed-util.c b/src/locale/test-localed-util.c
index f57c9ba1f8..cb66dffd48 100644
--- a/src/locale/test-localed-util.c
+++ b/src/locale/test-localed-util.c
@@ -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) {