GtkWindow: don't increase the preferred size for empty windows if there is a size...
authorChristoph Reiter <creiter@src.gnome.org>
Mon, 29 Jun 2015 11:46:36 +0000 (13:46 +0200)
committerCosimo Cecchi <cosimoc@gnome.org>
Wed, 1 Jul 2015 16:32:19 +0000 (09:32 -0700)
This fixes a reftest broken by commit 84e99b20ac806ee5f

https://bugzilla.gnome.org/show_bug.cgi?id=751341

gtk/gtkwidget.c
gtk/gtkwidgetprivate.h
gtk/gtkwindow.c

index c1fd68a3f3baa051c242ec0dc8f8aca23e981d26..7a3ee28ba23e6439515f2315ab4a6c05c5fd4120 100644 (file)
@@ -11152,6 +11152,23 @@ gtk_widget_get_size_request (GtkWidget *widget,
     *height = aux_info->height;
 }
 
+/*< private >
+ * gtk_widget_has_size_request:
+ * @widget: a #GtkWidget
+ *
+ * Returns if the widget has a size request set (anything besides -1 for height
+ * or width)
+ */
+gboolean
+gtk_widget_has_size_request (GtkWidget *widget)
+{
+  const GtkWidgetAuxInfo *aux_info;
+
+  aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
+
+  return !(aux_info->width == -1 && aux_info->height == -1);
+}
+
 /**
  * _gtk_widget_override_size_request:
  * @widget: a #GtkWidget
index 95b7bb17aa444aa46dbd2f30d99e9576374e5c28..387195efe00a3aa534bf4dfcca95ea61547f5ae6 100644 (file)
@@ -171,6 +171,8 @@ gboolean          gtk_widget_has_tick_callback             (GtkWidget *widget);
 void              gtk_widget_set_csd_input_shape           (GtkWidget            *widget,
                                                             const cairo_region_t *region);
 
+gboolean          gtk_widget_has_size_request              (GtkWidget *widget);
+
 G_END_DECLS
 
 #endif /* __GTK_WIDGET_PRIVATE_H__ */
index add6b79dfdee9433400be47e78b6c59d742bd600..9c42d23afec97a36c88ec66d1dcb497c425d9f7d 100644 (file)
@@ -8371,10 +8371,12 @@ gtk_window_get_preferred_width (GtkWidget *widget,
   gint title_min = 0, title_nat = 0;
   gint child_min = 0, child_nat = 0;
   GtkBorder window_border = { 0 };
+  gboolean has_size_request;
 
   window = GTK_WINDOW (widget);
   priv = window->priv;
   child  = gtk_bin_get_child (GTK_BIN (window));
+  has_size_request = gtk_widget_has_size_request (widget);
 
   border_width = gtk_container_get_border_width (GTK_CONTAINER (window));
 
@@ -8397,14 +8399,14 @@ gtk_window_get_preferred_width (GtkWidget *widget,
     {
       gtk_widget_get_preferred_width (child, &child_min, &child_nat);
 
-      if (child_nat == 0)
+      if (child_nat == 0 && !has_size_request)
         child_nat = NO_CONTENT_CHILD_NAT;
       child_min += border_width * 2 +
                    window_border.left + window_border.right;
       child_nat += border_width * 2 +
                    window_border.left + window_border.right;
     }
-  else
+  else if (!has_size_request)
     {
       child_nat = NO_CONTENT_CHILD_NAT;
     }
@@ -8428,10 +8430,12 @@ gtk_window_get_preferred_width_for_height (GtkWidget *widget,
   gint child_min = 0, child_nat = 0;
   gint title_height = 0;
   GtkBorder window_border = { 0 };
+  gboolean has_size_request;
 
   window = GTK_WINDOW (widget);
   priv = window->priv;
   child  = gtk_bin_get_child (GTK_BIN (window));
+  has_size_request = gtk_widget_has_size_request (widget);
 
   border_width = gtk_container_get_border_width (GTK_CONTAINER (window));
 
@@ -8466,14 +8470,14 @@ gtk_window_get_preferred_width_for_height (GtkWidget *widget,
                                                  MAX (height, 0),
                                                  &child_min, &child_nat);
 
-      if (child_nat == 0 && height == 0)
+      if (child_nat == 0 && height == 0 && !has_size_request)
         child_nat = NO_CONTENT_CHILD_NAT;
       child_min += border_width * 2 +
                    window_border.left + window_border.right;
       child_nat += border_width * 2 +
                    window_border.left + window_border.right;
     }
-  else
+  else if (!has_size_request)
     {
       child_nat = NO_CONTENT_CHILD_NAT;
     }
@@ -8494,10 +8498,12 @@ gtk_window_get_preferred_height (GtkWidget *widget,
   int title_min = 0;
   int title_height = 0;
   GtkBorder window_border = { 0 };
+  gboolean has_size_request;
 
   window = GTK_WINDOW (widget);
   priv = window->priv;
   child  = gtk_bin_get_child (GTK_BIN (window));
+  has_size_request = gtk_widget_has_size_request (widget);
 
   *minimum_size = 0;
   *natural_size = 0;
@@ -8528,12 +8534,12 @@ gtk_window_get_preferred_height (GtkWidget *widget,
       gint child_min, child_nat;
       gtk_widget_get_preferred_height (child, &child_min, &child_nat);
 
-      if (child_nat == 0)
+      if (child_nat == 0 && !has_size_request)
         child_nat = NO_CONTENT_CHILD_NAT;
       *minimum_size += child_min + 2 * border_width;
       *natural_size += child_nat + 2 * border_width;
     }
-  else
+  else if (!has_size_request)
     {
       *natural_size += NO_CONTENT_CHILD_NAT;
     }
@@ -8553,10 +8559,12 @@ gtk_window_get_preferred_height_for_width (GtkWidget *widget,
   int title_min = 0;
   int title_height = 0;
   GtkBorder window_border = { 0 };
+  gboolean has_size_request;
 
   window = GTK_WINDOW (widget);
   priv = window->priv;
   child  = gtk_bin_get_child (GTK_BIN (window));
+  has_size_request = gtk_widget_has_size_request (widget);
 
   *minimum_size = 0;
   *natural_size = 0;
@@ -8593,12 +8601,12 @@ gtk_window_get_preferred_height_for_width (GtkWidget *widget,
       gtk_widget_get_preferred_height_for_width (child, MAX (width, 0),
                                                  &child_min, &child_nat);
 
-      if (child_nat == 0 && width == 0)
+      if (child_nat == 0 && width == 0 && !has_size_request)
         child_nat = NO_CONTENT_CHILD_NAT;
       *minimum_size += child_min + 2 * border_width;
       *natural_size += child_nat + 2 * border_width;
     }
-  else
+  else if (!has_size_request)
     {
       *natural_size += NO_CONTENT_CHILD_NAT;
     }