WL_EXPORT void wlb_keyboard_key(struct wlb_keyboard *keyboard, uint32_t time, uint32_t key, enum wl_keyboard_key_state state) { struct wl_resource *resource; uint32_t serial, *k, *end; keyboard_ensure_focus(keyboard); end = keyboard->keys.data + keyboard->keys.size; for (k = keyboard->keys.data; k < end; k++) { if (*k == key) { /* Ignore server-generated repeats. */ if (state == WL_KEYBOARD_KEY_STATE_PRESSED) return; *k = *--end; } } keyboard->keys.size = (void *) end - keyboard->keys.data; if (state == WL_KEYBOARD_KEY_STATE_PRESSED) { k = wl_array_add(&keyboard->keys, sizeof *k); *k = key; } if (!keyboard->focus || wl_list_empty(&keyboard->resource_list)) return; serial = wl_display_next_serial(keyboard->seat->compositor->display); wl_resource_for_each(resource, &keyboard->resource_list) wl_keyboard_send_key(resource, serial, time, key, state); }
void KeyboardInterface::keyReleased(quint32 key, quint32 serial) { Q_D(); if (!d->resource) { return; } Q_ASSERT(d->focusedSurface); wl_keyboard_send_key(d->resource, serial, d->seat->timestamp(), key, WL_KEYBOARD_KEY_STATE_RELEASED); }
static void send_release_for_keys(struct chck_iter_pool *resources, struct chck_iter_pool *keys) { assert(keys); wlc_dlog(WLC_DBG_KEYBOARD, "release keys"); uint32_t *k; uint32_t time = wlc_get_time(NULL); chck_iter_pool_for_each(keys, k) { wlc_resource *r; chck_iter_pool_for_each(resources, r) { struct wl_resource *wr; if (!(wr = wl_resource_from_wlc_resource(*r, "keyboard"))) continue; uint32_t serial = wl_display_next_serial(wlc_display()); wl_keyboard_send_key(wr, serial, time, *k, WL_KEYBOARD_KEY_STATE_RELEASED); } }