summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/locale/localed.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/src/locale/localed.c b/src/locale/localed.c
index 777da623f6..f3e1589a45 100644
--- a/src/locale/localed.c
+++ b/src/locale/localed.c
@@ -101,6 +101,12 @@ static void free_and_replace(char **s, char *v) {
*s = v;
}
+static bool startswith_comma(const char *s, const char *prefix) {
+ const char *t;
+
+ return s && (t = startswith(s, prefix)) && (*t == ',');
+}
+
static void context_free_x11(Context *c) {
free_and_replace(&c->x11_layout, NULL);
free_and_replace(&c->x11_model, NULL);
@@ -679,26 +685,18 @@ static int find_legacy_keymap(Context *c, char **new_keymap) {
/* If we got an exact match, this is best */
matching = 10;
else {
- size_t x;
-
- x = strcspn(c->x11_layout, ",");
-
/* We have multiple X layouts, look for an
* entry that matches our key with everything
* but the first layout stripped off. */
- if (x > 0 &&
- strlen(a[1]) == x &&
- strneq(c->x11_layout, a[1], x))
+ if (startswith_comma(c->x11_layout, a[1]))
matching = 5;
else {
- size_t w;
+ char *x;
/* If that didn't work, strip off the
* other layouts from the entry, too */
- w = strcspn(a[1], ",");
-
- if (x > 0 && x == w &&
- memcmp(c->x11_layout, a[1], x) == 0)
+ x = strndupa(a[1], strcspn(a[1], ","));
+ if (startswith_comma(c->x11_layout, x))
matching = 1;
}
}