X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fidev-keyboard.c;h=8dc1c20b1430f8ee29c751cfda57f36dcd37c27a;hb=ed7fb9cb235d2aedb755dcb8a5a5d9cdffba1519;hp=647aade9326a990d2d88b0cc0e868f4e7d79cf11;hpb=e06cc7b07465369fb7c01c9778b84cf82c82fdcf;p=elogind.git diff --git a/src/libsystemd-terminal/idev-keyboard.c b/src/libsystemd-terminal/idev-keyboard.c index 647aade93..8dc1c20b1 100644 --- a/src/libsystemd-terminal/idev-keyboard.c +++ b/src/libsystemd-terminal/idev-keyboard.c @@ -312,17 +312,19 @@ static int kbdctx_locale_props_changed_fn(sd_bus *bus, sd_bus_message *signal, void *userdata, sd_bus_error *ret_err) { - _cleanup_bus_message_unref_ sd_bus_message *m = NULL; kbdctx *kc = userdata; int r; kc->slot_locale_get_all = sd_bus_slot_unref(kc->slot_locale_get_all); + /* skip interface name */ + r = sd_bus_message_skip(signal, "s"); + if (r < 0) + goto error; + r = bus_message_map_properties_changed(bus, signal, kbdctx_locale_map, kc); - if (r < 0) { - log_debug("idev-keyboard: cannot handle PropertiesChanged from locale1: %s", strerror(-r)); - return r; - } + if (r < 0) + goto error; if (r > 0) { r = kbdctx_query_locale(kc); @@ -332,6 +334,10 @@ static int kbdctx_locale_props_changed_fn(sd_bus *bus, kbdctx_refresh_keymap(kc); return 0; + +error: + log_debug("idev-keyboard: cannot handle PropertiesChanged from locale1: %s", strerror(-r)); + return r; } static int kbdctx_setup_bus(kbdctx *kc) { @@ -551,6 +557,7 @@ int idev_keyboard_new(idev_device **out, idev_session *s, const char *name) { static void keyboard_free(idev_device *d) { idev_keyboard *k = keyboard_from_device(d); + xkb_state_unref(k->xkb_state); free(k->repdata.keyboard.codepoints); free(k->repdata.keyboard.keysyms); free(k->evdata.keyboard.codepoints); @@ -568,7 +575,7 @@ static int8_t guess_ascii(struct xkb_state *state, uint32_t code, uint32_t n_sym const xkb_keysym_t *s; int num; - if (n_syms == 1 && syms[0] < 128) + if (n_syms == 1 && syms[0] < 128 && syms[0] > 0) return syms[0]; keymap = xkb_state_get_keymap(state); @@ -577,7 +584,7 @@ static int8_t guess_ascii(struct xkb_state *state, uint32_t code, uint32_t n_sym for (lo = 0; lo < n_lo; ++lo) { lv = xkb_state_key_get_level(state, code + KBDXKB_SHIFT, lo); num = xkb_keymap_key_get_syms_by_level(keymap, code + KBDXKB_SHIFT, lo, lv, &s); - if (num == 1 && s[0] < 128) + if (num == 1 && s[0] < 128 && s[0] > 0) return s[0]; } @@ -763,8 +770,10 @@ static int keyboard_feed_evdev(idev_keyboard *k, idev_data *data) { /* TODO: update LEDs */ } - if (num < 0) + if (num < 0) { + r = num; goto error; + } r = keyboard_fill(k, &k->evdata, data->resync, ev->code, ev->value, num, keysyms); if (r < 0)