[mutter/gnome-3-36] window-props: Also check for actual values change



commit 8bfdadb714d1a6cd6bdc3f85e2c6c807e12af167
Author: Olivier Fourdan <ofourdan redhat com>
Date:   Mon Nov 16 16:50:24 2020 +0100

    window-props: Also check for actual values change
    
    Commit e28c1ab4 added a hints_have_changed() function to only
    recalculate windows features when the WM_NORMAL_HINTS change.
    
    That function hints_have_changed() however was merely checking whether
    the various XSizeHints flags where flipped, which is not sufficient
    because the hints may remain the same while the actual values are
    changed.
    
    Not checking for the actual value differences would prevent some windows
    from being able to switch fullscreen.
    
    Improve the helper function hints_have_changed() to check not only for
    flags being flipped, but also for the values being changed for each
    relevant XSizeHints flags being set currently.
    
    Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1534
    (cherry picked from commit 06e604cfefdd2eb68bc863cb5600d622a1662880)
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1575>

 src/x11/window-props.c | 98 ++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 84 insertions(+), 14 deletions(-)
---
diff --git a/src/x11/window-props.c b/src/x11/window-props.c
index f41b26b73d..5d8e8e48e7 100644
--- a/src/x11/window-props.c
+++ b/src/x11/window-props.c
@@ -1099,13 +1099,19 @@ reload_update_counter (MetaWindow    *window,
     }
 }
 
+#define FLAG_IS_ON(hints,flag) \
+  (((hints)->flags & (flag)) != 0)
+
+#define FLAG_IS_OFF(hints,flag) \
+  (((hints)->flags & (flag)) == 0)
+
 #define FLAG_TOGGLED_ON(old,new,flag) \
- (((old)->flags & (flag)) == 0 &&     \
-  ((new)->flags & (flag)) != 0)
+  (FLAG_IS_OFF(old,flag) &&           \
+   FLAG_IS_ON(new,flag))
 
 #define FLAG_TOGGLED_OFF(old,new,flag) \
- (((old)->flags & (flag)) != 0 &&      \
-  ((new)->flags & (flag)) == 0)
+  (FLAG_IS_ON(old,flag) &&             \
+   FLAG_IS_OFF(new,flag))
 
 #define FLAG_CHANGED(old,new,flag) \
   (FLAG_TOGGLED_ON(old,new,flag) || FLAG_TOGGLED_OFF(old,new,flag))
@@ -1163,16 +1169,80 @@ static gboolean
 hints_have_changed (const XSizeHints *old,
                     const XSizeHints *new)
 {
-  return FLAG_CHANGED (old, new, USPosition) ||
-         FLAG_CHANGED (old, new, USSize) ||
-         FLAG_CHANGED (old, new, PPosition) ||
-         FLAG_CHANGED (old, new, PSize) ||
-         FLAG_CHANGED (old, new, PMinSize) ||
-         FLAG_CHANGED (old, new, PMaxSize) ||
-         FLAG_CHANGED (old, new, PResizeInc) ||
-         FLAG_CHANGED (old, new, PAspect) ||
-         FLAG_CHANGED (old, new, PBaseSize) ||
-         FLAG_CHANGED (old, new, PWinGravity);
+  /* 1. Check if the relevant values have changed if the flag is set. */
+
+  if (FLAG_TOGGLED_ON (old, new, USPosition) ||
+      (FLAG_IS_ON (new, USPosition) &&
+       (old->x != new->x ||
+        old->y != new->y)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, USSize) ||
+      (FLAG_IS_ON (new, USSize) &&
+       (old->width != new->width ||
+        old->height != new->height)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PPosition) ||
+      (FLAG_IS_ON (new, PPosition) &&
+       (old->x != new->x ||
+        old->y != new->y)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PSize) ||
+      (FLAG_IS_ON (new, PSize) &&
+       (old->width != new->width ||
+        old->height != new->height)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PMinSize) ||
+      (FLAG_IS_ON (new, PMinSize) &&
+       (old->min_width != new->min_width ||
+        old->min_height != new->min_height)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PMaxSize) ||
+      (FLAG_IS_ON (new, PMaxSize) &&
+       (old->max_width != new->max_width ||
+        old->max_height != new->max_height)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PResizeInc) ||
+      (FLAG_IS_ON (new, PResizeInc) &&
+       (old->width_inc != new->width_inc ||
+        old->height_inc != new->height_inc)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PAspect) ||
+      (FLAG_IS_ON (new, PAspect) &&
+       (old->min_aspect.x != new->min_aspect.x ||
+        old->min_aspect.y != new->min_aspect.y ||
+        old->max_aspect.x != new->max_aspect.x ||
+        old->max_aspect.y != new->max_aspect.y)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PBaseSize) ||
+      (FLAG_IS_ON (new, PBaseSize) &&
+       (old->base_width != new->base_width ||
+        old->base_height != new->base_height)))
+    return TRUE;
+
+  if (FLAG_TOGGLED_ON (old, new, PWinGravity) ||
+      (FLAG_IS_ON (new, PWinGravity) &&
+       (old->win_gravity != new->win_gravity)))
+    return TRUE;
+
+  /* 2. Check if the flags have been unset. */
+  return FLAG_TOGGLED_OFF (old, new, USPosition) ||
+         FLAG_TOGGLED_OFF (old, new, USSize) ||
+         FLAG_TOGGLED_OFF (old, new, PPosition) ||
+         FLAG_TOGGLED_OFF (old, new, PSize) ||
+         FLAG_TOGGLED_OFF (old, new, PMinSize) ||
+         FLAG_TOGGLED_OFF (old, new, PMaxSize) ||
+         FLAG_TOGGLED_OFF (old, new, PResizeInc) ||
+         FLAG_TOGGLED_OFF (old, new, PAspect) ||
+         FLAG_TOGGLED_OFF (old, new, PBaseSize) ||
+         FLAG_TOGGLED_OFF (old, new, PWinGravity);
 }
 
 void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]