swaybar: Fix input device removal

Before swaybar would exit with a protocol error when a pointer or touch
device was removed.
This commit is contained in:
Andri Yngvason 2020-01-03 15:38:29 +00:00 committed by Simon Ser
parent 4c29a53386
commit fd24b1afd8

View file

@ -405,15 +405,14 @@ static const struct wl_touch_listener touch_listener = {
static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat, static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat,
enum wl_seat_capability caps) { enum wl_seat_capability caps) {
struct swaybar_seat *seat = data; 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); wl_pointer_release(seat->pointer.pointer);
seat->pointer.pointer = NULL; seat->pointer.pointer = NULL;
} } else if (have_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)) {
seat->pointer.pointer = wl_seat_get_pointer(wl_seat); seat->pointer.pointer = wl_seat_get_pointer(wl_seat);
if (seat->bar->running && !seat->pointer.cursor_surface) { if (seat->bar->running && !seat->pointer.cursor_surface) {
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); 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); seat->touch.touch = wl_seat_get_touch(wl_seat);
wl_touch_add_listener(seat->touch.touch, &touch_listener, seat); wl_touch_add_listener(seat->touch.touch, &touch_listener, seat);
} }