From a0ccd2acab443f5fa33e464a7e2f756dff2a5e35 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 29 Sep 2011 19:44:32 +0200 Subject: [PATCH] localed: handle multiple X11 kbd layouts https://bugs.freedesktop.org/show_bug.cgi?id=41341 --- src/localed.c | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/src/localed.c b/src/localed.c index 16557b6f..e627c3a7 100644 --- a/src/localed.c +++ b/src/localed.c @@ -860,18 +860,46 @@ static int convert_x11_to_vconsole(DBusConnection *connection) { break; /* Determine how well matching this entry is */ - if (streq_ptr(x11_layout, a[1])) { - matching ++; + if (streq_ptr(x11_layout, a[1])) + /* If we got an exact match, this is best */ + matching = 10; + else { + size_t x; + + x = strcspn(x11_layout, ","); + + /* We have multiple X layouts, look + * for an entry that matches our key + * with the everything but the first + * layout stripped off. */ + if (x > 0 && + strlen(a[1]) == x && + strncmp(x11_layout, a[1], x) == 0) + matching = 5; + else { + size_t w; + + /* If that didn't work, strip + * off the other layouts from + * the entry, too */ + + w = strcspn(a[1], ","); + + if (x > 0 && x == w && + memcmp(x11_layout, a[1], x) == 0) + matching = 1; + } + } + + if (matching > 0 && + streq_ptr(x11_model, a[2])) { + matching++; - if (streq_ptr(x11_model, a[2])) { + if (streq_ptr(x11_variant, a[3])) { matching++; - if (streq_ptr(x11_variant, a[3])) { + if (streq_ptr(x11_options, a[4])) matching++; - - if (streq_ptr(x11_options, a[4])) - matching++; - } } } -- 2.39.5