keyboard remove

This commit is contained in:
Tony Crisci 2017-12-10 15:37:17 -05:00
parent 5e9ee32d63
commit 4d449743c5
3 changed files with 40 additions and 2 deletions

View file

@ -11,3 +11,5 @@ struct sway_keyboard {
struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
struct wlr_input_device *device); struct wlr_input_device *device);
void sway_keyboard_destroy(struct sway_keyboard *keyboard);

View file

@ -53,5 +53,14 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
wl_signal_add(&device->keyboard->events.modifiers, &keyboard->keyboard_modifiers); wl_signal_add(&device->keyboard->events.modifiers, &keyboard->keyboard_modifiers);
keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers;
wl_list_insert(&seat->keyboards, &keyboard->link);
return keyboard; return keyboard;
} }
void sway_keyboard_destroy(struct sway_keyboard *keyboard) {
wl_list_remove(&keyboard->keyboard_key.link);
wl_list_remove(&keyboard->keyboard_modifiers.link);
wl_list_remove(&keyboard->link);
free(keyboard);
}

View file

@ -42,6 +42,18 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input,
return seat; return seat;
} }
static struct sway_keyboard *seat_keyboard_from_device(struct sway_seat *seat,
struct wlr_input_device *device) {
struct sway_keyboard *keyboard = NULL;
wl_list_for_each(keyboard, &seat->keyboards, link) {
if (keyboard->device == device) {
return keyboard;
}
}
return keyboard;
}
static void seat_add_pointer(struct sway_seat *seat, static void seat_add_pointer(struct sway_seat *seat,
struct wlr_input_device *device) { struct wlr_input_device *device) {
// TODO pointer configuration // TODO pointer configuration
@ -50,8 +62,13 @@ static void seat_add_pointer(struct sway_seat *seat,
static void seat_add_keyboard(struct sway_seat *seat, static void seat_add_keyboard(struct sway_seat *seat,
struct wlr_input_device *device) { struct wlr_input_device *device) {
struct sway_keyboard *keyboard = sway_keyboard_create(seat, device); // TODO keyboard configuration
wl_list_insert(&seat->keyboards, &keyboard->link); if (seat_keyboard_from_device(seat, device)) {
// already added
return;
}
sway_keyboard_create(seat, device);
wlr_seat_set_keyboard(seat->seat, device); wlr_seat_set_keyboard(seat->seat, device);
} }
@ -73,6 +90,14 @@ void sway_seat_add_device(struct sway_seat *seat,
} }
} }
static void seat_remove_keyboard(struct sway_seat *seat,
struct wlr_input_device *device) {
struct sway_keyboard *keyboard = seat_keyboard_from_device(seat, device);
if (keyboard) {
sway_keyboard_destroy(keyboard);
}
}
static void seat_remove_pointer(struct sway_seat *seat, static void seat_remove_pointer(struct sway_seat *seat,
struct wlr_input_device *device) { struct wlr_input_device *device) {
wlr_cursor_detach_input_device(seat->cursor->cursor, device); wlr_cursor_detach_input_device(seat->cursor->cursor, device);
@ -86,6 +111,8 @@ void sway_seat_remove_device(struct sway_seat *seat,
seat_remove_pointer(seat, device); seat_remove_pointer(seat, device);
break; break;
case WLR_INPUT_DEVICE_KEYBOARD: case WLR_INPUT_DEVICE_KEYBOARD:
seat_remove_keyboard(seat, device);
break;
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_PAD:
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET_TOOL: