From 5089139eea357c73b592ccf0d9c48f7e66f590c3 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 10 Feb 2011 14:49:57 +0100 Subject: Bug #641502 - Flickering while resizing the mail list --- libgnomecanvas/gnome-canvas-rect.c | 4 +- libgnomecanvas/gnome-canvas-rich-text.c | 6 +-- libgnomecanvas/gnome-canvas.c | 82 +++++++++++++++++---------------- 3 files changed, 47 insertions(+), 45 deletions(-) diff --git a/libgnomecanvas/gnome-canvas-rect.c b/libgnomecanvas/gnome-canvas-rect.c index d3009b7d13..3cf71bd1b0 100644 --- a/libgnomecanvas/gnome-canvas-rect.c +++ b/libgnomecanvas/gnome-canvas-rect.c @@ -276,7 +276,7 @@ gnome_canvas_rect_set_property (GObject *object, case PROP_DASH: /* XXX */ - g_assert_not_reached (); + g_warn_if_reached (); break; default: @@ -342,7 +342,7 @@ gnome_canvas_rect_get_property (GObject *object, case PROP_DASH: /* XXX */ - g_assert_not_reached (); + g_warn_if_reached (); break; default: diff --git a/libgnomecanvas/gnome-canvas-rich-text.c b/libgnomecanvas/gnome-canvas-rich-text.c index 8c1e4142d9..a19738f484 100644 --- a/libgnomecanvas/gnome-canvas-rich-text.c +++ b/libgnomecanvas/gnome-canvas-rich-text.c @@ -1581,14 +1581,14 @@ preblink_cb (gpointer data) return FALSE; } /* preblink_cb */ -static gint +static gboolean blink_cb (gpointer data) { GnomeCanvasRichText *text = GNOME_CANVAS_RICH_TEXT (data); gboolean visible; - g_assert (text->_priv->layout); - g_assert (text->_priv->cursor_visible); + g_return_val_if_fail (text->_priv->layout, FALSE); + g_return_val_if_fail (text->_priv->cursor_visible, FALSE); visible = gtk_text_layout_get_cursor_visible (text->_priv->layout); if (visible) diff --git a/libgnomecanvas/gnome-canvas.c b/libgnomecanvas/gnome-canvas.c index b26dc94679..86835c2aec 100644 --- a/libgnomecanvas/gnome-canvas.c +++ b/libgnomecanvas/gnome-canvas.c @@ -677,7 +677,7 @@ gnome_canvas_item_raise (GnomeCanvasItem *item, gint positions) parent = GNOME_CANVAS_GROUP (item->parent); link = g_list_find (parent->item_list, item); - g_assert (link != NULL); + g_return_if_fail (link != NULL); for (before = link; positions && before; positions--) before = before->next; @@ -714,7 +714,7 @@ gnome_canvas_item_lower (GnomeCanvasItem *item, gint positions) parent = GNOME_CANVAS_GROUP (item->parent); link = g_list_find (parent->item_list, item); - g_assert (link != NULL); + g_return_if_fail (link != NULL); if (link->prev) for (before = link->prev; positions && before; positions--) @@ -747,7 +747,7 @@ gnome_canvas_item_raise_to_top (GnomeCanvasItem *item) parent = GNOME_CANVAS_GROUP (item->parent); link = g_list_find (parent->item_list, item); - g_assert (link != NULL); + g_return_if_fail (link != NULL); if (put_item_after (link, parent->item_list_end)) { redraw_if_visible (item); @@ -774,7 +774,7 @@ gnome_canvas_item_lower_to_bottom (GnomeCanvasItem *item) parent = GNOME_CANVAS_GROUP (item->parent); link = g_list_find (parent->item_list, item); - g_assert (link != NULL); + g_return_if_fail (link != NULL); if (put_item_after (link, NULL)) { redraw_if_visible (item); @@ -2250,48 +2250,50 @@ gnome_canvas_draw (GtkWidget *widget, { GnomeCanvas *canvas = GNOME_CANVAS (widget); cairo_rectangle_int_t rect; + GtkLayout *layout; + GtkAdjustment *hadjustment; + GtkAdjustment *vadjustment; + gdouble hadjustment_value; + gdouble vadjustment_value; + + layout = GTK_LAYOUT (canvas); + hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout)); + vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout)); + + hadjustment_value = gtk_adjustment_get_value (hadjustment); + vadjustment_value = gtk_adjustment_get_value (vadjustment); gdk_cairo_get_clip_rectangle (cr, &rect); if (canvas->need_update) { - gnome_canvas_request_redraw (canvas, - rect.x, rect.y, - rect.x + rect.width, - rect.y + rect.height); - } else { - GtkLayout *layout; - GtkAdjustment *hadjustment; - GtkAdjustment *vadjustment; - gdouble hadjustment_value; - gdouble vadjustment_value; - - layout = GTK_LAYOUT (canvas); - hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout)); - vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout)); + cairo_matrix_t w2c; - hadjustment_value = gtk_adjustment_get_value (hadjustment); - vadjustment_value = gtk_adjustment_get_value (vadjustment); + /* We start updating root with w2c matrix */ + gnome_canvas_w2c_matrix (canvas, &w2c); - cairo_save (cr); - cairo_translate (cr, - -canvas->zoom_xofs + rect.x, - -canvas->zoom_yofs + rect.y); - - rect.x += hadjustment_value; - rect.y += vadjustment_value; - - /* No pending updates, draw exposed area immediately */ - gnome_canvas_paint_rect (canvas, cr, - rect.x, rect.y, - rect.x + rect.width, - rect.y + rect.height); - cairo_restore (cr); + gnome_canvas_item_invoke_update (canvas->root, &w2c, 0); - /* And call expose on parent container class */ - GTK_WIDGET_CLASS (canvas_parent_class)-> - draw (widget, cr); + canvas->need_update = FALSE; } + cairo_save (cr); + cairo_translate (cr, + -canvas->zoom_xofs + rect.x, + -canvas->zoom_yofs + rect.y); + + rect.x += hadjustment_value; + rect.y += vadjustment_value; + + /* No pending updates, draw exposed area immediately */ + gnome_canvas_paint_rect (canvas, cr, + rect.x, rect.y, + rect.x + rect.width, + rect.y + rect.height); + cairo_restore (cr); + + /* And call expose on parent container class */ + GTK_WIDGET_CLASS (canvas_parent_class)->draw (widget, cr); + return FALSE; } @@ -2642,7 +2644,7 @@ gnome_canvas_button (GtkWidget *widget, GdkEventButton *event) break; default: - g_assert_not_reached (); + g_warn_if_reached (); } return retval; @@ -2695,7 +2697,7 @@ gnome_canvas_key (GtkWidget *widget, GdkEventKey *event) if (widget_class->key_release_event) return (* widget_class->key_release_event) (widget, event); } else - g_assert_not_reached (); + g_warn_if_reached (); return FALSE; } else @@ -2841,7 +2843,7 @@ idle_handler (gpointer data) static void add_idle (GnomeCanvas *canvas) { - g_assert (canvas->need_update); + g_return_if_fail (canvas->need_update); if (!canvas->idle_id) canvas->idle_id = g_idle_add_full (CANVAS_IDLE_PRIORITY, -- cgit v1.2.3