static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int fd, uint32_t size) { UwacSeat *input = data; struct xkb_keymap *keymap; struct xkb_state *state; 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_keymap_new_from_string(input->xkb_context, map_str, XKB_KEYMAP_FORMAT_TEXT_V1, 0); munmap(map_str, size); close(fd); if (!keymap) { assert(uwacErrorHandler(input->display, UWAC_ERROR_INTERNAL, "failed to compile keymap\n")); return; } state = xkb_state_new(keymap); if (!state) { assert(uwacErrorHandler(input->display, UWAC_ERROR_NOMEMORY, "failed to create XKB state\n")); xkb_keymap_unref(keymap); return; } xkb_keymap_unref(input->xkb.keymap); xkb_state_unref(input->xkb.state); input->xkb.keymap = keymap; input->xkb.state = state; input->xkb.control_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Control"); input->xkb.alt_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Mod1"); input->xkb.shift_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Shift"); }
void shell_configure(void* data, struct wl_shell_surface* surface, uint32_t edges, int32_t width, int32_t height) { UwacWindow* window = (UwacWindow*)data; UwacConfigureEvent* event; int ret; event = (UwacConfigureEvent*)UwacDisplayNewEvent(window->display, UWAC_EVENT_CONFIGURE); if (!event) { assert(uwacErrorHandler(window->display, UWAC_ERROR_NOMEMORY, "failed to allocate a configure event\n")); return; } event->window = window; event->states = 0; if (width && height) { event->width = width; event->height = height; UwacWindowDestroyBuffers(window); window->width = width; window->stride = width * bppFromShmFormat(window->format); window->height = height; ret = UwacWindowShmAllocBuffers(window, UWAC_INITIAL_BUFFERS, window->stride * height, width, height, window->format); if (ret != UWAC_SUCCESS) { assert(uwacErrorHandler(window->display, ret, "failed to reallocate a wayland buffers\n")); window->drawingBuffer = window->pendingBuffer = NULL; return; } window->drawingBuffer = window->pendingBuffer = &window->buffers[0]; } else { event->width = window->width; event->height = window->height; } }
static void xdg_handle_close(void* data, struct xdg_surface* xdg_surface) { UwacCloseEvent* event; UwacWindow* window = (UwacWindow*)data; event = (UwacCloseEvent*)UwacDisplayNewEvent(window->display, UWAC_EVENT_CLOSE); if (!event) { assert(uwacErrorHandler(window->display, UWAC_ERROR_INTERNAL, "failed to allocate a close event\n")); return; } event->window = window; }
static void xdg_handle_configure(void* data, struct xdg_surface* surface, int32_t width, int32_t height, struct wl_array* states, uint32_t serial) { UwacWindow* window = (UwacWindow*)data; UwacConfigureEvent* event; int ret, surfaceState; enum xdg_surface_state* state; surfaceState = 0; wl_array_for_each(state, states) { switch (*state) { case XDG_SURFACE_STATE_MAXIMIZED: surfaceState |= UWAC_WINDOW_MAXIMIZED; break; case XDG_SURFACE_STATE_FULLSCREEN: surfaceState |= UWAC_WINDOW_FULLSCREEN; break; case XDG_SURFACE_STATE_ACTIVATED: surfaceState |= UWAC_WINDOW_ACTIVATED; break; case XDG_SURFACE_STATE_RESIZING: surfaceState |= UWAC_WINDOW_RESIZING; break; default: break; } } window->surfaceStates = surfaceState; event = (UwacConfigureEvent*)UwacDisplayNewEvent(window->display, UWAC_EVENT_CONFIGURE); if (!event) { assert(uwacErrorHandler(window->display, UWAC_ERROR_NOMEMORY, "failed to allocate a configure event\n")); goto ack; } event->window = window; event->states = surfaceState; if (width && height) { event->width = width; event->height = height; UwacWindowDestroyBuffers(window); window->width = width; window->stride = width * bppFromShmFormat(window->format); window->height = height; ret = UwacWindowShmAllocBuffers(window, UWAC_INITIAL_BUFFERS, window->stride * height, width, height, window->format); if (ret != UWAC_SUCCESS) { assert(uwacErrorHandler(window->display, ret, "failed to reallocate a wayland buffers\n")); window->drawingBuffer = window->pendingBuffer = NULL; goto ack; } window->drawingBuffer = window->pendingBuffer = &window->buffers[0]; } else { event->width = window->width; event->height = window->height; } ack: xdg_surface_ack_configure(surface, serial); }