localed: also report when we couldn't convert X11→console

Rework the code a bit where find_converted_keymap cannot (and should not) be
called with a null layout, so streq can be used instead of streq_ptr, etc.

Note that the behaviour of vconsole_convert_to_x11 and x11_convert_to_vconsole
is not symmetrical. When the latter cannot find a match, it simply makes the
vconsole mapping empty. But vconsole_convert_to_x11 leaves the x11 layout
unchanged. I don't know what the proper solution is here, so I'm just adding
more verbose logging without changing the logic.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2016-06-06 09:22:33 -04:00
parent 6f3287b346
commit 5ad327dda2
2 changed files with 16 additions and 7 deletions
+14 -5
View File
@@ -35,9 +35,11 @@
#include "strv.h"
static bool startswith_comma(const char *s, const char *prefix) {
const char *t;
s = startswith(s, prefix);
if (!s)
return false;
return s && (t = startswith(s, prefix)) && (*t == ',');
return *s == ',';
}
static const char* strnulldash(const char *s) {
@@ -529,6 +531,8 @@ int find_legacy_keymap(Context *c, char **new_keymap) {
unsigned best_matching = 0;
int r;
assert(!isempty(c->x11_layout));
f = fopen(SYSTEMD_KBD_MODEL_MAP, "re");
if (!f)
return -errno;
@@ -544,7 +548,7 @@ int find_legacy_keymap(Context *c, char **new_keymap) {
break;
/* Determine how well matching this entry is */
if (streq_ptr(c->x11_layout, a[1]))
if (streq(c->x11_layout, a[1]))
/* If we got an exact match, this is best */
matching = 10;
else {
@@ -611,7 +615,7 @@ int find_legacy_keymap(Context *c, char **new_keymap) {
}
}
return 0;
return (bool) *new_keymap;
}
int find_language_fallback(const char *lang, char **language) {
@@ -648,7 +652,6 @@ int x11_convert_to_vconsole(Context *c) {
bool modified = false;
if (isempty(c->x11_layout)) {
modified =
!isempty(c->vc_keymap) ||
!isempty(c->vc_keymap_toggle);
@@ -666,6 +669,12 @@ int x11_convert_to_vconsole(Context *c) {
if (r < 0)
return r;
}
if (r == 0)
/* We search for layout-variant match first, but then we also look
* for anything which matches just the layout. So it's accurate to say
* that we couldn't find anything which matches the layout. */
log_notice("No conversion to virtual console map found for \"%s\".",
c->x11_layout);
if (!streq_ptr(c->vc_keymap, new_keymap)) {
free(c->vc_keymap);
+2 -2
View File
@@ -84,11 +84,11 @@ static void test_find_legacy_keymap(void) {
assert_se(ans == NULL);
c.x11_layout = (char*) "pl";
assert_se(find_legacy_keymap(&c, &ans) == 0); /* should this be 1? */
assert_se(find_legacy_keymap(&c, &ans) == 1);
assert_se(streq(ans, "pl2"));
c.x11_layout = (char*) "pl,ru";
assert_se(find_legacy_keymap(&c, &ans2) == 0); /* should this be 1? */
assert_se(find_legacy_keymap(&c, &ans2) == 1);
assert_se(streq(ans, "pl2"));
}