X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-gtkhtml-msg-view.c;h=d35ea17c518cb36a50d0a1a4c9d9dc8fee249eb7;hp=994f926dbeb0de313fc7a53a3360364751865ba2;hb=247b5f9e1d7a9557e94b96ac6d50adcef6beb5bd;hpb=90ec7215ea0ce9d0da3d8793dfbb7c20951769ec diff --git a/src/widgets/modest-gtkhtml-msg-view.c b/src/widgets/modest-gtkhtml-msg-view.c index 994f926..d35ea17 100644 --- a/src/widgets/modest-gtkhtml-msg-view.c +++ b/src/widgets/modest-gtkhtml-msg-view.c @@ -270,6 +270,10 @@ struct _ModestGtkhtmlMsgViewPrivate { /* id handler for dragged scroll */ guint idle_motion_id; + /* idle changes count */ + gint idle_changes_count; + guint idle_readjust_scroll_id; + /* zoom */ gdouble current_zoom; @@ -908,6 +912,12 @@ size_allocate (GtkWidget *widget, allocation->height != widget->allocation.height)) gdk_window_invalidate_rect (widget->window, NULL, FALSE); + if (priv->idle_readjust_scroll_id == 0 && priv->idle_changes_count < 5 && widget->allocation.width != allocation->width) { + g_object_ref (self); + priv->idle_readjust_scroll_id = g_idle_add ((GSourceFunc) idle_readjust_scroll, self); + priv->idle_changes_count ++; + } + widget->allocation = *allocation; set_hadjustment_values (self, &hadj_value_changed); set_vadjustment_values (self, &vadj_value_changed); @@ -1056,27 +1066,42 @@ html_adjustment_changed (GtkAdjustment *adj, gboolean idle_readjust_scroll (ModestGtkhtmlMsgView *self) { + ModestGtkhtmlMsgViewPrivate *priv = MODEST_GTKHTML_MSG_VIEW_GET_PRIVATE (self); /* We're out the main lock */ gdk_threads_enter (); if (GTK_WIDGET_DRAWABLE (self)) { - ModestGtkhtmlMsgViewPrivate *priv = MODEST_GTKHTML_MSG_VIEW_GET_PRIVATE (self); GtkAdjustment *html_vadj; + GtkAdjustment *html_hadj; + html_vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); - html_vadj->page_size = html_vadj->upper; - gtk_adjustment_changed (html_vadj); - gtk_widget_queue_resize (GTK_WIDGET (self)); - gtk_widget_queue_draw (GTK_WIDGET (self)); + html_vadj->upper = 0; + html_vadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_vadj), "changed"); + + html_hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_hadj->upper = 0; + html_hadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_hadj), "changed"); + + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1); + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1); + + gtk_widget_queue_resize (GTK_WIDGET (priv->body_view)); + gtk_widget_queue_draw (GTK_WIDGET (priv->body_view)); /* Just another hack for making readjust really work. This forces an update * of the scroll, and then, make the scroll really update properly the * the size and not corrupt scrollable area */ gtk_adjustment_set_value (priv->vadj, 1.0); gtk_adjustment_set_value (priv->vadj, 0.0); + } + priv->idle_readjust_scroll_id = 0; g_object_unref (G_OBJECT (self)); + gdk_threads_leave (); return FALSE; @@ -1095,6 +1120,8 @@ modest_gtkhtml_msg_view_init (ModestGtkhtmlMsgView *obj) priv = MODEST_GTKHTML_MSG_VIEW_GET_PRIVATE(obj); + priv->idle_changes_count = 0; + priv->idle_readjust_scroll_id = 0; priv->current_zoom = 1.0; priv->hadj = NULL; @@ -1228,6 +1255,11 @@ modest_gtkhtml_msg_view_finalize (GObject *obj) priv->msg = NULL; } + if (priv->idle_readjust_scroll_id > 0) { + g_source_remove (priv->idle_readjust_scroll_id); + priv->idle_readjust_scroll_id = 0; + } + if (priv->idle_motion_id > 0) { g_source_remove (priv->idle_motion_id); priv->idle_motion_id = 0; @@ -1701,7 +1733,7 @@ set_message (ModestGtkhtmlMsgView *self, TnyMsg *msg, TnyMimePart *other_body) TnyMimePart *body; ModestGtkhtmlMsgViewPrivate *priv; TnyHeader *header; - GtkAdjustment *html_vadj; + GtkAdjustment *html_vadj, *html_hadj; g_return_if_fail (self); @@ -1710,12 +1742,6 @@ set_message (ModestGtkhtmlMsgView *self, TnyMsg *msg, TnyMimePart *other_body) gtk_widget_set_no_show_all (priv->mail_header_view, FALSE); modest_mime_part_view_set_view_images (MODEST_MIME_PART_VIEW (priv->body_view), FALSE); - html_vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); - html_vadj->upper = 0; - html_vadj->page_size = 0; - g_signal_emit_by_name (G_OBJECT (html_vadj), "changed"); - - if (msg != priv->msg) { if (priv->msg) g_object_unref (G_OBJECT(priv->msg)); @@ -1734,6 +1760,23 @@ set_message (ModestGtkhtmlMsgView *self, TnyMsg *msg, TnyMimePart *other_body) #endif gtk_widget_set_no_show_all (priv->mail_header_view, TRUE); tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view)); + + html_vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_vadj->upper = 0; + html_vadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_vadj), "changed"); + + html_hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_hadj->upper = 0; + html_hadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_hadj), "changed"); + + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1); + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1); + + priv->idle_changes_count = 0; + gtk_widget_queue_resize (GTK_WIDGET (priv->body_view)); + gtk_widget_queue_resize (GTK_WIDGET(self)); gtk_widget_queue_draw (GTK_WIDGET(self)); return; @@ -1801,6 +1844,23 @@ set_message (ModestGtkhtmlMsgView *self, TnyMsg *msg, TnyMimePart *other_body) gtk_widget_set_no_show_all (priv->priority_box, FALSE); #endif gtk_widget_set_no_show_all (priv->mail_header_view, TRUE); + + html_vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_vadj->upper = 0; + html_vadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_vadj), "changed"); + + html_hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_hadj->upper = 0; + html_hadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_hadj), "changed"); + + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1); + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1); + + priv->idle_changes_count = 0; + gtk_widget_queue_resize (GTK_WIDGET (priv->body_view)); + gtk_widget_queue_resize (GTK_WIDGET(self)); gtk_widget_queue_draw (GTK_WIDGET(self)); @@ -1814,15 +1874,17 @@ set_message (ModestGtkhtmlMsgView *self, TnyMsg *msg, TnyMimePart *other_body) /* This is a hack to force reallocation of scroll after drawing all the stuff. This * makes the html view get the proper and expected size and prevent being able to scroll * the buffer when it shouldn't be scrollable */ - g_object_ref (self); - g_timeout_add (250, (GSourceFunc) idle_readjust_scroll, self); + if (priv->idle_readjust_scroll_id == 0) { + g_object_ref (self); + priv->idle_readjust_scroll_id = g_idle_add ((GSourceFunc) idle_readjust_scroll, self); + } } static void set_header (ModestGtkhtmlMsgView *self, TnyHeader *header) { ModestGtkhtmlMsgViewPrivate *priv; - GtkAdjustment *html_vadj; + GtkAdjustment *html_vadj, *html_hadj; g_return_if_fail (self); @@ -1841,6 +1903,15 @@ set_header (ModestGtkhtmlMsgView *self, TnyHeader *header) html_vadj->page_size = 0; g_signal_emit_by_name (G_OBJECT (html_vadj), "changed"); + html_hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_hadj->upper = 0; + html_hadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_hadj), "changed"); + + priv->idle_changes_count = 0; + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1); + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1); + gtk_widget_queue_resize (GTK_WIDGET (priv->body_view)); if (priv->msg) { g_object_unref (G_OBJECT(priv->msg)); @@ -1856,6 +1927,7 @@ set_header (ModestGtkhtmlMsgView *self, TnyHeader *header) #endif gtk_widget_set_no_show_all (priv->mail_header_view, TRUE); tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view)); + priv->idle_changes_count = 0; gtk_widget_queue_resize (GTK_WIDGET(self)); gtk_widget_queue_draw (GTK_WIDGET(self)); } @@ -1888,12 +1960,27 @@ static void set_zoom (ModestGtkhtmlMsgView *self, gdouble zoom) { ModestGtkhtmlMsgViewPrivate *priv; + GtkAdjustment *html_vadj, *html_hadj; g_return_if_fail (MODEST_IS_GTKHTML_MSG_VIEW (self)); priv = MODEST_GTKHTML_MSG_VIEW_GET_PRIVATE (self); modest_zoomable_set_zoom (MODEST_ZOOMABLE(priv->body_view), zoom); + html_vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_vadj->upper = 0; + html_vadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_vadj), "changed"); + + html_hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (priv->html_scroll)); + html_hadj->upper = 0; + html_hadj->page_size = 0; + g_signal_emit_by_name (G_OBJECT (html_hadj), "changed"); + + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1); + gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1); + + priv->idle_changes_count = 0; gtk_widget_queue_resize (priv->body_view); }