diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index c1fd68a3f3..7a3ee28ba2 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -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 diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index 95b7bb17aa..387195efe0 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -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__ */ diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index add6b79dfd..9c42d23afe 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -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; }