Fix keyboard layout change detection

…by listening to XKB_NEW_KEYBOARD events and re-allocating the keysym
map on both XKB_NEW_KEYBOARD and XKB_MAP_NOTIFY.

fixes #1302
This commit is contained in:
Michael Stapelberg 2015-03-03 09:46:16 +01:00
parent 487ccb536a
commit dcba0b46dd
2 changed files with 12 additions and 3 deletions

View File

@ -1257,12 +1257,21 @@ void handle_event(int type, xcb_generic_event_t *event) {
DLOG("xkb event, need to handle it.\n"); DLOG("xkb event, need to handle it.\n");
xcb_xkb_state_notify_event_t *state = (xcb_xkb_state_notify_event_t *)event; xcb_xkb_state_notify_event_t *state = (xcb_xkb_state_notify_event_t *)event;
if (state->xkbType == XCB_XKB_MAP_NOTIFY) { if (state->xkbType == XCB_XKB_NEW_KEYBOARD_NOTIFY) {
DLOG("xkb new keyboard notify, sequence %d, time %d\n", state->sequence, state->time);
xcb_key_symbols_free(keysyms);
keysyms = xcb_key_symbols_alloc(conn);
ungrab_all_keys(conn);
translate_keysyms();
grab_all_keys(conn, false);
} else if (state->xkbType == XCB_XKB_MAP_NOTIFY) {
if (event_is_ignored(event->sequence, type)) { if (event_is_ignored(event->sequence, type)) {
DLOG("Ignoring map notify event for sequence %d.\n", state->sequence); DLOG("Ignoring map notify event for sequence %d.\n", state->sequence);
} else { } else {
DLOG("xkb map notify, sequence %d, time %d\n", state->sequence, state->time); DLOG("xkb map notify, sequence %d, time %d\n", state->sequence, state->time);
add_ignore_event(event->sequence, type); add_ignore_event(event->sequence, type);
xcb_key_symbols_free(keysyms);
keysyms = xcb_key_symbols_alloc(conn);
ungrab_all_keys(conn); ungrab_all_keys(conn);
translate_keysyms(); translate_keysyms();
grab_all_keys(conn, false); grab_all_keys(conn, false);

View File

@ -536,9 +536,9 @@ int main(int argc, char *argv[]) {
xcb_xkb_use_extension(conn, XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION); xcb_xkb_use_extension(conn, XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION);
xcb_xkb_select_events(conn, xcb_xkb_select_events(conn,
XCB_XKB_ID_USE_CORE_KBD, XCB_XKB_ID_USE_CORE_KBD,
XCB_XKB_EVENT_TYPE_STATE_NOTIFY | XCB_XKB_EVENT_TYPE_MAP_NOTIFY, XCB_XKB_EVENT_TYPE_STATE_NOTIFY | XCB_XKB_EVENT_TYPE_MAP_NOTIFY | XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY,
0, 0,
XCB_XKB_EVENT_TYPE_STATE_NOTIFY | XCB_XKB_EVENT_TYPE_MAP_NOTIFY, XCB_XKB_EVENT_TYPE_STATE_NOTIFY | XCB_XKB_EVENT_TYPE_MAP_NOTIFY | XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY,
0xff, 0xff,
0xff, 0xff,
NULL); NULL);