]> git.mdlowis.com Git - proto/labwc.git/commitdiff
seat: Listen for destroy signal of pressed.surface
authorJohn Lindgren <john@jlindgren.net>
Tue, 13 Sep 2022 14:55:59 +0000 (10:55 -0400)
committerJohn Lindgren <john@jlindgren.net>
Tue, 13 Sep 2022 19:57:20 +0000 (15:57 -0400)
include/labwc.h
src/cursor.c
src/layers.c
src/seat.c
src/view.c
src/xwayland-unmanaged.c

index 2de216f93181fc8dba5aa7ce808f6ef846922427..c63a18186133eea1949ced45242a612b39641f76 100644 (file)
@@ -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,
index cf7d01ba2059c73bdf066d8686e01d925e6d8dfd..27f8cfea9fe2bb36469528a811fc9c3770724fc1 100644 (file)
@@ -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) {
index a6e2e4bdc08998ef4e57b23e0ebdfff5d3b17e54..674deaa941f10cac51d7361138a8cb8bf5b24648 100644 (file)
@@ -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
index 56edaef31d2735ce29eb91a28f02f6186ed0f44e..e7dabff9ba00fe25f111d2c773b03b1e340eb178 100644 (file)
@@ -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);
+       }
 }
index 0ee9c31753cfd353351e5ebc841e1913d6623303..2976a08799fac36f858fcff90d9e2aa8ea83ca68 100644 (file)
@@ -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;
index b09b6196c46bc115f5c67dc00b9796c423a65b6d..44608485ed3a71549ec46c12cad58bcee955e440 100644 (file)
@@ -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);