diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-09-09 16:27:22 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-09-09 17:19:18 +0900 |
commit | 73ea777c331b3ab62d55ddd1c258835c612c34d0 (patch) | |
tree | 9463ff6c8aed1da60ae4baea00e65e27b49fd38f | |
parent | 843be48572e00d20e927cfb6f11ad4abba6e8e15 (diff) | |
download | gtk+-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.c | 17 | ||||
-rw-r--r-- | gtk/gtktextview.c | 20 |
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. |