]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view: move (z-order) ancestors with modal dialogs
authorJohan Malm <jgm323@gmail.com>
Wed, 19 Jul 2023 16:19:37 +0000 (17:19 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 5 Aug 2023 14:25:00 +0000 (15:25 +0100)
...so that other window cannot be positioned between modal dialogs and
their parent windows. This is consistent with Gtk3 and Qt5 applications on
mutter and openbox.

src/xdg.c
src/xwayland.c

index 8bfad78ba8f51bcf514b575a331d6e2531fe020a..c54796c56c8a004360666ae1d8974372ec248613 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -369,20 +369,35 @@ move_sub_views(struct view *parent, enum z_direction z_direction)
        }
 }
 
+/* Return the most senior parent (=root) view */
+static struct view *
+root_view_of_view(struct view *view)
+{
+       struct wlr_xdg_toplevel *root = top_parent_of(view);
+       struct wlr_xdg_surface *surface = (struct wlr_xdg_surface *)root->base;
+       return (struct view *)surface->data;
+}
+
+/*
+ * In the view_move_to_{front,back} functions, a modal dialog is always shown
+ * above its parent window, and the two always move together, so other window
+ * cannot come between them.
+ * This is consistent with GTK3/Qt5 applications on mutter and openbox.
+ */
 static void
 xdg_toplevel_view_move_to_front(struct view *view)
 {
-       view_impl_move_to_front(view);
-
-       /* Show modal dialog above parent window */
-       move_sub_views(view, LAB_TO_FRONT);
+       struct view *root = root_view_of_view(view);
+       view_impl_move_to_front(root);
+       move_sub_views(root, LAB_TO_FRONT);
 }
 
 static void
 xdg_toplevel_view_move_to_back(struct view *view)
 {
-       view_impl_move_to_back(view);
-       move_sub_views(view, LAB_TO_BACK);
+       struct view *root = root_view_of_view(view);
+       view_impl_move_to_back(root);
+       move_sub_views(root, LAB_TO_BACK);
 }
 
 static void
index 7bfd33a23d40376a75c5aca4fe1a86f404454ea6..a8d4b8ef52c071103b26fb8dbcac4d02c54c0e7e 100644 (file)
@@ -552,18 +552,27 @@ move_sub_views(struct view *parent, enum z_direction z_direction)
        }
 }
 
+static struct view *
+root_view_of_view(struct view *view)
+{
+       struct wlr_xwayland_surface *root = top_parent_of(view);
+       return (struct view *)root->data;
+}
+
 static void
 xwayland_view_move_to_front(struct view *view)
 {
-       view_impl_move_to_front(view);
-       move_sub_views(view, LAB_TO_FRONT);
+       struct view *root = root_view_of_view(view);
+       view_impl_move_to_front(root);
+       move_sub_views(root, LAB_TO_FRONT);
 }
 
 static void
 xwayland_view_move_to_back(struct view *view)
 {
-       view_impl_move_to_back(view);
-       move_sub_views(view, LAB_TO_BACK);
+       struct view *root = root_view_of_view(view);
+       view_impl_move_to_back(root);
+       move_sub_views(root, LAB_TO_BACK);
 }
 
 static void