Created
November 24, 2020 21:03
-
-
Save blogdron/a391581b600b0c3262c1bb44f69b7879 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From adb14b14a8e8bdec3b30657080a26e57dd6fc050 Mon Sep 17 00:00:00 2001 | |
From: Olivier Fourdan <ofourdan@redhat.com> | |
Date: Mon, 16 Nov 2020 16:50:24 +0100 | |
Subject: [PATCH] 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/1574> | |
--- | |
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 d919a2a0e1..d5bd6d2350 100644 | |
--- a/src/x11/window-props.c | |
+++ b/src/x11/window-props.c | |
@@ -1078,13 +1078,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)) | |
@@ -1142,16 +1148,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 | |
-- | |
2.28.0 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment