]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view: deduplicate foreign-toplevel creation code
authortokyo4j <hrak1529@gmail.com>
Sun, 23 Nov 2025 05:37:12 +0000 (14:37 +0900)
committerJohn Lindgren <john@jlindgren.net>
Thu, 27 Nov 2025 06:26:55 +0000 (01:26 -0500)
include/view-impl-common.h
src/view-impl-common.c
src/xdg.c
src/xwayland.c

index 5c5f90f7acb64428f401c30ed9dc679cdd9f70d0..31513b5afc05642cda18fdb9d40baf4eb99d4aaf 100644 (file)
@@ -10,8 +10,6 @@
 
 struct view;
 
-void view_impl_init_foreign_toplevel(struct view *view);
-
 void view_impl_map(struct view *view);
 void view_impl_unmap(struct view *view);
 
index cf23a798f38bbda02c0461a027ca29d2ec570760..8f4e2795e586c4d689bb90dba2a95f746b6cc4d0 100644 (file)
@@ -6,24 +6,6 @@
 #include "view.h"
 #include "window-rules.h"
 
-void
-view_impl_init_foreign_toplevel(struct view *view)
-{
-       if (view->foreign_toplevel) {
-               return;
-       }
-
-       view->foreign_toplevel = foreign_toplevel_create(view);
-
-       if (view->impl->get_parent) {
-               struct view *parent = view->impl->get_parent(view);
-               if (parent && parent->foreign_toplevel) {
-                       foreign_toplevel_set_parent(view->foreign_toplevel,
-                               parent->foreign_toplevel);
-               }
-       }
-}
-
 void
 view_impl_map(struct view *view)
 {
@@ -34,15 +16,19 @@ view_impl_map(struct view *view)
        }
 
        /*
-        * It's tempting to just never create the foreign-toplevel handle in the
-        * map handlers, but the app_id/title might not have been set at that
-        * point, so it's safer to process the property here
+        * Create foreign-toplevel handle, respecting skipTaskbar rules.
+        * Also exclude unfocusable views (popups, floating toolbars,
+        * etc.) as these should not be shown in taskbars/docks/etc.
         */
-       enum property ret = window_rules_get_property(view, "skipTaskbar");
-       if (ret == LAB_PROP_TRUE) {
-               if (view->foreign_toplevel) {
-                       foreign_toplevel_destroy(view->foreign_toplevel);
-                       view->foreign_toplevel = NULL;
+       if (!view->foreign_toplevel && view_is_focusable(view)
+                       && window_rules_get_property(view, "skipTaskbar")
+                               != LAB_PROP_TRUE) {
+               view->foreign_toplevel = foreign_toplevel_create(view);
+
+               struct view *parent = view->impl->get_parent(view);
+               if (parent && parent->foreign_toplevel) {
+                       foreign_toplevel_set_parent(view->foreign_toplevel,
+                               parent->foreign_toplevel);
                }
        }
 
index b763c03bc80c02c3f6eda6608d8ce30c66216a43..f11d522c55beb8e29a987a36a22d364b96f62144 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -760,14 +760,6 @@ handle_map(struct wl_listener *listener, void *data)
 
        view->mapped = true;
 
-       if (!view->foreign_toplevel) {
-               view_impl_init_foreign_toplevel(view);
-               /*
-                * Initial outputs will be synced via
-                * view->events.new_outputs on view_moved()
-                */
-       }
-
        if (!view->been_mapped) {
                if (view_wants_decorations(view)) {
                        view_set_ssd_mode(view, LAB_SSD_MODE_FULL);
index 528ee85d651511672c63d6f84ba4c3318ddc136e..4be48c693bda82a8c8f3b1e8d2f128eb2204d7db 100644 (file)
@@ -832,19 +832,6 @@ handle_map(struct wl_listener *listener, void *data)
                view->content_tree = tree;
        }
 
-       /*
-        * Exclude unfocusable views from wlr-foreign-toplevel. These
-        * views (notifications, floating toolbars, etc.) should not be
-        * shown in taskbars/docks/etc.
-        */
-       if (!view->foreign_toplevel && view_is_focusable(view)) {
-               view_impl_init_foreign_toplevel(view);
-               /*
-                * Initial outputs will be synced via
-                * view->events.new_outputs on view_moved()
-                */
-       }
-
        if (!view->been_mapped) {
                check_natural_geometry(view);
                set_initial_position(view, xwayland_surface);