static void clutter_wayland_handle_keymap (void *data, struct wl_keyboard *keyboard, uint32_t format, int32_t fd, uint32_t size) { ClutterInputDeviceWayland *device = data; struct xkb_context *ctx; struct xkb_keymap *keymap; char *map_str; if (device->xkb) { xkb_state_unref (device->xkb); device->xkb = NULL; } ctx = xkb_context_new (0); if (!ctx) { close (fd); return; } if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { close (fd); return; } map_str = mmap (NULL, size, PROT_READ, MAP_SHARED, fd, 0); if (map_str == MAP_FAILED) { close(fd); return; } keymap = xkb_map_new_from_string (ctx, map_str, XKB_KEYMAP_FORMAT_TEXT_V1, 0); xkb_context_unref (ctx); munmap (map_str, size); close (fd); if (!keymap) { g_warning ("failed to compile keymap\n"); return; } device->xkb = xkb_state_new(keymap); xkb_map_unref (keymap); if (!device->xkb) { g_warning ("failed to create XKB state object\n"); return; } }
static void keyboardHandleKeymap(void* data, struct wl_keyboard* keyboard, uint32_t format, int fd, uint32_t size) { struct xkb_keymap* keymap; struct xkb_state* state; char* mapStr; if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { close(fd); return; } mapStr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); if (mapStr == MAP_FAILED) { close(fd); return; } keymap = xkb_map_new_from_string(_glfw.wl.xkb.context, mapStr, XKB_KEYMAP_FORMAT_TEXT_V1, 0); munmap(mapStr, size); close(fd); if (!keymap) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Failed to compile keymap"); return; } state = xkb_state_new(keymap); if (!state) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Failed to create XKB state"); xkb_map_unref(keymap); return; } xkb_keymap_unref(_glfw.wl.xkb.keymap); xkb_state_unref(_glfw.wl.xkb.state); _glfw.wl.xkb.keymap = keymap; _glfw.wl.xkb.state = state; _glfw.wl.xkb.control_mask = 1 << xkb_map_mod_get_index(_glfw.wl.xkb.keymap, "Control"); _glfw.wl.xkb.alt_mask = 1 << xkb_map_mod_get_index(_glfw.wl.xkb.keymap, "Mod1"); _glfw.wl.xkb.shift_mask = 1 << xkb_map_mod_get_index(_glfw.wl.xkb.keymap, "Shift"); _glfw.wl.xkb.super_mask = 1 << xkb_map_mod_get_index(_glfw.wl.xkb.keymap, "Mod4"); }
static void input_method_keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size) { struct simple_im *keyboard = data; char *map_str; if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { close(fd); return; } map_str = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); if (map_str == MAP_FAILED) { close(fd); return; } keyboard->keymap = xkb_map_new_from_string(keyboard->xkb_context, map_str, XKB_KEYMAP_FORMAT_TEXT_V1, 0); munmap(map_str, size); close(fd); if (!keyboard->keymap) { fprintf(stderr, "failed to compile keymap\n"); return; } keyboard->state = xkb_state_new(keyboard->keymap); if (!keyboard->state) { fprintf(stderr, "failed to create XKB state\n"); xkb_map_unref(keyboard->keymap); return; } keyboard->control_mask = 1 << xkb_map_mod_get_index(keyboard->keymap, "Control"); keyboard->alt_mask = 1 << xkb_map_mod_get_index(keyboard->keymap, "Mod1"); keyboard->shift_mask = 1 << xkb_map_mod_get_index(keyboard->keymap, "Shift"); }
static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int fd, uint32_t size) { char *map_str; if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { close(fd); return; } map_str = (char *) mmap(nullptr, size, PROT_READ, MAP_SHARED, fd, 0); if (map_str == MAP_FAILED) { close(fd); return; } GLWin.keyboard.xkb.keymap = xkb_map_new_from_string(GLWin.keyboard.xkb.context, map_str, XKB_KEYMAP_FORMAT_TEXT_V1, (xkb_keymap_compile_flags) 0); munmap(map_str, size); close(fd); if (!GLWin.keyboard.xkb.keymap) { fprintf(stderr, "failed to compile keymap\n"); return; } GLWin.keyboard.xkb.state = xkb_state_new(GLWin.keyboard.xkb.keymap); if (!GLWin.keyboard.xkb.state) { fprintf(stderr, "failed to create XKB state\n"); xkb_map_unref(GLWin.keyboard.xkb.keymap); GLWin.keyboard.xkb.keymap = nullptr; return; } GLWin.keyboard.xkb.control_mask = 1 << xkb_map_mod_get_index(GLWin.keyboard.xkb.keymap, "Control"); GLWin.keyboard.xkb.alt_mask = 1 << xkb_map_mod_get_index(GLWin.keyboard.xkb.keymap, "Mod1"); GLWin.keyboard.xkb.shift_mask = 1 << xkb_map_mod_get_index(GLWin.keyboard.xkb.keymap, "Shift"); }
void EglFSWaylandInput::keymapChanged(int fd, quint32 size) { // Load keymap char *map = static_cast<char *>(::mmap(Q_NULLPTR, size, PROT_READ, MAP_SHARED, fd, 0)); if (map == MAP_FAILED) { ::close(fd); return; } // Release the old keymap releaseKeymap(); m_xkbContext = xkb_context_new(xkb_context_flags(0)); m_xkbKeymap = xkb_map_new_from_string(m_xkbContext, map, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS); ::munmap(map, size); ::close(fd); m_xkbState = xkb_state_new(m_xkbKeymap); }
static void input_handle_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int fd, uint32_t size) { struct wayland_input *input = data; struct xkb_keymap *keymap; char *map_str; if (!data) { close(fd); return; } if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { close(fd); return; } map_str = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); if (map_str == MAP_FAILED) { close(fd); return; } keymap = xkb_map_new_from_string(input->compositor->base.xkb_context, map_str, XKB_KEYMAP_FORMAT_TEXT_V1, 0); munmap(map_str, size); close(fd); if (!keymap) { weston_log("failed to compile keymap\n"); return; } weston_seat_init_keyboard(&input->base, keymap); xkb_map_unref(keymap); }