From 77565d3812bffa7fa25c44a394d696e477a7fdc0 Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Thu, 10 Sep 2009 15:50:25 +0200 Subject: [PATCH] On html adjustment changes, resize children in idle. * src/widgets/modest-gtkhtml-msg-view.c (html_adjustment_changed): readjust children in idle to avoid infinite recursion (fixes NB#136052). --- src/widgets/modest-gtkhtml-msg-view.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/widgets/modest-gtkhtml-msg-view.c b/src/widgets/modest-gtkhtml-msg-view.c index d35ea17..6bd1abd 100644 --- a/src/widgets/modest-gtkhtml-msg-view.c +++ b/src/widgets/modest-gtkhtml-msg-view.c @@ -273,6 +273,7 @@ struct _ModestGtkhtmlMsgViewPrivate { /* idle changes count */ gint idle_changes_count; guint idle_readjust_scroll_id; + guint idle_resize_children_id; /* zoom */ gdouble current_zoom; @@ -1033,6 +1034,18 @@ adjustment_value_changed (GtkAdjustment *adj, gpointer data) } } +static gboolean +resize_children_idle (GtkContainer *cont) +{ + ModestGtkhtmlMsgViewPrivate *priv = MODEST_GTKHTML_MSG_VIEW_GET_PRIVATE (cont); + if (GTK_WIDGET_DRAWABLE (cont)) { + gtk_container_resize_children (cont); + } + priv->idle_resize_children_id = 0; + + return FALSE; +} + static void html_adjustment_changed (GtkAdjustment *adj, gpointer userdata) @@ -1058,7 +1071,8 @@ html_adjustment_changed (GtkAdjustment *adj, if (GTK_WIDGET_DRAWABLE (priv->html_scroll)) { gdk_window_resize (priv->html_window, (gint) priv->hadj->upper, (gint) new_height); gdk_window_process_updates (priv->view_window, TRUE); - gtk_container_resize_children (GTK_CONTAINER (self)); + if (priv->idle_resize_children_id == 0) + priv->idle_resize_children_id = gdk_threads_add_idle ((GSourceFunc) resize_children_idle, self); } } @@ -1122,6 +1136,7 @@ modest_gtkhtml_msg_view_init (ModestGtkhtmlMsgView *obj) priv->idle_changes_count = 0; priv->idle_readjust_scroll_id = 0; + priv->idle_resize_children_id = 0; priv->current_zoom = 1.0; priv->hadj = NULL; @@ -1255,6 +1270,11 @@ modest_gtkhtml_msg_view_finalize (GObject *obj) priv->msg = NULL; } + if (priv->idle_resize_children_id > 0) { + g_source_remove (priv->idle_resize_children_id); + priv->idle_resize_children_id = 0; + } + if (priv->idle_readjust_scroll_id > 0) { g_source_remove (priv->idle_readjust_scroll_id); priv->idle_readjust_scroll_id = 0; -- 1.7.9.5