diff --git a/include/wlr/interfaces/wlr_input_device.h b/include/wlr/interfaces/wlr_input_device.h index 04d5644f..de527393 100644 --- a/include/wlr/interfaces/wlr_input_device.h +++ b/include/wlr/interfaces/wlr_input_device.h @@ -18,6 +18,13 @@ struct wlr_input_device_impl { void wlr_input_device_init(struct wlr_input_device *wlr_device, enum wlr_input_device_type type, const struct wlr_input_device_impl *impl, const char *name); + +/** + * Cleans up all of the provided wlr_input_device resources and signals the + * destroy event. + */ +void wlr_input_device_finish(struct wlr_input_device *wlr_device); + void wlr_input_device_destroy(struct wlr_input_device *dev); #endif diff --git a/types/wlr_input_device.c b/types/wlr_input_device.c index 7f9654e5..50afdaff 100644 --- a/types/wlr_input_device.c +++ b/types/wlr_input_device.c @@ -25,6 +25,17 @@ void wlr_input_device_init(struct wlr_input_device *dev, wl_signal_init(&dev->events.destroy); } +void wlr_input_device_finish(struct wlr_input_device *wlr_device) { + if (!wlr_device) { + return; + } + + wlr_signal_emit_safe(&wlr_device->events.destroy, wlr_device); + + free(wlr_device->name); + free(wlr_device->output_name); +} + void wlr_input_device_destroy(struct wlr_input_device *dev) { if (!dev) { return;