static void weston_desktop_seat_popup_grab_end(struct weston_desktop_seat *seat) { struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat->seat); struct weston_pointer *pointer = weston_seat_get_pointer(seat->seat); struct weston_touch *touch = weston_seat_get_touch(seat->seat); while (!wl_list_empty(&seat->popup_grab.surfaces)) { struct wl_list *link = seat->popup_grab.surfaces.prev; struct weston_desktop_surface *surface = weston_desktop_surface_from_grab_link(link); wl_list_remove(link); wl_list_init(link); weston_desktop_surface_popup_dismiss(surface); } if (keyboard != NULL && keyboard->grab->interface == &weston_desktop_seat_keyboard_popup_grab_interface) weston_keyboard_end_grab(keyboard); if (pointer != NULL && pointer->grab->interface == &weston_desktop_seat_pointer_popup_grab_interface) weston_pointer_end_grab(pointer); if (touch != NULL && touch->grab->interface == &weston_desktop_seat_touch_popup_grab_interface) weston_touch_end_grab(touch); seat->popup_grab.client = NULL; }
static void ss_seat_handle_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial_in, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) { struct ss_seat *seat = data; struct weston_compositor *c = seat->base.compositor; struct weston_keyboard *keyboard; uint32_t serial_out; /* If we get a key event followed by a modifier event with the * same serial number, then we try to preserve those semantics by * reusing the same serial number on the way out too. */ if (serial_in == seat->key_serial) serial_out = wl_display_get_serial(c->wl_display); else serial_out = wl_display_next_serial(c->wl_display); keyboard = weston_seat_get_keyboard(&seat->base); xkb_state_update_mask(keyboard->xkb_state.state, mods_depressed, mods_latched, mods_locked, 0, 0, group); notify_modifiers(&seat->base, serial_out); }
bool weston_desktop_seat_popup_grab_start(struct weston_desktop_seat *seat, struct wl_client *client, uint32_t serial) { assert(seat->popup_grab.client == NULL || seat->popup_grab.client == client); struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat->seat); struct weston_pointer *pointer = weston_seat_get_pointer(seat->seat); struct weston_touch *touch = weston_seat_get_touch(seat->seat); if ((keyboard == NULL || keyboard->grab_serial != serial) && (pointer == NULL || pointer->grab_serial != serial) && (touch == NULL || touch->grab_serial != serial)) { return false; } if (keyboard != NULL && keyboard->grab->interface != &weston_desktop_seat_keyboard_popup_grab_interface) weston_keyboard_start_grab(keyboard, &seat->popup_grab.keyboard); if (pointer != NULL && pointer->grab->interface != &weston_desktop_seat_pointer_popup_grab_interface) weston_pointer_start_grab(pointer, &seat->popup_grab.pointer); if (touch != NULL && touch->grab->interface != &weston_desktop_seat_touch_popup_grab_interface) weston_touch_start_grab(touch, &seat->popup_grab.touch); seat->popup_grab.initial_up = (pointer == NULL || pointer->button_count == 0); seat->popup_grab.client = client; return true; }