diff options
Diffstat (limited to 'sway/input/input-manager.c')
-rw-r--r-- | sway/input/input-manager.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 4cc07fe6..af0f5afa 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c | |||
@@ -296,6 +296,46 @@ static void handle_inhibit_deactivate(struct wl_listener *listener, void *data) | |||
296 | } | 296 | } |
297 | } | 297 | } |
298 | 298 | ||
299 | static void handle_keyboard_shortcuts_inhibitor_destroy( | ||
300 | struct wl_listener *listener, void *data) { | ||
301 | struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor = | ||
302 | wl_container_of(listener, sway_inhibitor, destroy); | ||
303 | |||
304 | sway_log(SWAY_DEBUG, "Removing keyboard shortcuts inhibitor"); | ||
305 | |||
306 | // sway_seat::keyboard_shortcuts_inhibitors | ||
307 | wl_list_remove(&sway_inhibitor->link); | ||
308 | wl_list_remove(&sway_inhibitor->destroy.link); | ||
309 | free(sway_inhibitor); | ||
310 | } | ||
311 | |||
312 | static void handle_keyboard_shortcuts_inhibit_new_inhibitor( | ||
313 | struct wl_listener *listener, void *data) { | ||
314 | struct sway_input_manager *input_manager = | ||
315 | wl_container_of(listener, input_manager, | ||
316 | keyboard_shortcuts_inhibit_new_inhibitor); | ||
317 | struct wlr_keyboard_shortcuts_inhibitor_v1 *inhibitor = data; | ||
318 | |||
319 | sway_log(SWAY_DEBUG, "Adding keyboard shortcuts inhibitor"); | ||
320 | |||
321 | struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor = | ||
322 | calloc(1, sizeof(struct sway_keyboard_shortcuts_inhibitor)); | ||
323 | if (!sway_assert(sway_inhibitor, "could not allocate keyboard " | ||
324 | "shortcuts inhibitor")) { | ||
325 | return; | ||
326 | } | ||
327 | sway_inhibitor->inhibitor = inhibitor; | ||
328 | |||
329 | sway_inhibitor->destroy.notify = handle_keyboard_shortcuts_inhibitor_destroy; | ||
330 | wl_signal_add(&inhibitor->events.destroy, &sway_inhibitor->destroy); | ||
331 | |||
332 | // attach inhibitor to the seat it applies to | ||
333 | struct sway_seat *seat = inhibitor->seat->data; | ||
334 | wl_list_insert(&seat->keyboard_shortcuts_inhibitors, &sway_inhibitor->link); | ||
335 | |||
336 | wlr_keyboard_shortcuts_inhibitor_v1_activate(inhibitor); | ||
337 | } | ||
338 | |||
299 | void handle_virtual_keyboard(struct wl_listener *listener, void *data) { | 339 | void handle_virtual_keyboard(struct wl_listener *listener, void *data) { |
300 | struct sway_input_manager *input_manager = | 340 | struct sway_input_manager *input_manager = |
301 | wl_container_of(listener, input_manager, virtual_keyboard_new); | 341 | wl_container_of(listener, input_manager, virtual_keyboard_new); |
@@ -397,6 +437,13 @@ struct sway_input_manager *input_manager_create(struct sway_server *server) { | |||
397 | wl_signal_add(&input->inhibit->events.deactivate, | 437 | wl_signal_add(&input->inhibit->events.deactivate, |
398 | &input->inhibit_deactivate); | 438 | &input->inhibit_deactivate); |
399 | 439 | ||
440 | input->keyboard_shortcuts_inhibit = | ||
441 | wlr_keyboard_shortcuts_inhibit_v1_create(server->wl_display); | ||
442 | input->keyboard_shortcuts_inhibit_new_inhibitor.notify = | ||
443 | handle_keyboard_shortcuts_inhibit_new_inhibitor; | ||
444 | wl_signal_add(&input->keyboard_shortcuts_inhibit->events.new_inhibitor, | ||
445 | &input->keyboard_shortcuts_inhibit_new_inhibitor); | ||
446 | |||
400 | return input; | 447 | return input; |
401 | } | 448 | } |
402 | 449 | ||