From c575733edab533c7e36062e06a4a8a9e2382685b Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Sat, 9 Oct 2010 15:19:52 +0200 Subject: [PATCH] GtkStyleContext: Fix animation framework to work with the new draw() semantics. Invalidation region coalescing now happens recursively as draw() runs, and the widget's x/y as now drawing coordinates are 0,0 based. --- gtk/gtkstylecontext.c | 9 ++++++++- gtk/gtkstylecontext.h | 4 +++- gtk/gtkwidget.c | 12 +++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 09236331f0..69e7797d89 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -1852,7 +1852,9 @@ _gtk_style_context_invalidate_animation_areas (GtkStyleContext *context) } void -_gtk_style_context_coalesce_animation_areas (GtkStyleContext *context) +_gtk_style_context_coalesce_animation_areas (GtkStyleContext *context, + gint rel_x, + gint rel_y) { GtkStyleContextPrivate *priv; GSList *l; @@ -1885,11 +1887,16 @@ _gtk_style_context_coalesce_animation_areas (GtkStyleContext *context) cairo_rectangle_int_t *rect; rect = &g_array_index (info->rectangles, cairo_rectangle_int_t, i); + rect->x += rel_x; + rect->y += rel_y; + cairo_region_union_rectangle (info->invalidation_region, rect); } g_array_remove_range (info->rectangles, 0, info->rectangles->len); } + + priv->animations_invalidated = FALSE; } static void diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h index 5064bf6f08..3daf753059 100644 --- a/gtk/gtkstylecontext.h +++ b/gtk/gtkstylecontext.h @@ -152,7 +152,9 @@ const GValue * _gtk_style_context_peek_style_property (GtkStyleContext *context, GType widget_type, GParamSpec *pspec); void _gtk_style_context_invalidate_animation_areas (GtkStyleContext *context); -void _gtk_style_context_coalesce_animation_areas (GtkStyleContext *context); +void _gtk_style_context_coalesce_animation_areas (GtkStyleContext *context, + gint rel_x, + gint rel_y); /* Animation for state changes */ void gtk_style_context_state_transition_start (GtkStyleContext *context, diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 0694f5cd2d..3dfbc6ce2d 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -4160,7 +4160,6 @@ gtk_widget_realize (GtkWidget *widget) GtkWidgetPrivate *priv; GdkExtensionMode mode; cairo_region_t *region; - GtkStyleContext *context; g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (widget->priv->anchored || @@ -5413,6 +5412,8 @@ _gtk_widget_draw_internal (GtkWidget *widget, cairo_t *cr, gboolean clip_to_size) { + GtkStyleContext *context; + if (!gtk_widget_is_drawable (widget)) return; @@ -5433,6 +5434,11 @@ _gtk_widget_draw_internal (GtkWidget *widget, 0, cr, &result); } + + context = gtk_widget_get_style_context (widget); + _gtk_style_context_coalesce_animation_areas (context, + widget->priv->allocation.x, + widget->priv->allocation.y); } /** @@ -5652,7 +5658,6 @@ gtk_widget_send_expose (GtkWidget *widget, cairo_t *cr; int x, y; gboolean do_clip; - GtkStyleContext *context; g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE); g_return_val_if_fail (gtk_widget_get_realized (widget), TRUE); @@ -5677,9 +5682,6 @@ gtk_widget_send_expose (GtkWidget *widget, gtk_cairo_set_event (cr, NULL); cairo_destroy (cr); - context = gtk_widget_get_style_context (widget); - _gtk_style_context_coalesce_animation_areas (context); - return result; }