*** xorg-server-1.18.3/hw/xmir/xmir-input.c 2016-04-27 12:06:07.000000000 -0400 --- xmir-input.c 2016-04-27 11:10:44.865283005 -0400 *************** *** 467,472 **** --- 465,497 ---- } static void + xmir_handle_keymap_event(struct xmir_input *xmir_input, + MirKeymapEvent const* ev) + { + char * buffer = NULL; + size_t length = 0; + DeviceIntPtr master; + XkbDescPtr xkb; + XkbChangesRec changes = { 0 }; + + mir_keymap_event_get_keymap_buffer(ev, (char const **)&buffer, &length); + + buffer[length] = '\0'; + + xkb = XkbCompileKeymapFromString(xmir_input->keyboard, buffer, length); + + XkbUpdateDescActions(xkb, xkb->min_key_code, XkbNumKeys(xkb), &changes); + + XkbDeviceApplyKeymap(xmir_input->keyboard, xkb); + + master = GetMaster(xmir_input->keyboard, MASTER_KEYBOARD); + if (master && master->lastSlave == xmir_input->keyboard) + XkbDeviceApplyKeymap(master, xkb); + + XkbFreeKeyboard(xkb, XkbAllComponentsMask, TRUE); + } + + static void xmir_handle_surface_event_in_main_thread(struct xmir_screen *xmir_screen, struct xmir_window *xmir_window, void *arg) *************** *** 506,511 **** --- 531,539 ---- break; case mir_event_type_surface_output: break; + case mir_event_type_keymap: + xmir_handle_keymap_event(xmir_input, mir_event_get_keymap_event(ev)); + break; default: ErrorF("Received an unknown %u event\n", mir_event_get_type(ev)); break;