From 51cd3c07264e1c4967c5baea3f6629ac01334e97 Mon Sep 17 00:00:00 2001 From: Simon Zeni Date: Wed, 2 Mar 2022 13:57:28 -0500 Subject: [PATCH] interface/wlr_pointer: rework destroy sequence The destroy callback in wlr_pointer_impl has been removed. The function `wlr_pointer_finish` has been introduced to clean up the resources owned by a wlr_pointer. `wlr_input_device_destroy` no longer destroys the wlr_pointer, attempting to destroy a wlr_pointer will result in a no-op. The field `name` has been added to the wlr_pointer_impl to be able to identify a given wlr_pointer device. --- backend/libinput/events.c | 2 +- backend/libinput/pointer.c | 6 +--- backend/wayland/seat.c | 53 ++++++++++++++-------------- backend/x11/input_device.c | 6 +--- backend/x11/output.c | 2 +- include/wlr/interfaces/wlr_pointer.h | 4 +-- types/wlr_input_device.c | 3 +- types/wlr_pointer.c | 10 +----- types/wlr_virtual_pointer_v1.c | 13 +++---- 9 files changed, 40 insertions(+), 59 deletions(-) diff --git a/backend/libinput/events.c b/backend/libinput/events.c index af54177c..22fdab55 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -18,7 +18,7 @@ void destroy_libinput_input_device(struct wlr_libinput_input_device *dev) { wlr_keyboard_finish(&dev->keyboard); } if (dev->pointer.impl) { - wlr_pointer_destroy(&dev->pointer); + wlr_pointer_finish(&dev->pointer); } if (dev->switch_device.impl) { wlr_switch_destroy(&dev->switch_device); diff --git a/backend/libinput/pointer.c b/backend/libinput/pointer.c index 0ac781d7..8daf2005 100644 --- a/backend/libinput/pointer.c +++ b/backend/libinput/pointer.c @@ -4,12 +4,8 @@ #include "backend/libinput.h" #include "util/signal.h" -static void pointer_destroy(struct wlr_pointer *pointer) { - /* wlr_pointer belongs to the wlr_libinput_input_device */ -} - const struct wlr_pointer_impl libinput_pointer_impl = { - .destroy = pointer_destroy, + .name = "libinput-pointer", }; void init_device_pointer(struct wlr_libinput_input_device *dev) { diff --git a/backend/wayland/seat.c b/backend/wayland/seat.c index e2a61bd4..1edd0f2c 100644 --- a/backend/wayland/seat.c +++ b/backend/wayland/seat.c @@ -500,29 +500,6 @@ struct wlr_wl_input_device *create_wl_input_device( return dev; } -void destroy_wl_input_device(struct wlr_wl_input_device *dev) { - /** - * TODO remove the redundant wlr_input_device from wlr_wl_input_device - * wlr_wl_input_device::wlr_input_device is not owned by its input device - * type, which means we have 2 wlr_input_device to cleanup - */ - wlr_input_device_finish(&dev->wlr_input_device); - if (dev->wlr_input_device._device) { - struct wlr_input_device *wlr_dev = &dev->wlr_input_device; - switch (wlr_dev->type) { - case WLR_INPUT_DEVICE_KEYBOARD: - wlr_keyboard_finish(wlr_dev->keyboard); - free(wlr_dev->keyboard); - break; - default: - wlr_input_device_destroy(wlr_dev); - break; - } - } - wl_list_remove(&dev->link); - free(dev); -} - struct wlr_wl_pointer *pointer_get_wl(struct wlr_pointer *wlr_pointer) { assert(wlr_pointer->impl == &pointer_impl); return (struct wlr_wl_pointer *)wlr_pointer; @@ -555,13 +532,37 @@ static void pointer_destroy(struct wlr_pointer *wlr_pointer) { zwp_relative_pointer_v1_destroy(pointer->relative_pointer); } + wlr_pointer_finish(&pointer->wlr_pointer); wl_list_remove(&pointer->output_destroy.link); free(pointer); } -static const struct wlr_pointer_impl pointer_impl = { - .destroy = pointer_destroy, -}; +void destroy_wl_input_device(struct wlr_wl_input_device *dev) { + /** + * TODO remove the redundant wlr_input_device from wlr_wl_input_device + * wlr_wl_input_device::wlr_input_device is not owned by its input device + * type, which means we have 2 wlr_input_device to cleanup + */ + wlr_input_device_finish(&dev->wlr_input_device); + if (dev->wlr_input_device._device) { + struct wlr_input_device *wlr_dev = &dev->wlr_input_device; + switch (wlr_dev->type) { + case WLR_INPUT_DEVICE_KEYBOARD: + wlr_keyboard_finish(wlr_dev->keyboard); + free(wlr_dev->keyboard); + break; + case WLR_INPUT_DEVICE_POINTER: + /* Owned by wlr_wl_pointer */ + pointer_destroy(wlr_dev->pointer); + break; + default: + wlr_input_device_destroy(wlr_dev); + break; + } + } + wl_list_remove(&dev->link); + free(dev); +} static void gesture_swipe_begin(void *data, struct zwp_pointer_gesture_swipe_v1 *zwp_pointer_gesture_swipe_v1, diff --git a/backend/x11/input_device.c b/backend/x11/input_device.c index 3bbbe594..9182ba8e 100644 --- a/backend/x11/input_device.c +++ b/backend/x11/input_device.c @@ -289,12 +289,8 @@ const struct wlr_keyboard_impl x11_keyboard_impl = { .name = "x11-keyboard", }; -static void pointer_destroy(struct wlr_pointer *wlr_pointer) { - // Don't free the pointer, it's on the stack -} - const struct wlr_pointer_impl x11_pointer_impl = { - .destroy = pointer_destroy, + .name = "x11-pointer", }; static void touch_destroy(struct wlr_touch *wlr_touch) { diff --git a/backend/x11/output.c b/backend/x11/output.c index 7037c36c..24c08fce 100644 --- a/backend/x11/output.c +++ b/backend/x11/output.c @@ -76,7 +76,7 @@ static void output_destroy(struct wlr_output *wlr_output) { pixman_region32_fini(&output->exposed); - wlr_pointer_destroy(&output->pointer); + wlr_pointer_finish(&output->pointer); wlr_touch_destroy(&output->touch); struct wlr_x11_buffer *buffer, *buffer_tmp; diff --git a/include/wlr/interfaces/wlr_pointer.h b/include/wlr/interfaces/wlr_pointer.h index e3950017..74e0feaf 100644 --- a/include/wlr/interfaces/wlr_pointer.h +++ b/include/wlr/interfaces/wlr_pointer.h @@ -12,11 +12,11 @@ #include struct wlr_pointer_impl { - void (*destroy)(struct wlr_pointer *pointer); + const char *name; }; void wlr_pointer_init(struct wlr_pointer *pointer, const struct wlr_pointer_impl *impl, const char *name); -void wlr_pointer_destroy(struct wlr_pointer *pointer); +void wlr_pointer_finish(struct wlr_pointer *pointer); #endif diff --git a/types/wlr_input_device.c b/types/wlr_input_device.c index 4a9ef806..6bf42de9 100644 --- a/types/wlr_input_device.c +++ b/types/wlr_input_device.c @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -43,7 +42,7 @@ void wlr_input_device_destroy(struct wlr_input_device *dev) { wlr_log(WLR_ERROR, "wlr_keyboard will not be destroyed"); break; case WLR_INPUT_DEVICE_POINTER: - wlr_pointer_destroy(dev->pointer); + wlr_log(WLR_ERROR, "wlr_pointer will not be destroyed"); break; case WLR_INPUT_DEVICE_SWITCH: wlr_switch_destroy(dev->switch_device); diff --git a/types/wlr_pointer.c b/types/wlr_pointer.c index caabec1b..9f07e290 100644 --- a/types/wlr_pointer.c +++ b/types/wlr_pointer.c @@ -25,14 +25,6 @@ void wlr_pointer_init(struct wlr_pointer *pointer, wl_signal_init(&pointer->events.hold_end); } -void wlr_pointer_destroy(struct wlr_pointer *pointer) { - if (!pointer) { - return; - } +void wlr_pointer_finish(struct wlr_pointer *pointer) { wlr_input_device_finish(&pointer->base); - if (pointer->impl && pointer->impl->destroy) { - pointer->impl->destroy(pointer); - } else { - free(pointer); - } } diff --git a/types/wlr_virtual_pointer_v1.c b/types/wlr_virtual_pointer_v1.c index 8c232c81..21eeee60 100644 --- a/types/wlr_virtual_pointer_v1.c +++ b/types/wlr_virtual_pointer_v1.c @@ -8,12 +8,8 @@ #include "util/signal.h" #include "wlr-virtual-pointer-unstable-v1-protocol.h" -static void pointer_destroy(struct wlr_pointer *pointer) { - /* no-op, pointer belongs to the wlr_virtual_pointer_v1 */ -} - static const struct wlr_pointer_impl pointer_impl = { - .destroy = pointer_destroy, + .name = "virtual-pointer", }; static const struct zwlr_virtual_pointer_v1_interface virtual_pointer_impl; @@ -203,9 +199,10 @@ static void virtual_pointer_destroy_resource(struct wl_resource *resource) { return; } - /* TODO: rework wlr_pointer device destruction */ wlr_signal_emit_safe(&pointer->events.destroy, pointer); - wlr_pointer_destroy(&pointer->pointer); + + wlr_pointer_finish(&pointer->pointer); + wl_resource_set_user_data(pointer->resource, NULL); wl_list_remove(&pointer->link); free(pointer); @@ -251,7 +248,7 @@ static void virtual_pointer_manager_create_virtual_pointer_with_output( } wlr_pointer_init(&virtual_pointer->pointer, &pointer_impl, - "virtual-pointer"); + "wlr_virtual_pointer_v1"); struct wl_resource *pointer_resource = wl_resource_create(client, &zwlr_virtual_pointer_v1_interface, wl_resource_get_version(resource),