Commit c23d30fcc80c917a73b0ff50b0abbc8726bb16ef Parent: 02d45be00ca4a7b66969b6d8ecd2ce34a291dddd Author: mcol <mcol@posteo.net> Date: 2021-02-02 21:41:08 +0000 Committer: mcol <mcol@posteo.net> Committed: 2021-02-02 21:41:08 +0000 implement virtual keyboard protocol
src/types.h Modified
@@ -88,6 +88,9 @@ struct wl_list key_bindings; struct wl_list mouse_bindings; + struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard; + struct wl_listener new_virtual_keyboard_listener; + action on_mouse_motion; action on_mouse_scroll; action on_drag1; @@ -143,6 +146,7 @@ struct wlr_input_device *device; struct wl_listener modifier_listener; struct wl_listener key_listener; + struct wl_listener destroy_listener; }; struct wallpaper {
src/keyboard.c Modified
@@ -2,6 +2,7 @@ #include <unistd.h> #include <wlr/types/wlr_keyboard.h> #include <wlr/types/wlr_data_device.h> +#include <wlr/types/wlr_virtual_keyboard_v1.h> #include "action.h" #include "cursor.h" @@ -104,6 +105,20 @@ } +static void on_keyboard_destroy(struct wl_listener *listener, void *data) { + struct keyboard *keyboard = wl_container_of(listener, keyboard, destroy_listener); + + wl_list_remove(&keyboard->link); + wl_list_remove(&keyboard->modifier_listener.link); + wl_list_remove(&keyboard->key_listener.link); + wl_list_remove(&keyboard->destroy_listener.link); + free(keyboard); + + keyboard = wl_container_of(wimp.keyboards.next, keyboard, link); + wlr_seat_set_keyboard(wimp.seat, keyboard->device); +} + + static void on_new_keyboard(struct wlr_input_device *device) { struct keyboard *keyboard = calloc(1, sizeof(struct keyboard)); keyboard->device = device; @@ -119,10 +134,13 @@ xkb_context_unref(context); wlr_keyboard_set_repeat_info(device->keyboard, 25, 600); - keyboard->modifier_listener.notify = on_modifier; - wl_signal_add(&device->keyboard->events.modifiers, &keyboard->modifier_listener); keyboard->key_listener.notify = on_key; + keyboard->destroy_listener.notify = on_keyboard_destroy; + keyboard->modifier_listener.notify = on_modifier; wl_signal_add(&device->keyboard->events.key, &keyboard->key_listener); + wl_signal_add(&device->keyboard->events.destroy, &keyboard->destroy_listener); + wl_signal_add(&device->keyboard->events.modifiers, &keyboard->modifier_listener); + wlr_seat_set_keyboard(wimp.seat, device); wl_list_insert(&wimp.keyboards, &keyboard->link); } @@ -167,6 +185,13 @@ } +static void on_new_virtual_keyboard(struct wl_listener *listener, void *data) { + struct wlr_virtual_keyboard_v1 *keyboard = data; + struct wlr_input_device *device = &keyboard->input_device; + on_new_keyboard(device); +} + + void set_up_keyboard() { wl_list_init(&wimp.keyboards); @@ -180,4 +205,9 @@ wimp.request_set_selection_listener.notify = on_request_set_selection; wl_signal_add(&wimp.seat->events.request_set_selection, &wimp.request_set_selection_listener); + + wimp.virtual_keyboard = wlr_virtual_keyboard_manager_v1_create(wimp.display); + wimp.new_virtual_keyboard_listener.notify = on_new_virtual_keyboard; + wl_signal_add(&wimp.virtual_keyboard->events.new_virtual_keyboard, + &wimp.new_virtual_keyboard_listener); }