From 10cbb9fbe141ee8f5c766783bde645ae19998d22 Mon Sep 17 00:00:00 2001 From: Simon Zeni Date: Wed, 2 Mar 2022 16:07:40 -0500 Subject: [PATCH] interface/wlr_touch: rework destroy sequence The destroy callback in wlr_touch_impl has been removed. The function `wlr_touch_finish` has been introduced to clean up the resources owned by a wlr_touch. `wlr_input_device_destroy` no longer destroys the wlr_touch, attempting to destroy a wlr_touch will result in a no-op. The field `name` has been added to the wlr_touch_impl to be able to identify a given wlr_touch device. --- backend/libinput/events.c | 2 +- backend/libinput/touch.c | 6 +----- backend/wayland/seat.c | 4 ++++ backend/x11/input_device.c | 6 +----- backend/x11/output.c | 2 +- include/wlr/interfaces/wlr_touch.h | 4 ++-- types/wlr_input_device.c | 3 +-- types/wlr_touch.c | 7 +------ 8 files changed, 12 insertions(+), 22 deletions(-) diff --git a/backend/libinput/events.c b/backend/libinput/events.c index f032b4a5..e52dbd95 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -24,7 +24,7 @@ void destroy_libinput_input_device(struct wlr_libinput_input_device *dev) { wlr_switch_finish(&dev->switch_device); } if (dev->touch.impl) { - wlr_touch_destroy(&dev->touch); + wlr_touch_finish(&dev->touch); } if (dev->tablet.impl) { finish_device_tablet(dev); diff --git a/backend/libinput/touch.c b/backend/libinput/touch.c index 5b4dcbd6..481a5787 100644 --- a/backend/libinput/touch.c +++ b/backend/libinput/touch.c @@ -4,12 +4,8 @@ #include "backend/libinput.h" #include "util/signal.h" -static void touch_destroy(struct wlr_touch *touch) { - /* wlr_touch belongs to the wlr_libinput_input_device */ -} - const struct wlr_touch_impl libinput_touch_impl = { - .destroy = touch_destroy, + .name = "libinput-touch", }; void init_device_touch(struct wlr_libinput_input_device *dev) { diff --git a/backend/wayland/seat.c b/backend/wayland/seat.c index cf1bba91..de756d80 100644 --- a/backend/wayland/seat.c +++ b/backend/wayland/seat.c @@ -567,6 +567,10 @@ void destroy_wl_input_device(struct wlr_wl_input_device *dev) { wlr_tablet_finish(wlr_dev->tablet); free(wlr_dev->tablet); break; + case WLR_INPUT_DEVICE_TOUCH: + wlr_touch_finish(wlr_dev->touch); + free(wlr_dev->touch); + break; default: wlr_input_device_destroy(wlr_dev); break; diff --git a/backend/x11/input_device.c b/backend/x11/input_device.c index 9182ba8e..77edf8ad 100644 --- a/backend/x11/input_device.c +++ b/backend/x11/input_device.c @@ -293,12 +293,8 @@ const struct wlr_pointer_impl x11_pointer_impl = { .name = "x11-pointer", }; -static void touch_destroy(struct wlr_touch *wlr_touch) { - // Don't free the touch, it's on the stack -} - const struct wlr_touch_impl x11_touch_impl = { - .destroy = touch_destroy, + .name = "x11-touch", }; void update_x11_pointer_position(struct wlr_x11_output *output, diff --git a/backend/x11/output.c b/backend/x11/output.c index 24c08fce..1b51b629 100644 --- a/backend/x11/output.c +++ b/backend/x11/output.c @@ -77,7 +77,7 @@ static void output_destroy(struct wlr_output *wlr_output) { pixman_region32_fini(&output->exposed); wlr_pointer_finish(&output->pointer); - wlr_touch_destroy(&output->touch); + wlr_touch_finish(&output->touch); struct wlr_x11_buffer *buffer, *buffer_tmp; wl_list_for_each_safe(buffer, buffer_tmp, &output->buffers, link) { diff --git a/include/wlr/interfaces/wlr_touch.h b/include/wlr/interfaces/wlr_touch.h index 2b95d2bf..e48a92f2 100644 --- a/include/wlr/interfaces/wlr_touch.h +++ b/include/wlr/interfaces/wlr_touch.h @@ -12,11 +12,11 @@ #include struct wlr_touch_impl { - void (*destroy)(struct wlr_touch *touch); + const char *name; }; void wlr_touch_init(struct wlr_touch *touch, const struct wlr_touch_impl *impl, const char *name); -void wlr_touch_destroy(struct wlr_touch *touch); +void wlr_touch_finish(struct wlr_touch *touch); #endif diff --git a/types/wlr_input_device.c b/types/wlr_input_device.c index 067c0b0d..69c1536a 100644 --- a/types/wlr_input_device.c +++ b/types/wlr_input_device.c @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include "util/signal.h" @@ -45,7 +44,7 @@ void wlr_input_device_destroy(struct wlr_input_device *dev) { wlr_log(WLR_ERROR, "wlr_switch will not be destroyed"); break; case WLR_INPUT_DEVICE_TOUCH: - wlr_touch_destroy(dev->touch); + wlr_log(WLR_ERROR, "wlr_touch will not be destroyed"); break; case WLR_INPUT_DEVICE_TABLET_TOOL: wlr_log(WLR_ERROR, "wlr_tablet_tool will not be destroyed"); diff --git a/types/wlr_touch.c b/types/wlr_touch.c index 36619110..de288347 100644 --- a/types/wlr_touch.c +++ b/types/wlr_touch.c @@ -17,11 +17,6 @@ void wlr_touch_init(struct wlr_touch *touch, wl_signal_init(&touch->events.frame); } -void wlr_touch_destroy(struct wlr_touch *touch) { +void wlr_touch_finish(struct wlr_touch *touch) { wlr_input_device_finish(&touch->base); - if (touch && touch->impl && touch->impl->destroy) { - touch->impl->destroy(touch); - } else { - free(touch); - } }