[gtk/matthiasc/for-master: 3/3] window: Fix residual resizing issues



commit 5432f73095ac18f6dcd9efb4ba8b4763308c6e89
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Mar 31 13:06:19 2020 -0400

    window: Fix residual resizing issues
    
    After the GdkToplevel split, GtkWindow occasionally
    forgets its minimum size. Fix this by keeping a GdkToplevelLayout
    around and reusing it.

 gtk/gtkwindow.c | 38 +++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 7f1ec9e020..d57810aa43 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -257,6 +257,7 @@ typedef struct
   GList *foci;
 
   GtkConstraintSolver *constraint_solver;
+  GdkToplevelLayout *layout;
 } GtkWindowPrivate;
 
 enum {
@@ -4194,7 +4195,6 @@ static void
 gtk_window_present_toplevel (GtkWindow *window)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
-  GdkToplevelLayout *layout;
   GdkRectangle request;
   GdkGeometry geometry;
   GdkSurfaceHints flags;
@@ -4205,13 +4205,13 @@ gtk_window_present_toplevel (GtkWindow *window)
   if (!(flags & GDK_HINT_MIN_SIZE))
     geometry.min_width = geometry.min_height = 1;
 
-  layout = gtk_window_compute_layout (window, geometry.min_width, geometry.min_height);
+  if (!priv->layout)
+    priv->layout = gtk_window_compute_layout (window, geometry.min_width, geometry.min_height);
 
   gdk_toplevel_present (GDK_TOPLEVEL (priv->surface),
                         request.width,
                         request.height,
-                        layout);
-  gdk_toplevel_layout_unref (layout);
+                        priv->layout);
 }
 
 static void
@@ -4219,17 +4219,24 @@ gtk_window_update_toplevel (GtkWindow *window)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
   
-
   if (priv->surface && gdk_surface_get_mapped (priv->surface))
     {
-      GdkToplevelLayout *layout;
+      int min_width = 1;
+      int  min_height = 1;
+
+      if (priv->layout)
+        {
+          min_width = gdk_toplevel_layout_get_min_width (priv->layout);
+          min_height = gdk_toplevel_layout_get_min_height (priv->layout);
+        }
+
+      g_clear_pointer (&priv->layout, gdk_toplevel_layout_unref);
+      priv->layout = gtk_window_compute_layout (window, min_width, min_height);
 
-      layout = gtk_window_compute_layout (window, 1, 1);
       gdk_toplevel_present (GDK_TOPLEVEL (priv->surface),
                             gdk_surface_get_width (priv->surface),
                             gdk_surface_get_height (priv->surface),
-                            layout);
-      gdk_toplevel_layout_unref (layout);
+                            priv->layout);
     }
 }
 
@@ -6105,7 +6112,6 @@ gtk_window_move_resize (GtkWindow *window)
   gboolean hints_changed; /* do we need to send these again */
   GtkWindowLastGeometryInfo saved_last_info;
   int current_width, current_height;
-  GdkToplevelLayout *layout;
 
   widget = GTK_WIDGET (window);
 
@@ -6118,6 +6124,13 @@ gtk_window_move_resize (GtkWindow *window)
   gtk_window_compute_configure_request (window, &new_request,
                                         &new_geometry, &new_flags);
 
+  if (!(new_flags & GDK_HINT_MIN_SIZE))
+    new_geometry.min_width = new_geometry.min_height = 1;
+
+  g_clear_pointer (&priv->layout, gdk_toplevel_layout_unref);
+  priv->layout = gtk_window_compute_layout (window, new_geometry.min_width, new_geometry.min_height);
+
+
   /* This check implies the invariant that we never set info->last
    * without setting the hints and sending off a configure request.
    *
@@ -6267,6 +6280,7 @@ gtk_window_move_resize (GtkWindow *window)
            * to postpone our configure request until later.
            */
          info->last = saved_last_info;
+          g_clear_pointer (&priv->layout, gdk_toplevel_layout_unref);
          gtk_widget_queue_resize (widget); /* might recurse for GTK_RESIZE_IMMEDIATE */
        }
 
@@ -6320,11 +6334,9 @@ gtk_window_move_resize (GtkWindow *window)
       if (configure_request_pos_changed)
         g_warning ("configure request position changed. This should not happen. Ignoring the position");
 
-      layout = gtk_window_compute_layout (window, 1, 1);
       gdk_toplevel_present (GDK_TOPLEVEL (priv->surface),
                            new_request.width, new_request.height,
-                            layout);
-      gdk_toplevel_layout_unref (layout);
+                            priv->layout);
     }
   else
     {


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