[Xfce4-commits] [xfce/xfwm4] 01/01: stacking: Limit to direct transients when raising

noreply at xfce.org noreply at xfce.org
Tue Jul 9 21:46:23 CEST 2019


This is an automated email from the git hooks/post-receive script.

o   l   i   v   i   e   r       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/xfwm4.

commit d9af18135348afa59f1a54362367a48eef81876f
Author: Olivier Fourdan <fourdan at xfce.org>
Date:   Tue Jul 9 21:39:38 2019 +0200

    stacking: Limit to direct transients when raising
    
    Bug: 15580
    
    Following commit fa9517eae (“Raise all transients together”), xfwm4
    would search for the deepest parent of a given transient and raise it to
    bring all related windows together.
    
    however, taking into account parents from the same group, it would raise
    the lowest window while the others from the same group aren't raised
    along with it, causing apparently random windows to be raised.
    
    Make sure we pick only direct transients when walking down the windows
    stack.
    
    Signed-off-by: Olivier Fourdan <fourdan at xfce.org>
---
 src/transients.c | 84 +++++++++++++++++++++++++++++++-------------------------
 src/transients.h |  5 ++--
 2 files changed, 49 insertions(+), 40 deletions(-)

diff --git a/src/transients.c b/src/transients.c
index 82946a1..8dab4c0 100644
--- a/src/transients.c
+++ b/src/transients.c
@@ -47,14 +47,33 @@ clientGetTransient (Client * c)
 }
 
 gboolean
+clientIsDirectTransient (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return ((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window));
+}
+
+gboolean
+clientIsTransientForGroup (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None) && (c->group_leader != c->window));
+}
+
+gboolean
 clientIsTransient (Client * c)
 {
     g_return_val_if_fail (c != NULL, FALSE);
 
     TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
 
-    return (((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window)) ||
-            ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None) && (c->group_leader != c->window)));
+    return (clientIsDirectTransient(c) || clientIsTransientForGroup (c));
 }
 
 gboolean
@@ -68,8 +87,28 @@ clientIsModal (Client * c)
        if WM_TRANSIENT_FOR is not set or set to the root window the dialog is modal for its window group.
      */
     return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) &&
-            (((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window)) ||
-             ((c->group_leader != None) && (c->group_leader != c->window))));
+            clientIsTransient (c));
+}
+
+gboolean
+clientIsModalForGroup (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) &&
+            !clientIsTransient(c) && (c->group_leader != None));
+}
+
+gboolean
+clientIsTransientOrModalForGroup (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return (clientIsTransientForGroup(c) || clientIsModalForGroup(c));
 }
 
 gboolean
@@ -192,37 +231,6 @@ clientIsTransientOrModalFor (Client * c1, Client * c2)
 }
 
 gboolean
-clientIsTransientForGroup (Client * c)
-{
-    g_return_val_if_fail (c != NULL, FALSE);
-
-    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
-
-    return ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None));
-}
-
-gboolean
-clientIsModalForGroup (Client * c)
-{
-    g_return_val_if_fail (c != NULL, FALSE);
-
-    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
-
-    return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) &&
-            !clientIsTransient(c) && (c->group_leader != None));
-}
-
-gboolean
-clientIsTransientOrModalForGroup (Client * c)
-{
-    g_return_val_if_fail (c != NULL, FALSE);
-
-    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
-
-    return (clientIsTransientForGroup(c) || clientIsModalForGroup(c));
-}
-
-gboolean
 clientIsValidTransientOrModal (Client * c)
 {
     g_return_val_if_fail (c != NULL, FALSE);
@@ -315,7 +323,7 @@ clientGetModalFor (Client * c)
     return NULL;
 }
 
-/* Find the deepest parent of that window */
+/* Find the deepest direct parent of that window */
 Client *
 clientGetTransientFor (Client * c)
 {
@@ -339,7 +347,7 @@ clientGetTransientFor (Client * c)
             continue;
         }
 
-        if (clientIsTransientFor (c, c2))
+        if (clientIsDirectTransient (c) && clientIsTransientFor (c, c2))
         {
             parents = g_list_append (parents, c2);
             first_parent = c2;
@@ -349,7 +357,7 @@ clientGetTransientFor (Client * c)
             for (l2 = parents; l2; l2 = g_list_next (l2))
             {
                 Client *c3 = (Client *) l2->data;
-                if ((c3 != c2) && clientIsTransientFor (c3, c2))
+                if ((c3 != c2) && clientIsDirectTransient (c3) && clientIsTransientFor (c3, c2))
                 {
                     parents = g_list_append (parents, c2);
                     first_parent = c2;
diff --git a/src/transients.h b/src/transients.h
index 029e25d..57029e3 100644
--- a/src/transients.h
+++ b/src/transients.h
@@ -31,8 +31,11 @@
 #include "client.h"
 
 Client                  *clientGetTransient                     (Client *);
+gboolean                 clientIsDirectTransient                (Client *);
+gboolean                 clientIsTransientForGroup              (Client *);
 gboolean                 clientIsTransient                      (Client *);
 gboolean                 clientIsModal                          (Client *);
+gboolean                 clientIsModalForGroup                  (Client *);
 gboolean                 clientIsTransientOrModal               (Client *);
 gboolean                 clientIsValidTransientOrModal          (Client *);
 gboolean                 clientSameGroup                        (Client *,
@@ -49,8 +52,6 @@ gboolean                 clientIsModalFor                       (Client *,
                                                                  Client *);
 gboolean                 clientIsTransientOrModalFor            (Client *,
                                                                  Client *);
-gboolean                 clientIsTransientForGroup              (Client *);
-gboolean                 clientIsModalForGroup                  (Client *);
 gboolean                 clientIsTransientOrModalForGroup       (Client *);
 gboolean                 clientTransientOrModalHasAncestor      (Client *,
                                                                  guint);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list