X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flocaled.c;h=e627c3a716e4bd7baac16898cc1d7f536d0d0bc2;hp=16557b6f2b50cca560df9f45a02a3ba8e819d668;hb=a0ccd2acab443f5fa33e464a7e2f756dff2a5e35;hpb=f176b5c296ad36119aa2464f9fd738e6da59eeee diff --git a/src/localed.c b/src/localed.c index 16557b6f2..e627c3a71 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++; - } } }