]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view: less hacky support for minimize-before-map
authorJohn Lindgren <john@jlindgren.net>
Sat, 8 Nov 2025 03:38:32 +0000 (22:38 -0500)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 9 Nov 2025 18:27:39 +0000 (18:27 +0000)
The previous "minimal fix" (5148c2aa3140) worked but was a bit of a
hack, as it basically un-minimized and then immediately minimized the
view again at map. It's not actually too difficult to make the map
handlers aware of minimized views, eliminating the need for the hack.

Note: this depends on the previous commit ("xwayland: connect commit
and surface_destroy handlers together") otherwise the xwayland map
handler registers the commit handler twice, leading to a crash.

src/foreign-toplevel/foreign.c
src/view-impl-common.c
src/view.c
src/xdg.c
src/xwayland.c

index 14563431e4451833ee0ee7223cfa9caec5795879..4290ffd0acb5ec53364da5bab38ae3ae893df900 100644 (file)
@@ -18,7 +18,6 @@ struct foreign_toplevel *
 foreign_toplevel_create(struct view *view)
 {
        assert(view);
-       assert(view->mapped);
 
        struct foreign_toplevel *toplevel = znew(*toplevel);
        wlr_foreign_toplevel_init(&toplevel->wlr_toplevel, view);
index 2159058828cb1268cfdbf1ee9fa81baf1ad45db1..8cb4d80fdfa3916149584c8e4fa17cf67a5abbea 100644 (file)
 void
 view_impl_map(struct view *view)
 {
-       desktop_focus_view(view, /*raise*/ true);
+       /* Leave minimized, if minimized before map */
+       if (!view->minimized) {
+               desktop_focus_view(view, /*raise*/ true);
+       }
        if (!view->been_mapped) {
                window_rules_apply(view, LAB_WINDOW_RULE_EVENT_ON_FIRST_MAP);
        }
index 45e9fc4516ed3fea536892c927da75df12a836a5..efad9d83c9865061c9c0058ee99d8076e23350f9 100644 (file)
@@ -2458,18 +2458,7 @@ static void
 handle_map(struct wl_listener *listener, void *data)
 {
        struct view *view = wl_container_of(listener, view, mappable.map);
-       if (view->minimized) {
-               /*
-                * The view->impl functions do not directly support
-                * mapping a view while minimized. Instead, mark it as
-                * not minimized, map it, and then minimize it again.
-                */
-               view->minimized = false;
-               view->impl->map(view);
-               view_minimize(view, true);
-       } else {
-               view->impl->map(view);
-       }
+       view->impl->map(view);
 }
 
 static void
index 83ab9bb9220e2d804d424b9055bbd46f7a733cc2..363d7019fa2bf17423140a86d40f438bf194e528 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -781,8 +781,6 @@ xdg_toplevel_view_map(struct view *view)
                return;
        }
 
-       view->mapped = true;
-
        /*
         * An output should have been chosen when the surface was first
         * created, but take one more opportunity to assign an output if not.
@@ -790,8 +788,16 @@ xdg_toplevel_view_map(struct view *view)
        if (!view->output) {
                view_set_output(view, output_nearest_to_cursor(view->server));
        }
-       struct wlr_xdg_surface *xdg_surface = xdg_surface_from_view(view);
-       wlr_scene_node_set_enabled(&view->scene_tree->node, true);
+
+       /*
+        * For initially minimized views, we do not set view->mapped
+        * nor enable the scene node. All other map logic (positioning,
+        * creating foreign toplevel, etc.) happens as normal.
+        */
+       if (!view->minimized) {
+               view->mapped = true;
+               wlr_scene_node_set_enabled(&view->scene_tree->node, true);
+       }
 
        if (!view->foreign_toplevel) {
                init_foreign_toplevel(view);
@@ -813,6 +819,8 @@ xdg_toplevel_view_map(struct view *view)
                 * dimensions remain zero until handle_commit().
                 */
                if (wlr_box_empty(&view->pending)) {
+                       struct wlr_xdg_surface *xdg_surface =
+                               xdg_surface_from_view(view);
                        view->pending.width = xdg_surface->geometry.width;
                        view->pending.height = xdg_surface->geometry.height;
                }
index 1a1cc9b0666df76c01b5e29b4d7fbe1fff7c4a7e..ac30941f0ded50de587f2fab48b853c752bf3eac 100644 (file)
@@ -832,8 +832,15 @@ xwayland_view_map(struct view *view)
         */
        handle_map_request(&xwayland_view->map_request, NULL);
 
-       view->mapped = true;
-       wlr_scene_node_set_enabled(&view->scene_tree->node, true);
+       /*
+        * For initially minimized views, we do not set view->mapped
+        * nor enable the scene node. All other map logic (positioning,
+        * creating foreign toplevel, etc.) happens as normal.
+        */
+       if (!view->minimized) {
+               view->mapped = true;
+               wlr_scene_node_set_enabled(&view->scene_tree->node, true);
+       }
 
        if (view->surface != xwayland_surface->surface) {
                set_surface(view, xwayland_surface->surface);