7 #include "seat_private.h"
9 static const struct ds_keyboard_grab_interface default_keyboard_grab_iface;
10 static const struct wl_keyboard_interface keyboard_impl;
13 seat_client_send_keyboard_leave_raw(struct ds_seat_client *seat_client,
14 struct ds_surface *surface);
16 seat_keyboard_handle_surface_destroy(struct wl_listener *listener,
18 static void keyboard_handle_resource_destroy(struct wl_resource *resource);
21 ds_seat_keyboard_notify_enter(struct ds_seat *seat,
22 struct ds_surface *surface, uint32_t keycodes[], size_t num_keycodes,
23 struct ds_keyboard_modifiers *modifiers)
25 struct ds_seat_keyboard_grab *grab = seat->keyboard.grab;
27 grab->iface->enter(grab, surface, keycodes, num_keycodes, modifiers);
31 ds_seat_keyboard_notify_clear_focus(struct ds_seat *seat)
33 struct ds_seat_keyboard_grab *grab = seat->keyboard.grab;
35 grab->iface->clear_focus(grab);
39 ds_seat_keyboard_notify_modifiers(struct ds_seat *seat,
40 struct ds_keyboard_modifiers *modifiers)
42 struct ds_seat_keyboard_grab *grab = seat->keyboard.grab;
44 clock_gettime(CLOCK_MONOTONIC, &seat->last_event);
45 grab->iface->modifiers(grab, modifiers);
49 ds_seat_keyboard_notify_key(struct ds_seat *seat, uint32_t time_msec,
50 uint32_t key, uint32_t state)
52 struct ds_seat_keyboard_grab *grab = seat->keyboard.grab;
54 clock_gettime(CLOCK_MONOTONIC, &seat->last_event);
55 grab->iface->key(grab, time_msec, key, state);
59 ds_seat_keyboard_add_grab_begin_listener(struct ds_seat *seat,
60 struct wl_listener *listener)
62 wl_signal_add(&seat->events.keyboard_grab_begin, listener);
66 ds_seat_keyboard_add_grab_end_listener(struct ds_seat *seat,
67 struct wl_listener *listener)
69 wl_signal_add(&seat->events.keyboard_grab_end, listener);
73 ds_seat_keyboard_add_focus_change_listener(struct ds_seat *seat,
74 struct wl_listener *listener)
76 wl_signal_add(&seat->keyboard.events.focus_change, listener);
80 ds_seat_keyboard_start_grab(struct ds_seat *seat,
81 struct ds_seat_keyboard_grab *grab)
84 seat->keyboard.grab = grab;
86 wl_signal_emit(&seat->events.keyboard_grab_begin, grab);
90 ds_seat_keyboard_end_grab(struct ds_seat *seat)
92 struct ds_seat_keyboard *keyboard = &seat->keyboard;
93 struct ds_seat_keyboard_grab *grab = keyboard->grab;
95 if (grab != keyboard->default_grab) {
96 keyboard->grab = keyboard->default_grab;
97 wl_signal_emit(&seat->events.keyboard_grab_end, grab);
98 if (grab->iface->cancel)
99 grab->iface->cancel(grab);
104 ds_seat_keyboard_enter(struct ds_seat *seat, struct ds_surface *surface,
105 uint32_t keycodes[], size_t num_keycodes,
106 struct ds_keyboard_modifiers *modifiers)
108 struct ds_seat_keyboard *keyboard = &seat->keyboard;
109 struct ds_seat_client *seat_client = NULL, *focused_client;
110 struct ds_surface *focused_surface;
111 struct wl_client *wl_client;
112 struct wl_array keys;
113 struct wl_resource *resource;
117 if (keyboard->focused_surface == surface)
122 wl_resource_get_client(ds_surface_get_wl_resource(surface));
123 seat_client = seat_client_for_wl_client(seat, wl_client);
126 focused_client = keyboard->focused_client;
127 focused_surface = keyboard->focused_surface;
129 if (focused_client != NULL && focused_surface != NULL)
130 seat_client_send_keyboard_leave_raw(focused_client, focused_surface);
133 wl_array_init(&keys);
135 for (size_t i = 0; i < num_keycodes; i++) {
136 p = wl_array_add(&keys, sizeof(uint32_t));
138 ds_err("Cannot allocate memory, skipping keycode: %" PRIu32
145 serial = wl_display_next_serial(seat->display);
147 wl_resource_for_each(resource, &seat_client->keyboards) {
148 wl_keyboard_send_enter(resource, serial,
149 ds_surface_get_wl_resource(surface), &keys);
151 wl_array_release(&keys);
154 wl_list_remove(&keyboard->surface_destroy.link);
155 wl_list_init(&keyboard->surface_destroy.link);
158 keyboard->surface_destroy.notify =
159 seat_keyboard_handle_surface_destroy;
160 ds_surface_add_destroy_listener(surface, &keyboard->surface_destroy);
163 keyboard->focused_client = seat_client;
164 keyboard->focused_surface = surface;
167 ds_seat_keyboard_send_modifiers(seat, modifiers);
169 // TODO handle selection
172 struct ds_event_seat_keyboard_focus_change event = {
174 .old_surface = focused_surface,
175 .new_surface = surface,
177 wl_signal_emit(&keyboard->events.focus_change, &event);
181 ds_seat_keyboard_clear_focus(struct ds_seat *seat)
183 ds_seat_keyboard_enter(seat, NULL, NULL, 0, NULL);
187 ds_seat_keyboard_send_key(struct ds_seat *seat, uint32_t time_msec,
188 uint32_t key, uint32_t state)
190 struct ds_seat_client *seat_client;
191 struct wl_resource *resource;
194 seat_client = seat->keyboard.focused_client;
198 serial = wl_display_next_serial(seat->display);
199 wl_resource_for_each(resource, &seat_client->keyboards)
200 wl_keyboard_send_key(resource, serial, time_msec, key, state);
204 ds_seat_keyboard_send_modifiers(struct ds_seat *seat,
205 struct ds_keyboard_modifiers *modifiers)
207 struct ds_seat_keyboard *keyboard = &seat->keyboard;
208 struct ds_seat_client *seat_client = keyboard->focused_client;
209 struct wl_resource *resource;
215 serial = wl_display_next_serial(seat->display);
216 wl_resource_for_each(resource, &seat_client->keyboards) {
218 wl_keyboard_send_modifiers(resource, serial, 0, 0, 0, 0);
221 wl_keyboard_send_modifiers(resource, serial,
222 modifiers->depressed, modifiers->latched,
223 modifiers->locked, modifiers->group);
229 seat_keyboard_init(struct ds_seat *seat)
231 struct ds_seat_keyboard *keyboard = &seat->keyboard;
232 struct ds_seat_keyboard_grab *grab;
234 grab = calloc(1, sizeof *grab);
238 grab->iface = &default_keyboard_grab_iface;
241 keyboard->default_grab = grab;
242 keyboard->grab = grab;
243 keyboard->seat = seat;
245 wl_list_init(&keyboard->surface_destroy.link);
247 wl_signal_init(&keyboard->events.focus_change);
252 void seat_keyboard_finish(struct ds_seat *seat)
254 struct ds_seat_keyboard *keyboard = &seat->keyboard;
256 wl_list_remove(&keyboard->surface_destroy.link);
257 free(keyboard->default_grab);
261 seat_client_add_keyboard_resource(struct ds_seat_client *seat_client,
262 uint32_t version, uint32_t id)
264 struct wl_resource *resource;
266 resource = wl_resource_create(seat_client->wl_client,
267 &wl_keyboard_interface, version, id);
269 wl_client_post_no_memory(seat_client->wl_client);
273 wl_resource_set_implementation(resource, &keyboard_impl, seat_client,
274 keyboard_handle_resource_destroy);
276 wl_list_insert(&seat_client->keyboards, wl_resource_get_link(resource));
278 if (!(seat_client->seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)) {
279 wl_resource_set_user_data(resource, NULL);
285 seat_client_remove_all_keyboard_resources(struct ds_seat_client *seat_client)
287 struct wl_resource *resource, *tmp;
289 wl_resource_for_each_safe(resource, tmp, &seat_client->keyboards) {
290 wl_list_remove(wl_resource_get_link(resource));
291 wl_resource_set_user_data(resource, NULL);
296 keyboard_handle_release(struct wl_client *client, struct wl_resource *resource)
298 wl_resource_destroy(resource);
301 static const struct wl_keyboard_interface keyboard_impl =
303 .release = keyboard_handle_release,
307 keyboard_handle_resource_destroy(struct wl_resource *resource)
309 if (!wl_resource_get_user_data(resource))
312 wl_list_remove(wl_resource_get_link(resource));
316 default_keyboard_grab_iface_enter(struct ds_seat_keyboard_grab *grab,
317 struct ds_surface *surface, uint32_t keycodes[],
318 size_t num_keycodes, struct ds_keyboard_modifiers *modifiers)
320 ds_seat_keyboard_enter(grab->seat, surface, keycodes, num_keycodes,
325 default_keyboard_grab_iface_clear_focus(struct ds_seat_keyboard_grab *grab)
327 ds_seat_keyboard_clear_focus(grab->seat);
331 default_keyboard_grab_iface_key(struct ds_seat_keyboard_grab *grab,
332 uint32_t time_msec, uint32_t key, uint32_t state)
334 ds_seat_keyboard_send_key(grab->seat, time_msec, key, state);
338 default_modifiers_grab_iface_key(struct ds_seat_keyboard_grab *grab,
339 struct ds_keyboard_modifiers *modifiers)
341 ds_seat_keyboard_send_modifiers(grab->seat, modifiers);
345 default_cancel_grab_iface_key(struct ds_seat_keyboard_grab *grab)
347 // cannot be cancelled
350 static const struct ds_keyboard_grab_interface default_keyboard_grab_iface = {
351 .enter = default_keyboard_grab_iface_enter,
352 .clear_focus = default_keyboard_grab_iface_clear_focus,
353 .key = default_keyboard_grab_iface_key,
354 .modifiers = default_modifiers_grab_iface_key,
355 .cancel = default_cancel_grab_iface_key,
359 seat_client_send_keyboard_leave_raw(struct ds_seat_client *seat_client,
360 struct ds_surface *surface)
362 struct wl_resource *resource;
365 serial = wl_display_next_serial(wl_client_get_display(seat_client->wl_client));
366 wl_resource_for_each(resource, &seat_client->keyboards) {
367 wl_keyboard_send_leave(resource, serial,
368 ds_surface_get_wl_resource(surface));
373 seat_keyboard_handle_surface_destroy(struct wl_listener *listener,
376 struct ds_seat_keyboard *keyboard;
378 keyboard = wl_container_of(listener, keyboard, surface_destroy);
380 wl_list_remove(&keyboard->surface_destroy.link);
381 wl_list_init(&keyboard->surface_destroy.link);
382 ds_seat_keyboard_clear_focus(keyboard->seat);