diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-06-21 10:56:16 -0400 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-06-21 11:26:37 -0400 |
commit | 320dea539e67d0827e824e394d615b3b84078d81 (patch) | |
tree | e05a3ed56187e01860922015c0a9647cc4ffba0c | |
parent | 0bafa6a65b521cb3ba72dcf32cbe95b07f622c5a (diff) | |
download | gtk+-wip/paint-stack-cleanup.tar.gz |
gdkwindow: Don't clear to the background automaticallywip/paint-stack-cleanup
Introduce a new API, gdk_window_paint_background, which paints the
background, which we call inside GtkWidget as part of expose event
handling.
This allows users that were using gdk_cairo_create without a
gdk_window_begin_paint_region to start using it now, as they did not
want the clear-to-background behavior.
-rw-r--r-- | gdk/gdkwindow.c | 34 | ||||
-rw-r--r-- | gdk/gdkwindow.h | 3 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 2 |
3 files changed, 26 insertions, 13 deletions
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index b43feebb31..d93c183bd5 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -160,8 +160,6 @@ static void gdk_window_get_property (GObject *object, GValue *value, GParamSpec *pspec); -static void gdk_window_clear_backing_region (GdkWindow *window); - static void recompute_visible_regions (GdkWindow *private, gboolean recalculate_children); static void gdk_window_invalidate_in_parent (GdkWindow *private); @@ -2772,8 +2770,7 @@ gdk_window_begin_paint_region (GdkWindow *window, window->current_paint.surface_needs_composite = FALSE; } - if (!cairo_region_is_empty (window->current_paint.region)) - gdk_window_clear_backing_region (window); + window->current_paint.cleared_to_background = FALSE; } /** @@ -2942,19 +2939,33 @@ gdk_window_get_visible_region (GdkWindow *window) return cairo_region_copy (window->clip_region); } -static void -gdk_window_clear_backing_region (GdkWindow *window) +/** + * gdk_window_paint_background: + * @window: a #GdkWindow + * @cr: a #cairo_t to paint with + * + * Paints the background surface of #GdkWindow to #cr. + * + * This does not do any clipping to the clip region of the window, + * it simply paints the surface, so make sure to establish a clip + * beforehand. + * + * This function is intended to be called while in a paint started + * with gdk_window_begin_paint_region() or gdk_window_begin_paint_rect(). + */ +void +gdk_window_paint_background (GdkWindow *window, + cairo_t *cr) { GdkWindow *bg_window; cairo_pattern_t *pattern = NULL; int x_offset = 0, y_offset = 0; - cairo_t *cr; + + g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; - cr = cairo_create (window->current_paint.surface); - for (bg_window = window; bg_window; bg_window = bg_window->parent) { pattern = gdk_window_get_background_pattern (bg_window); @@ -2974,10 +2985,7 @@ gdk_window_clear_backing_region (GdkWindow *window) else cairo_set_source_rgb (cr, 0, 0, 0); - gdk_cairo_region (cr, window->current_paint.region); - cairo_fill (cr); - - cairo_destroy (cr); + cairo_paint (cr); /* Since we've cleared to an opaque pattern, we can skip alpha * blending later on in the composite stage. */ diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index 23a317a996..19b4fcb27f 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -1103,6 +1103,9 @@ void gdk_window_set_shadow_width (GdkWindow *window, GDK_AVAILABLE_IN_3_14 gboolean gdk_window_show_window_menu (GdkWindow *window, GdkEvent *event); +GDK_AVAILABLE_IN_3_14 +void gdk_window_paint_background (GdkWindow *window, + cairo_t *cr); G_END_DECLS diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 7e56ecb493..6389073ed0 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -7519,6 +7519,8 @@ gtk_widget_send_expose (GtkWidget *widget, gdk_cairo_region (cr, event->expose.region); cairo_clip (cr); + gdk_window_paint_background (event->expose.window, cr); + gtk_cairo_set_event (cr, &event->expose); if (event->expose.window == widget->priv->window) |