summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2020-12-16 10:10:00 +0100
committerJonas Ådahl <jadahl@gmail.com>2020-12-16 11:56:41 +0100
commitb6412adc3288377c795abdb96622a5fac2ec382f (patch)
treede9c5bce5d7de670fd71366470e3d9617a6989cd
parent2192bb3dde2ad3c666b3087470e0af5dcfdaf371 (diff)
downloadgtk+-b6412adc3288377c795abdb96622a5fac2ec382f.tar.gz
gtk/window: Check widget mappdness and not surface mappedness
When deciding whether to call gdk_toplevel_present(), check the mappedness of GtkWidget instead of the mapped-ness of GdkSurface, as the latter is mapped asynchronously, while the former is direct state of the GtkWindow itself. This fixes an issue where calling e.g. gtk_window_maximize() shortly after showing it didn't take effect, as hadn't been mapped yet. While maximizing after showing is racy, and will likely glitch from time to time, the correct thing to do is still to maximize and handle whatever state the compositor configured the window to be in. Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3466
-rw-r--r--gtk/gtkwindow.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index d3402c3a84..71b8a579d2 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -1133,7 +1133,7 @@ gtk_window_is_maximized (GtkWindow *window)
g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
- if (priv->surface && gdk_surface_get_mapped (priv->surface))
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
return priv->maximized;
else
return priv->maximize_initially;
@@ -1163,7 +1163,7 @@ gtk_window_is_fullscreen (GtkWindow *window)
g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
- if (priv->surface && gdk_surface_get_mapped (priv->surface))
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
return priv->fullscreen;
else
return priv->fullscreen_initially;
@@ -3760,13 +3760,12 @@ gtk_window_update_toplevel (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
- if (priv->surface && gdk_surface_get_mapped (priv->surface))
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
{
g_clear_pointer (&priv->layout, gdk_toplevel_layout_unref);
priv->layout = gtk_window_compute_layout (window);
- if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
- gdk_toplevel_present (GDK_TOPLEVEL (priv->surface), priv->layout);
+ gdk_toplevel_present (GDK_TOPLEVEL (priv->surface), priv->layout);
}
}
@@ -5211,7 +5210,7 @@ gtk_window_maximize (GtkWindow *window)
was_maximized_initially = priv->maximize_initially;
priv->maximize_initially = TRUE;
- if (priv->surface && gdk_surface_get_mapped (priv->surface))
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
{
gtk_window_update_toplevel (window);
}
@@ -5248,7 +5247,7 @@ gtk_window_unmaximize (GtkWindow *window)
gtk_window_update_toplevel (window);
- if (priv->surface && gdk_surface_get_mapped (priv->surface))
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
gtk_window_update_toplevel (window);
else if (was_maximized_initially)
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_MAXIMIZED]);
@@ -5279,7 +5278,7 @@ gtk_window_fullscreen (GtkWindow *window)
was_fullscreen_initially = priv->fullscreen_initially;
priv->fullscreen_initially = TRUE;
- if (priv->surface && gdk_surface_get_mapped (priv->surface))
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
gtk_window_update_toplevel (window);
else if (!was_fullscreen_initially)
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FULLSCREENED]);
@@ -5366,7 +5365,7 @@ gtk_window_unfullscreen (GtkWindow *window)
gtk_window_update_toplevel (window);
- if (priv->surface && gdk_surface_get_mapped (priv->surface))
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
gtk_window_update_toplevel (window);
else if (was_fullscreen_initially)
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FULLSCREENED]);