summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2010-09-09 16:27:22 +0900
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2010-09-09 17:19:18 +0900
commit73ea777c331b3ab62d55ddd1c258835c612c34d0 (patch)
tree9463ff6c8aed1da60ae4baea00e65e27b49fd38f
parent843be48572e00d20e927cfb6f11ad4abba6e8e15 (diff)
downloadgtk+-73ea777c331b3ab62d55ddd1c258835c612c34d0.tar.gz
Fixed GtkTextView & GtkIconView to consult it's true previous size request
Fixed issues in my previous patch for bug 626939 removing GtkRequisition cache: these widgets monitor the previous requested size and decide whether to queue a resize when the content changes based on it's prior request.
-rw-r--r--gtk/gtkiconview.c17
-rw-r--r--gtk/gtktextview.c20
2 files changed, 27 insertions, 10 deletions
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index 84ce3f85e5..2dc10434ee 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -2821,12 +2821,12 @@ static void
gtk_icon_view_layout (GtkIconView *icon_view)
{
GtkAllocation allocation;
- GtkRequisition requisition;
GtkWidget *widget;
GList *icons;
gint y = 0, maximum_width = 0;
gint row;
gint item_width;
+ gboolean size_changed = FALSE;
if (icon_view->priv->layout_idle_id != 0)
{
@@ -2872,22 +2872,25 @@ gtk_icon_view_layout (GtkIconView *icon_view)
while (icons != NULL);
if (maximum_width != icon_view->priv->width)
- icon_view->priv->width = maximum_width;
+ {
+ icon_view->priv->width = maximum_width;
+ size_changed = TRUE;
+ }
y += icon_view->priv->margin;
if (y != icon_view->priv->height)
- icon_view->priv->height = y;
+ {
+ icon_view->priv->height = y;
+ size_changed = TRUE;
+ }
gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment,
icon_view->priv->width);
gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment,
icon_view->priv->height);
- gtk_size_request_get_size (GTK_SIZE_REQUEST (widget), &requisition, NULL);
-
- if (icon_view->priv->width != requisition.width ||
- icon_view->priv->height != requisition.height)
+ if (size_changed)
gtk_widget_queue_resize_no_redraw (widget);
gtk_widget_get_allocation (widget, &allocation);
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index db1073a2f1..e49fb01e71 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -134,6 +134,18 @@ struct _GtkTextViewPrivate
gint width; /* Width and height of the buffer */
gint height;
+ /* This is used to monitor the overall size request
+ * and decide whether we need to queue resizes when
+ * the buffer content changes.
+ *
+ * FIXME: This could be done in a simpler way by
+ * consulting the above width/height of the buffer + some
+ * padding values, however all of this request code needs
+ * to be changed to use GtkSizeRequestIface and deserves
+ * more attention.
+ */
+ GtkRequisition cached_size_request;
+
/* The virtual cursor position is normally the same as the
* actual (strong) cursor position, except in two circumstances:
*
@@ -3319,6 +3331,10 @@ gtk_text_view_size_request (GtkWidget *widget,
tmp_list = g_slist_next (tmp_list);
}
+
+ /* Cache the requested size of the text view so we can
+ * compare it in the changed_handler() */
+ priv->cached_size_request = *requisition;
}
static void
@@ -3935,11 +3951,9 @@ changed_handler (GtkTextLayout *layout,
}
{
- GtkRequisition old_req;
+ GtkRequisition old_req = priv->cached_size_request;
GtkRequisition new_req;
- gtk_size_request_get_size (GTK_SIZE_REQUEST (widget), &old_req, NULL);
-
/* Use this instead of gtk_widget_size_request wrapper
* to avoid the optimization which just returns widget->requisition
* if a resize hasn't been queued.