+ GdkWaylandDevice *device = data;
+ GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display);
+ GdkKeymap *gdk_keymap;
+ gchar *keymap_data;
+ struct xkb_keymap *keymap;
+
+ if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1)
+ {
+ g_critical (G_STRLOC ": Unknown keymap format");
+ close (fd);
+ return;
+ }
+
+ keymap_data = mmap (NULL, size, PROT_READ, MAP_SHARED, fd, 0);
+ if (keymap_data == MAP_FAILED)
+ {
+ g_critical (G_STRLOC ": Unable to map fd for keymap %s", g_strerror (errno));
+ close (fd);
+ return;
+ }
+
+ keymap = xkb_map_new_from_string (display->xkb_context,
+ keymap_data,
+ format,
+ 0);
+
+ munmap (keymap_data, size);
+ close (fd);
+
+ gdk_keymap = _gdk_wayland_display_get_keymap (device->display);
+ _gdk_wayland_keymap_update_keymap (gdk_keymap, keymap);