]> git.mdlowis.com Git - proto/labwc.git/commitdiff
foreign-toplevel: disconnect internal signals from handle_handle_destroy()
authorJohn Lindgren <john@jlindgren.net>
Thu, 7 Aug 2025 19:27:12 +0000 (15:27 -0400)
committerJohn Lindgren <john@jlindgren.net>
Fri, 8 Aug 2025 03:27:04 +0000 (23:27 -0400)
If the handle gets destroyed from the wlroots side before the view
is destroyed, the internal signals (emitted from the view) are not
disconnected and will assert() if invoked.

src/foreign-toplevel/ext-foreign.c
src/foreign-toplevel/wlr-foreign.c

index e959b626cdc33f7fca2d07f596a2591448d31fde..e6c27fef3547236e4e2cd79570e4e8a1f3bccf92 100644 (file)
@@ -15,6 +15,14 @@ handle_handle_destroy(struct wl_listener *listener, void *data)
 
        /* Client side requests */
        wl_list_remove(&ext_toplevel->on.handle_destroy.link);
+
+       /* Compositor side state changes */
+       wl_list_remove(&ext_toplevel->on_view.new_app_id.link);
+       wl_list_remove(&ext_toplevel->on_view.new_title.link);
+
+       /* Internal signals */
+       wl_list_remove(&ext_toplevel->on_foreign_toplevel.toplevel_destroy.link);
+
        ext_toplevel->handle = NULL;
 }
 
@@ -60,14 +68,8 @@ handle_toplevel_destroy(struct wl_listener *listener, void *data)
                return;
        }
 
+       /* invokes handle_handle_destroy() which does more cleanup */
        wlr_ext_foreign_toplevel_handle_v1_destroy(ext_toplevel->handle);
-
-       /* Compositor side state changes */
-       wl_list_remove(&ext_toplevel->on_view.new_app_id.link);
-       wl_list_remove(&ext_toplevel->on_view.new_title.link);
-
-       /* Internal signals */
-       wl_list_remove(&ext_toplevel->on_foreign_toplevel.toplevel_destroy.link);
 }
 
 /* Internal API */
index 7c915ac416eaec13051fbb59fc6fe0bea071eb41..8252abf3e4215344de59508ea446a585a439f823 100644 (file)
@@ -72,6 +72,20 @@ handle_handle_destroy(struct wl_listener *listener, void *data)
        wl_list_remove(&wlr_toplevel->on.request_activate.link);
        wl_list_remove(&wlr_toplevel->on.request_close.link);
        wl_list_remove(&wlr_toplevel->on.handle_destroy.link);
+
+       /* Compositor side state changes */
+       wl_list_remove(&wlr_toplevel->on_view.new_app_id.link);
+       wl_list_remove(&wlr_toplevel->on_view.new_title.link);
+       wl_list_remove(&wlr_toplevel->on_view.new_outputs.link);
+       wl_list_remove(&wlr_toplevel->on_view.maximized.link);
+       wl_list_remove(&wlr_toplevel->on_view.minimized.link);
+       wl_list_remove(&wlr_toplevel->on_view.fullscreened.link);
+       wl_list_remove(&wlr_toplevel->on_view.activated.link);
+
+       /* Internal signals */
+       wl_list_remove(&wlr_toplevel->on_foreign_toplevel.toplevel_parent.link);
+       wl_list_remove(&wlr_toplevel->on_foreign_toplevel.toplevel_destroy.link);
+
        wlr_toplevel->handle = NULL;
 }
 
@@ -203,20 +217,8 @@ handle_toplevel_destroy(struct wl_listener *listener, void *data)
                listener, wlr_toplevel, on_foreign_toplevel.toplevel_destroy);
 
        assert(wlr_toplevel->handle);
+       /* invokes handle_handle_destroy() which does more cleanup */
        wlr_foreign_toplevel_handle_v1_destroy(wlr_toplevel->handle);
-
-       /* Compositor side state changes */
-       wl_list_remove(&wlr_toplevel->on_view.new_app_id.link);
-       wl_list_remove(&wlr_toplevel->on_view.new_title.link);
-       wl_list_remove(&wlr_toplevel->on_view.new_outputs.link);
-       wl_list_remove(&wlr_toplevel->on_view.maximized.link);
-       wl_list_remove(&wlr_toplevel->on_view.minimized.link);
-       wl_list_remove(&wlr_toplevel->on_view.fullscreened.link);
-       wl_list_remove(&wlr_toplevel->on_view.activated.link);
-
-       /* Internal signals */
-       wl_list_remove(&wlr_toplevel->on_foreign_toplevel.toplevel_parent.link);
-       wl_list_remove(&wlr_toplevel->on_foreign_toplevel.toplevel_destroy.link);
 }
 
 /* Internal API */