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.
This commit is contained in:
Carlos Garnacho 2010-10-09 15:19:52 +02:00
parent f9788eb173
commit c575733eda
3 changed files with 18 additions and 7 deletions

View File

@ -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

View File

@ -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,

View File

@ -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;
}