From b8c3fdaef9631afec6be17957ee7dae693b56a18 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Tue, 13 Sep 2022 10:55:59 -0400 Subject: [PATCH] seat: Listen for destroy signal of pressed.surface --- include/labwc.h | 3 +++ src/cursor.c | 4 +--- src/layers.c | 3 --- src/seat.c | 34 +++++++++++++++++++++++++++++++--- src/view.c | 5 ----- src/xwayland-unmanaged.c | 3 --- 6 files changed, 35 insertions(+), 17 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index 2de216f9..c63a1818 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -152,6 +152,7 @@ struct seat { struct wl_listener destroy_drag; struct wl_listener constraint_commit; struct wl_listener idle_inhibitor_create; + struct wl_listener pressed_surface_destroy; }; struct lab_data_buffer; @@ -561,6 +562,8 @@ void seat_finish(struct server *server); void seat_reconfigure(struct server *server); void seat_focus_surface(struct seat *seat, struct wlr_surface *surface); void seat_set_focus_layer(struct seat *seat, struct wlr_layer_surface_v1 *layer); +void seat_set_pressed(struct seat *seat, struct view *view, + struct wlr_scene_node *node, struct wlr_surface *surface); void seat_reset_pressed(struct seat *seat); void interactive_begin(struct view *view, enum input_mode mode, diff --git a/src/cursor.c b/src/cursor.c index cf7d01ba..27f8cfea 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -814,9 +814,7 @@ cursor_button(struct wl_listener *listener, void *data) /* Handle _press */ if (surface) { - seat->pressed.view = view; - seat->pressed.node = node; - seat->pressed.surface = surface; + seat_set_pressed(seat, view, node, surface); } if (server->input_mode == LAB_INPUT_STATE_MENU) { diff --git a/src/layers.c b/src/layers.c index a6e2e4bd..674deaa9 100644 --- a/src/layers.c +++ b/src/layers.c @@ -145,9 +145,6 @@ unmap(struct lab_layer_surface *layer) if (seat->focused_layer == layer->scene_layer_surface->layer_surface) { seat_set_focus_layer(seat, NULL); } - if (seat->pressed.surface == layer->scene_layer_surface->layer_surface->surface) { - seat_reset_pressed(seat); - } } static void diff --git a/src/seat.c b/src/seat.c index 56edaef3..e7dabff9 100644 --- a/src/seat.c +++ b/src/seat.c @@ -370,10 +370,38 @@ seat_set_focus_layer(struct seat *seat, struct wlr_layer_surface_v1 *layer) } } +static void +pressed_surface_destroy(struct wl_listener *listener, void *data) +{ + struct wlr_surface *surface = data; + struct seat *seat = wl_container_of(listener, seat, + pressed_surface_destroy); + + assert(surface == seat->pressed.surface); + seat_reset_pressed(seat); +} + +void +seat_set_pressed(struct seat *seat, struct view *view, + struct wlr_scene_node *node, struct wlr_surface *surface) +{ + assert(surface); + seat_reset_pressed(seat); + + seat->pressed.view = view; + seat->pressed.node = node; + seat->pressed.surface = surface; + seat->pressed_surface_destroy.notify = pressed_surface_destroy; + wl_signal_add(&surface->events.destroy, &seat->pressed_surface_destroy); +} + void seat_reset_pressed(struct seat *seat) { - seat->pressed.view = NULL; - seat->pressed.node = NULL; - seat->pressed.surface = NULL; + if (seat->pressed.surface) { + seat->pressed.view = NULL; + seat->pressed.node = NULL; + seat->pressed.surface = NULL; + wl_list_remove(&seat->pressed_surface_destroy.link); + } } diff --git a/src/view.c b/src/view.c index 0ee9c317..2976a087 100644 --- a/src/view.c +++ b/src/view.c @@ -815,11 +815,6 @@ view_destroy(struct view *view) need_cursor_update = true; } - if (server->seat.pressed.view == view) { - /* Mouse was pressed on surface and is still pressed */ - seat_reset_pressed(&server->seat); - } - if (server->focused_view == view) { server->focused_view = NULL; need_cursor_update = true; diff --git a/src/xwayland-unmanaged.c b/src/xwayland-unmanaged.c index b09b6196..44608485 100644 --- a/src/xwayland-unmanaged.c +++ b/src/xwayland-unmanaged.c @@ -101,9 +101,6 @@ unmanaged_handle_unmap(struct wl_listener *listener, void *data) * Mark the node as gone so a racing configure event * won't try to reposition the node while unmapped. */ - if (unmanaged->node && seat->pressed.node == unmanaged->node) { - seat_reset_pressed(seat); - } unmanaged->node = NULL; cursor_update_focus(unmanaged->server); -- 2.52.0