Handle input device removal

This commit is contained in:
Drew DeVault 2017-09-28 19:05:38 -04:00
parent efadbf8424
commit 10240af6ea
4 changed files with 21 additions and 2 deletions

View file

@ -97,7 +97,9 @@ struct roots_input *input_create(struct roots_server *server,
void input_destroy(struct roots_input *input); void input_destroy(struct roots_input *input);
void pointer_add(struct wlr_input_device *device, struct roots_input *input); void pointer_add(struct wlr_input_device *device, struct roots_input *input);
void pointer_remove(struct wlr_input_device *device, struct roots_input *input);
void keyboard_add(struct wlr_input_device *device, struct roots_input *input); void keyboard_add(struct wlr_input_device *device, struct roots_input *input);
void keyboard_remove(struct wlr_input_device *device, struct roots_input *input);
void cursor_initialize(struct roots_input *input); void cursor_initialize(struct roots_input *input);
void cursor_load_config(struct roots_config *config, void cursor_load_config(struct roots_config *config,

View file

@ -52,10 +52,10 @@ static void input_remove_notify(struct wl_listener *listener, void *data) {
struct roots_input *input = wl_container_of(listener, input, input_remove); struct roots_input *input = wl_container_of(listener, input, input_remove);
switch (device->type) { switch (device->type) {
case WLR_INPUT_DEVICE_KEYBOARD: case WLR_INPUT_DEVICE_KEYBOARD:
//keyboard_remove(device, input); keyboard_remove(device, input);
break; break;
case WLR_INPUT_DEVICE_POINTER: case WLR_INPUT_DEVICE_POINTER:
//pointer_remove(device, input); pointer_remove(device, input);
break; break;
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
//touch_remove(device, input); //touch_remove(device, input);

View file

@ -42,6 +42,7 @@ static void keyboard_key_notify(struct wl_listener *listener, void *data) {
void keyboard_add(struct wlr_input_device *device, struct roots_input *input) { void keyboard_add(struct wlr_input_device *device, struct roots_input *input) {
struct roots_keyboard *keyboard = calloc(sizeof(struct roots_keyboard), 1); struct roots_keyboard *keyboard = calloc(sizeof(struct roots_keyboard), 1);
device->data = keyboard;
keyboard->device = device; keyboard->device = device;
keyboard->input = input; keyboard->input = input;
wl_list_init(&keyboard->key.link); wl_list_init(&keyboard->key.link);
@ -64,3 +65,11 @@ void keyboard_add(struct wlr_input_device *device, struct roots_input *input) {
xkb_context_unref(context); xkb_context_unref(context);
wlr_seat_attach_keyboard(input->wl_seat, device); wlr_seat_attach_keyboard(input->wl_seat, device);
} }
void keyboard_remove(struct wlr_input_device *device, struct roots_input *input) {
struct roots_keyboard *keyboard = device->data;
wlr_seat_detach_keyboard(input->wl_seat, device->keyboard);
wl_list_remove(&keyboard->key.link);
wl_list_remove(&keyboard->link);
free(keyboard);
}

View file

@ -6,6 +6,7 @@
void pointer_add(struct wlr_input_device *device, struct roots_input *input) { void pointer_add(struct wlr_input_device *device, struct roots_input *input) {
struct roots_pointer *pointer = calloc(sizeof(struct roots_pointer), 1); struct roots_pointer *pointer = calloc(sizeof(struct roots_pointer), 1);
device->data = pointer;
pointer->device = device; pointer->device = device;
pointer->input = input; pointer->input = input;
wl_list_insert(&input->pointers, &pointer->link); wl_list_insert(&input->pointers, &pointer->link);
@ -13,3 +14,10 @@ void pointer_add(struct wlr_input_device *device, struct roots_input *input) {
cursor_load_config(input->server->config, input->cursor, cursor_load_config(input->server->config, input->cursor,
input, input->server->desktop); input, input->server->desktop);
} }
void pointer_remove(struct wlr_input_device *device, struct roots_input *input) {
struct roots_pointer *pointer = device->data;
wlr_cursor_detach_input_device(input->cursor, device);
wl_list_remove(&pointer->link);
free(pointer);
}