aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2017-08-11 22:46:50 +0200
committerDominique Martinet <asmadeus@codewreck.org>2017-08-12 00:11:18 +0200
commitbe3a0ad065a946c8dfe753368757f3d5744059e6 (patch)
tree6b7468f55780a5bc0155e141297a5731d1dfe75a
parent65a899924221c3104800a8676852b34b0cd7223d (diff)
libinput backend: fill in handle_device_removed
And fix input_remove_notify accordingly
-rw-r--r--backend/libinput/events.c17
-rw-r--r--examples/shared.c5
2 files changed, 17 insertions, 5 deletions
diff --git a/backend/libinput/events.c b/backend/libinput/events.c
index 0cdf26ec..9afdab21 100644
--- a/backend/libinput/events.c
+++ b/backend/libinput/events.c
@@ -111,8 +111,21 @@ static void handle_device_added(struct wlr_backend_state *state,
static void handle_device_removed(struct wlr_backend_state *state,
struct libinput_device *device) {
- wlr_log(L_DEBUG, "libinput device removed");
- // TODO
+ list_t *devices = libinput_device_get_user_data(device);
+ for (size_t i = 0; i < devices->length; i++) {
+ struct wlr_input_device *wlr_device = devices->items[i];
+ wlr_log(L_DEBUG, "Removing %s [%d:%d]", wlr_device->name,
+ wlr_device->vendor, wlr_device->product);
+ wl_signal_emit(&state->backend->events.input_remove, wlr_device);
+ wlr_input_device_destroy(wlr_device);
+ }
+ for (size_t i = 0; i < state->devices->length; i++) {
+ if (state->devices->items[i] == devices) {
+ list_del(state->devices, i);
+ break;
+ }
+ }
+ list_free(devices);
}
void wlr_libinput_event(struct wlr_backend_state *state,
diff --git a/examples/shared.c b/examples/shared.c
index 6efa1bef..0605dd72 100644
--- a/examples/shared.c
+++ b/examples/shared.c
@@ -384,14 +384,13 @@ static void tablet_pad_remove(struct wlr_input_device *device, struct compositor
if (!pstate) {
return;
}
- // TODO probably missing more actions
+ wl_list_remove(&pstate->button.link);
free(pstate);
}
-// TODO missing something that calls this on teardown
static void input_remove_notify(struct wl_listener *listener, void *data) {
struct wlr_input_device *device = data;
- struct compositor_state *state = wl_container_of(listener, state, input_add);
+ struct compositor_state *state = wl_container_of(listener, state, input_remove);
switch (device->type) {
case WLR_INPUT_DEVICE_KEYBOARD:
keyboard_remove(device, state);