aboutsummaryrefslogtreecommitdiff
path: root/sway/input/seat.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/seat.c')
-rw-r--r--sway/input/seat.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 0a5329c8..7c827374 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -42,6 +42,18 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input,
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,
struct wlr_input_device *device) {
// 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,
struct wlr_input_device *device) {
- struct sway_keyboard *keyboard = sway_keyboard_create(seat, device);
- wl_list_insert(&seat->keyboards, &keyboard->link);
+ // TODO keyboard configuration
+ if (seat_keyboard_from_device(seat, device)) {
+ // already added
+ return;
+ }
+
+ sway_keyboard_create(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,
struct wlr_input_device *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);
break;
case WLR_INPUT_DEVICE_KEYBOARD:
+ seat_remove_keyboard(seat, device);
+ break;
case WLR_INPUT_DEVICE_TOUCH:
case WLR_INPUT_DEVICE_TABLET_PAD:
case WLR_INPUT_DEVICE_TABLET_TOOL: