summaryrefslogtreecommitdiff
path: root/gtk/gtkscrolledwindow.c
diff options
context:
space:
mode:
authorDaniel Boles <dboles@src.gnome.org>2017-03-10 20:09:20 +0000
committerDaniel Boles <dboles@src.gnome.org>2017-05-10 22:29:01 +0100
commit1a95c259d7b37f11668f60b276100e27e2ed3c18 (patch)
treef7a269f45336b7b0cdc60c62a3af0cb606b725ef /gtk/gtkscrolledwindow.c
parent546433a4b7f936dc30d71104f7e6ddae2e0d9b9d (diff)
downloadgtk+-1a95c259d7b37f11668f60b276100e27e2ed3c18.tar.gz
ScrolledWindow: Optimise and clean up measure()
• Only calculate the specified dimension – rather than measuring both & discarding the other (which will often be recalculated right after) • Only measure a given child scrollbar if it may be visible, not always • Move variables into narrowest scopes & otherwise improve readability https://bugzilla.gnome.org/show_bug.cgi?id=778853
Diffstat (limited to 'gtk/gtkscrolledwindow.c')
-rw-r--r--gtk/gtkscrolledwindow.c87
1 files changed, 38 insertions, 49 deletions
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index d5a240ff1f..1b09478d49 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1690,23 +1690,10 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
GtkScrolledWindowPrivate *priv = scrolled_window->priv;
GtkBin *bin = GTK_BIN (scrolled_window);
- GtkRequisition hscrollbar_requisition;
- GtkRequisition vscrollbar_requisition;
- GtkRequisition minimum_req, natural_req;
+ int minimum_req = 0, natural_req = 0;
GtkWidget *child;
- gint min_child_size, nat_child_size;
GtkBorder sborder = { 0 };
- minimum_req.width = 0;
- minimum_req.height = 0;
- natural_req.width = 0;
- natural_req.height = 0;
-
- gtk_widget_get_preferred_size (priv->hscrollbar,
- &hscrollbar_requisition, NULL);
- gtk_widget_get_preferred_size (priv->vscrollbar,
- &vscrollbar_requisition, NULL);
-
child = gtk_bin_get_child (bin);
if (child)
@@ -1717,52 +1704,52 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
*/
if (child && gtk_widget_get_visible (child))
{
+ int min_child_size, nat_child_size;
+
gtk_widget_measure (child, orientation, -1,
&min_child_size, &nat_child_size,
NULL, NULL);
-
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
if (priv->propagate_natural_width)
- natural_req.width += nat_child_size;
+ natural_req += nat_child_size;
if (priv->hscrollbar_policy == GTK_POLICY_NEVER)
{
- minimum_req.width += min_child_size;
+ minimum_req += min_child_size;
}
else
{
gint min = priv->min_content_width >= 0 ? priv->min_content_width : 0;
gint max = priv->max_content_width >= 0 ? priv->max_content_width : G_MAXINT;
- minimum_req.width = CLAMP (minimum_req.width, min, max);
- natural_req.width = CLAMP (natural_req.width, min, max);
+ minimum_req = CLAMP (minimum_req, min, max);
+ natural_req = CLAMP (natural_req, min, max);
}
}
else /* GTK_ORIENTATION_VERTICAL */
{
if (priv->propagate_natural_height)
- natural_req.height += nat_child_size;
+ natural_req += nat_child_size;
if (priv->vscrollbar_policy == GTK_POLICY_NEVER)
{
- minimum_req.height += min_child_size;
+ minimum_req += min_child_size;
}
else
{
gint min = priv->min_content_height >= 0 ? priv->min_content_height : 0;
gint max = priv->max_content_height >= 0 ? priv->max_content_height : G_MAXINT;
- minimum_req.height = CLAMP (minimum_req.height, min, max);
- natural_req.height = CLAMP (natural_req.height, min, max);
+ minimum_req = CLAMP (minimum_req, min, max);
+ natural_req = CLAMP (natural_req, min, max);
}
}
}
/* 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);
+ natural_req = MAX (minimum_req, natural_req);
/*
* Now add to the requisition any additional space for surrounding scrollbars
@@ -1770,38 +1757,40 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
*/
if (policy_may_be_visible (priv->hscrollbar_policy))
{
- minimum_req.width = MAX (minimum_req.width, hscrollbar_requisition.width + sborder.left + sborder.right);
- natural_req.width = MAX (natural_req.width, hscrollbar_requisition.width + sborder.left + sborder.right);
+ GtkRequisition hscrollbar_requisition;
+ gtk_widget_get_preferred_size (priv->hscrollbar, &hscrollbar_requisition, NULL);
- if (!priv->use_indicators)
- {
- minimum_req.height += hscrollbar_requisition.height;
- natural_req.height += hscrollbar_requisition.height;
- }
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ minimum_req = MAX (minimum_req, hscrollbar_requisition.width + sborder.left + sborder.right);
+ natural_req = MAX (natural_req, hscrollbar_requisition.width + sborder.left + sborder.right);
+ }
+ else if (!priv->use_indicators)
+ {
+ minimum_req += hscrollbar_requisition.height;
+ natural_req += hscrollbar_requisition.height;
+ }
}
if (policy_may_be_visible (priv->vscrollbar_policy))
{
- minimum_req.height = MAX (minimum_req.height, vscrollbar_requisition.height + sborder.top + sborder.bottom);
- natural_req.height = MAX (natural_req.height, vscrollbar_requisition.height + sborder.top + sborder.bottom);
+ GtkRequisition vscrollbar_requisition;
+ gtk_widget_get_preferred_size (priv->vscrollbar, &vscrollbar_requisition, NULL);
- if (!priv->use_indicators)
- {
- minimum_req.width += vscrollbar_requisition.width;
- natural_req.width += vscrollbar_requisition.width;
- }
+ if (orientation == GTK_ORIENTATION_VERTICAL)
+ {
+ minimum_req = MAX (minimum_req, vscrollbar_requisition.height + sborder.top + sborder.bottom);
+ natural_req = MAX (natural_req, vscrollbar_requisition.height + sborder.top + sborder.bottom);
+ }
+ else if (!priv->use_indicators)
+ {
+ minimum_req += vscrollbar_requisition.width;
+ natural_req += vscrollbar_requisition.width;
+ }
}
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- *minimum_size = minimum_req.width;
- *natural_size = natural_req.width;
- }
- else
- {
- *minimum_size = minimum_req.height;
- *natural_size = natural_req.height;
- }
+ *minimum_size = minimum_req;
+ *natural_size = natural_req;
}
static void