From 99f59d8266c538127457571a58eccd92096f1fc6 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 13 Dec 2010 00:27:24 +0100 Subject: [PATCH] Fix coalescing of state animation areas for multiple window widgets. Coordinates needed to be translated relative to the window position in within the widget. --- gtk/gtkstylecontext.c | 6 ++++-- gtk/gtkstylecontext.h | 3 +-- gtk/gtkwidget.c | 22 ++++++++++------------ gtk/gtkwidgetprivate.h | 5 +++++ 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index be7f78279f..27f7efb65b 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -34,6 +34,7 @@ #include "gtkanimationdescription.h" #include "gtktimeline.h" #include "gtkiconfactory.h" +#include "gtkwidgetprivate.h" /** * SECTION:gtkstylecontext @@ -2982,8 +2983,7 @@ _gtk_style_context_invalidate_animation_areas (GtkStyleContext *context) void _gtk_style_context_coalesce_animation_areas (GtkStyleContext *context, - gint rel_x, - gint rel_y) + GtkWidget *widget) { GtkStyleContextPrivate *priv; GSList *l; @@ -2998,6 +2998,7 @@ _gtk_style_context_coalesce_animation_areas (GtkStyleContext *context, while (l) { AnimationInfo *info; + gint rel_x, rel_y; GSList *cur; guint i; @@ -3017,6 +3018,7 @@ _gtk_style_context_coalesce_animation_areas (GtkStyleContext *context, } info->invalidation_region = cairo_region_create (); + _gtk_widget_get_translation_to_window (widget, info->window, &rel_x, &rel_y); for (i = 0; i < info->rectangles->len; i++) { diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h index f7d658a5a6..0d1f74be74 100644 --- a/gtk/gtkstylecontext.h +++ b/gtk/gtkstylecontext.h @@ -459,8 +459,7 @@ const GValue * _gtk_style_context_peek_style_property (GtkStyleContext *context, GParamSpec *pspec); void _gtk_style_context_invalidate_animation_areas (GtkStyleContext *context); void _gtk_style_context_coalesce_animation_areas (GtkStyleContext *context, - gint rel_x, - gint rel_y); + GtkWidget *widget); void gtk_style_context_invalidate (GtkStyleContext *context); void gtk_style_context_reset_widgets (GdkScreen *screen); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 214c3913b5..317b45b3c2 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -5564,9 +5564,7 @@ _gtk_widget_draw_internal (GtkWidget *widget, } context = gtk_widget_get_style_context (widget); - _gtk_style_context_coalesce_animation_areas (context, - widget->priv->allocation.x, - widget->priv->allocation.y); + _gtk_style_context_coalesce_animation_areas (context, widget); } /** @@ -5688,11 +5686,11 @@ gtk_widget_event (GtkWidget *widget, } /* Returns TRUE if a translation should be done */ -static gboolean -gtk_widget_get_translation_to_window (GtkWidget *widget, - GdkWindow *window, - int *x, - int *y) +gboolean +_gtk_widget_get_translation_to_window (GtkWidget *widget, + GdkWindow *window, + int *x, + int *y) { GdkWindow *w, *widget_window; @@ -5755,7 +5753,7 @@ gtk_cairo_transform_to_window (cairo_t *cr, g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (GDK_IS_WINDOW (window)); - if (gtk_widget_get_translation_to_window (widget, window, &x, &y)) + if (_gtk_widget_get_translation_to_window (widget, window, &x, &y)) cairo_translate (cr, x, y); } @@ -5798,9 +5796,9 @@ gtk_widget_send_expose (GtkWidget *widget, gdk_cairo_region (cr, event->expose.region); cairo_clip (cr); - do_clip = gtk_widget_get_translation_to_window (widget, - event->expose.window, - &x, &y); + do_clip = _gtk_widget_get_translation_to_window (widget, + event->expose.window, + &x, &y); cairo_translate (cr, -x, -y); _gtk_widget_draw_internal (widget, cr, do_clip); diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index b31efd9b5b..c5666468f3 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -88,6 +88,11 @@ void _gtk_widget_restore_size_request (GtkWidget *widget, int old_width, int old_height); +gboolean _gtk_widget_get_translation_to_window (GtkWidget *widget, + GdkWindow *window, + int *x, + int *y); + G_END_DECLS #endif /* __GTK_WIDGET_PRIVATE_H__ */