Commit 0984d162 authored by Tristan Van Berkom's avatar Tristan Van Berkom Committed by Matthias Clasen

GtkScrolledWindow: Bug 766569 - Make propagation of natural child sizes optional

Making propagation of child natural sizes mandatory (or default, even) was
evidently a mistake as this causes dynamic content in a scrolled window
to resize it's parent when the scrolled window is competing for space
with an adjacent widget.

This patch instead adds API to control whether natural width and
height of the child should be propagated through the scrolled windows
size requests.
parent 738b1e3e
......@@ -3239,6 +3239,10 @@ gtk_scrolled_window_set_capture_button_press
gtk_scrolled_window_get_capture_button_press
gtk_scrolled_window_set_overlay_scrolling
gtk_scrolled_window_get_overlay_scrolling
gtk_scrolled_window_set_propagate_natural_width
gtk_scrolled_window_get_propagate_natural_width
gtk_scrolled_window_set_propagate_natural_height
gtk_scrolled_window_get_propagate_natural_height
<SUBSECTION Standard>
GTK_SCROLLED_WINDOW
......
......@@ -241,6 +241,8 @@ struct _GtkScrolledWindowPrivate
guint overlay_scrolling : 1;
guint use_indicators : 1;
guint auto_added_viewport : 1;
guint propagate_natural_width : 1;
guint propagate_natural_height : 1;
gint min_content_width;
gint min_content_height;
......@@ -303,6 +305,8 @@ enum {
PROP_OVERLAY_SCROLLING,
PROP_MAX_CONTENT_WIDTH,
PROP_MAX_CONTENT_HEIGHT,
PROP_PROPAGATE_NATURAL_WIDTH,
PROP_PROPAGATE_NATURAL_HEIGHT,
NUM_PROPERTIES
};
......@@ -739,6 +743,42 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
-1, G_MAXINT, -1,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkScrolledWindow:propagate-natural-width:
*
* Whether the natural width of the child should be calculated and propagated
* through the scrolled windows requested natural width.
*
* This is useful in cases where an attempt should be made to allocate exactly
* enough space for the natural size of the child.
*
* Since: 3.22
*/
properties[PROP_PROPAGATE_NATURAL_WIDTH] =
g_param_spec_boolean ("propagate-natural-width",
P_("Propagate Natural Width"),
P_("Propagate Natural Width"),
FALSE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkScrolledWindow:propagate-natural-height:
*
* Whether the natural height of the child should be calculated and propagated
* through the scrolled windows requested natural height.
*
* This is useful in cases where an attempt should be made to allocate exactly
* enough space for the natural size of the child.
*
* Since: 3.22
*/
properties[PROP_PROPAGATE_NATURAL_HEIGHT] =
g_param_spec_boolean ("propagate-natural-height",
P_("Propagate Natural Height"),
P_("Propagate Natural Height"),
FALSE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
/**
......@@ -1798,6 +1838,7 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
&min_child_size,
&nat_child_size);
if (priv->propagate_natural_width)
natural_req.width += nat_child_size;
if (priv->hscrollbar_policy == GTK_POLICY_NEVER)
......@@ -1819,6 +1860,7 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
&min_child_size,
&nat_child_size);
if (priv->propagate_natural_height)
natural_req.height += nat_child_size;
if (priv->vscrollbar_policy == GTK_POLICY_NEVER)
......@@ -1836,6 +1878,10 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
}
}
/* Ensure we make requests with natural size >= minimum size */
natural_req.height = MAX (minimum_req.height, natural_req.height);
natural_req.width = MAX (minimum_req.width, natural_req.width);
/*
* Now add to the requisition any additional space for surrounding scrollbars
* and the special scrollable border.
......@@ -2847,6 +2893,14 @@ gtk_scrolled_window_set_property (GObject *object,
gtk_scrolled_window_set_max_content_height (scrolled_window,
g_value_get_int (value));
break;
case PROP_PROPAGATE_NATURAL_WIDTH:
gtk_scrolled_window_set_propagate_natural_width (scrolled_window,
g_value_get_boolean (value));
break;
case PROP_PROPAGATE_NATURAL_HEIGHT:
gtk_scrolled_window_set_propagate_natural_height (scrolled_window,
g_value_get_boolean (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
......@@ -2905,6 +2959,12 @@ gtk_scrolled_window_get_property (GObject *object,
case PROP_MAX_CONTENT_HEIGHT:
g_value_set_int (value, priv->max_content_height);
break;
case PROP_PROPAGATE_NATURAL_WIDTH:
g_value_set_boolean (value, priv->propagate_natural_width);
break;
case PROP_PROPAGATE_NATURAL_HEIGHT:
g_value_set_boolean (value, priv->propagate_natural_height);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
......@@ -4731,3 +4791,101 @@ gtk_scrolled_window_get_max_content_height (GtkScrolledWindow *scrolled_window)
return scrolled_window->priv->max_content_height;
}
/**
* gtk_scrolled_window_set_propagate_natural_width:
* @scrolled_window: a #GtkScrolledWindow
* @propagate: whether to propagate natural width
*
* Sets whether the natural width of the child should be calculated and propagated
* through the scrolled windows requested natural width.
*
* Since: 3.22
*/
void
gtk_scrolled_window_set_propagate_natural_width (GtkScrolledWindow *scrolled_window,
gboolean propagate)
{
GtkScrolledWindowPrivate *priv;
g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
priv = scrolled_window->priv;
propagate = !!propagate;
if (priv->propagate_natural_width != propagate)
{
priv->propagate_natural_width = propagate;
g_object_notify_by_pspec (G_OBJECT (scrolled_window), properties [PROP_PROPAGATE_NATURAL_WIDTH]);
gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
}
}
/**
* gtk_scrolled_window_get_propagate_natural_width:
* @scrolled_window: a #GtkScrolledWindow
*
* Reports whether the natural width of the child will be calculated and propagated
* through the scrolled windows requested natural width.
*
* Returns: whether natural width propagation is enabled.
*
* Since: 3.22
*/
gint
gtk_scrolled_window_get_propagate_natural_width (GtkScrolledWindow *scrolled_window)
{
g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window), -1);
return scrolled_window->priv->propagate_natural_width;
}
/**
* gtk_scrolled_window_set_propagate_natural_height:
* @scrolled_window: a #GtkScrolledWindow
* @propagate: whether to propagate natural height
*
* Sets whether the natural height of the child should be calculated and propagated
* through the scrolled windows requested natural height.
*
* Since: 3.22
*/
void
gtk_scrolled_window_set_propagate_natural_height (GtkScrolledWindow *scrolled_window,
gboolean propagate)
{
GtkScrolledWindowPrivate *priv;
g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
priv = scrolled_window->priv;
propagate = !!propagate;
if (priv->propagate_natural_height != propagate)
{
priv->propagate_natural_height = propagate;
g_object_notify_by_pspec (G_OBJECT (scrolled_window), properties [PROP_PROPAGATE_NATURAL_HEIGHT]);
gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
}
}
/**
* gtk_scrolled_window_get_propagate_natural_height:
* @scrolled_window: a #GtkScrolledWindow
*
* Reports whether the natural height of the child will be calculated and propagated
* through the scrolled windows requested natural height.
*
* Returns: whether natural height propagation is enabled.
*
* Since: 3.22
*/
gint
gtk_scrolled_window_get_propagate_natural_height (GtkScrolledWindow *scrolled_window)
{
g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window), -1);
return scrolled_window->priv->propagate_natural_height;
}
......@@ -226,6 +226,18 @@ void gtk_scrolled_window_set_max_content_height (GtkScrolledWindow *sc
GDK_AVAILABLE_IN_3_22
gint gtk_scrolled_window_get_max_content_height (GtkScrolledWindow *scrolled_window);
GDK_AVAILABLE_IN_3_22
void gtk_scrolled_window_set_propagate_natural_width (GtkScrolledWindow *scrolled_window,
gboolean propagate);
GDK_AVAILABLE_IN_3_22
gboolean gtk_scrolled_window_get_propagate_natural_width (GtkScrolledWindow *scrolled_window);
GDK_AVAILABLE_IN_3_22
void gtk_scrolled_window_set_propagate_natural_height (GtkScrolledWindow *scrolled_window,
gboolean propagate);
GDK_AVAILABLE_IN_3_22
gboolean gtk_scrolled_window_get_propagate_natural_height (GtkScrolledWindow *scrolled_window);
G_END_DECLS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment