From d6983346209fc97991f3c2d8abdc57cb90f40ffe Mon Sep 17 00:00:00 2001 From: Tudor Brindus Date: Tue, 28 Apr 2020 16:15:00 -0400 Subject: [PATCH] input/tablet: clear focused surface on surface destroy Otherwise, we can end up left with a dangling pointer to a previously-focused, now-destroyed surface. Fixes swaywm/sway#5264. --- types/tablet_v2/.wlr_tablet_v2_tool.c.swp | Bin 0 -> 49152 bytes types/tablet_v2/wlr_tablet_v2_tool.c | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 types/tablet_v2/.wlr_tablet_v2_tool.c.swp diff --git a/types/tablet_v2/.wlr_tablet_v2_tool.c.swp b/types/tablet_v2/.wlr_tablet_v2_tool.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..5b28efe4363f63808989995c76c8af925050a936 GIT binary patch literal 49152 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 wl_list_remove(&tool->tool_destroy.link); wl_list_remove(&tool->events.set_cursor.listener_list); + wl_list_remove(&tool->surface_destroy.link); free(tool); } @@ -226,11 +227,11 @@ struct wlr_tablet_v2_tablet_tool *wlr_tablet_tool_create( tool->wlr_tool = wlr_tool; wl_list_init(&tool->clients); + wl_list_init(&tool->surface_destroy.link); tool->default_grab.tool = tool; tool->default_grab.interface = &default_tool_grab_interface; tool->grab = &tool->default_grab; - tool->tool_destroy.notify = handle_wlr_tablet_tool_destroy; wl_signal_add(&wlr_tool->events.destroy, &tool->tool_destroy); wl_list_insert(&seat->tools, &tool->link); @@ -322,6 +323,13 @@ static void queue_tool_frame(struct wlr_tablet_tool_client_v2 *tool) { } } +static void handle_tablet_tool_surface_destroy(struct wl_listener *listener, + void *data) { + struct wlr_tablet_v2_tablet_tool *tool = + wl_container_of(listener, tool, surface_destroy); + wlr_send_tablet_v2_tablet_tool_proximity_out(tool); +} + void wlr_send_tablet_v2_tablet_tool_proximity_in( struct wlr_tablet_v2_tablet_tool *tool, struct wlr_tablet_v2_tablet *tablet, @@ -366,6 +374,11 @@ void wlr_send_tablet_v2_tablet_tool_proximity_in( return; } + // Reinitialize the focus destroy events + wl_list_remove(&tool->surface_destroy.link); + wl_signal_add(&surface->events.destroy, &tool->surface_destroy); + tool->surface_destroy.notify = handle_tablet_tool_surface_destroy; + tool->current_client = tool_client; uint32_t serial = wlr_seat_client_next_serial(tool_client->seat->seat_client); @@ -418,6 +431,8 @@ void wlr_send_tablet_v2_tablet_tool_proximity_out( zwp_tablet_tool_v2_send_proximity_out(tool->current_client->resource); send_tool_frame(tool->current_client); + wl_list_remove(&tool->surface_destroy.link); + wl_list_init(&tool->surface_destroy.link); tool->current_client = NULL; tool->focused_surface = NULL; }