diff options
author | Andri Yngvason <andri@yngvason.is> | 2020-01-03 15:38:29 +0000 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-01-05 19:57:05 +0100 |
commit | fd24b1afd874d6da8ae603c1d0919078803f132d (patch) | |
tree | 3f1a6631c2995c2abdfa57dbfc12d0c28ad03296 /swaybar | |
parent | 4c29a53386d77251fa108294a1353e9567301d4f (diff) |
swaybar: Fix input device removal
Before swaybar would exit with a protocol error when a pointer or touch
device was removed.
Diffstat (limited to 'swaybar')
-rw-r--r-- | swaybar/input.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/swaybar/input.c b/swaybar/input.c index 8b83eab4..7f68caec 100644 --- a/swaybar/input.c +++ b/swaybar/input.c @@ -405,15 +405,14 @@ static const struct wl_touch_listener touch_listener = { static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat, enum wl_seat_capability caps) { struct swaybar_seat *seat = data; - if (seat->pointer.pointer != NULL) { + + bool have_pointer = caps & WL_SEAT_CAPABILITY_POINTER; + bool have_touch = caps & WL_SEAT_CAPABILITY_TOUCH; + + if (!have_pointer && seat->pointer.pointer != NULL) { wl_pointer_release(seat->pointer.pointer); seat->pointer.pointer = NULL; - } - if (seat->touch.touch != NULL) { - wl_touch_release(seat->touch.touch); - seat->touch.touch = NULL; - } - if ((caps & WL_SEAT_CAPABILITY_POINTER)) { + } else if (have_pointer && seat->pointer.pointer == NULL) { seat->pointer.pointer = wl_seat_get_pointer(wl_seat); if (seat->bar->running && !seat->pointer.cursor_surface) { seat->pointer.cursor_surface = @@ -422,7 +421,10 @@ static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat, } wl_pointer_add_listener(seat->pointer.pointer, &pointer_listener, seat); } - if ((caps & WL_SEAT_CAPABILITY_TOUCH)) { + if (!have_touch && seat->touch.touch != NULL) { + wl_touch_release(seat->touch.touch); + seat->touch.touch = NULL; + } else if (have_touch && seat->touch.touch == NULL) { seat->touch.touch = wl_seat_get_touch(wl_seat); wl_touch_add_listener(seat->touch.touch, &touch_listener, seat); } |