From 2944561ba301e0317fe7a1f39892df553d5f4e67 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 15 Aug 2010 23:50:02 +0200 Subject: [PATCH] API: Add gdk_window_get_background_pattern() This is the suggested way for GTK3 to store a Window's background so it makes sense to use the same function today already. --- docs/reference/gdk/gdk3-sections.txt | 3 +- gdk/gdk.symbols | 1 + gdk/gdkinternals.h | 1 + gdk/gdkwindow.c | 68 ++++++++++++++++++++++++++++ gdk/gdkwindow.h | 2 + 5 files changed, 73 insertions(+), 2 deletions(-) diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index eb3bf36a0c..de08736efd 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -477,9 +477,8 @@ gdk_window_merge_child_input_shapes gdk_window_set_static_gravities gdk_window_set_title gdk_window_set_background -gdk_window_get_background gdk_window_set_back_pixmap -gdk_window_get_back_pixmap +gdk_window_get_background_pattern GDK_PARENT_RELATIVE gdk_window_set_cursor gdk_window_get_cursor diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols index 8a582433e8..27f8f6a8af 100644 --- a/gdk/gdk.symbols +++ b/gdk/gdk.symbols @@ -579,6 +579,7 @@ gdk_window_move_resize gdk_window_scroll gdk_window_move_region gdk_window_get_accept_focus +gdk_window_get_background_pattern gdk_window_get_composited gdk_window_get_cursor gdk_window_get_focus_on_map diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 694391d83c..dcd6e128fe 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -209,6 +209,7 @@ struct _GdkWindowObject GdkColor bg_color; GdkPixmap *bg_pixmap; + cairo_pattern_t *background; GSList *paint_stack; diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index d5bc413dfa..e7380c69cf 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -2067,6 +2067,12 @@ _gdk_window_destroy_hierarchy (GdkWindow *window, private->bg_pixmap = NULL; } + if (private->background) + { + cairo_pattern_destroy (private->background); + private->background = NULL; + } + if (private->window_type == GDK_WINDOW_FOREIGN) g_assert (private->children == NULL); else @@ -7085,6 +7091,12 @@ gdk_window_set_background (GdkWindow *window, private->bg_pixmap = NULL; + if (private->background) + { + cairo_pattern_destroy (private->background); + private->background = NULL; + } + if (!GDK_WINDOW_DESTROYED (window) && gdk_window_has_impl (private) && !private->input_only) @@ -7145,6 +7157,12 @@ gdk_window_set_back_pixmap (GdkWindow *window, private->bg_pixmap != GDK_NO_BG) g_object_unref (private->bg_pixmap); + if (private->background) + { + cairo_pattern_destroy (private->background); + private->background = NULL; + } + if (parent_relative) private->bg_pixmap = GDK_PARENT_RELATIVE_BG; else if (pixmap) @@ -7161,6 +7179,56 @@ gdk_window_set_back_pixmap (GdkWindow *window, } } +/** + * gdk_window_get_background_pattern: + * @window: a window + * + * Gets the pattern used to clear the background on @window. If @window + * does not have its own background and reuses the parent's, %NULL is + * returned and you'll have to query it yourself. + * + * Returns: The pattern to use for the background or %NULL to use the + * parent's background. + * + * Since: 2.22 + **/ +cairo_pattern_t * +gdk_window_get_background_pattern (GdkWindow *window) +{ + GdkWindowObject *private = (GdkWindowObject *) window; + + g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); + + if (private->background == NULL) + { + if (private->bg_pixmap == GDK_PARENT_RELATIVE_BG) + private->background = NULL; + else if (private->bg_pixmap != GDK_NO_BG && + private->bg_pixmap != NULL) + { + static cairo_user_data_key_t key; + cairo_surface_t *surface; + + surface = _gdk_drawable_ref_cairo_surface (private->bg_pixmap); + private->background = cairo_pattern_create_for_surface (surface); + cairo_surface_destroy (surface); + + cairo_pattern_set_extend (private->background, CAIRO_EXTEND_REPEAT); + cairo_pattern_set_user_data (private->background, + &key, + g_object_ref (private->bg_pixmap), + g_object_unref); + } + else + private->background = + cairo_pattern_create_rgb (private->bg_color.red / 65535., + private->bg_color.green / 65535., + private->bg_color.blue / 65535.); + } + + return private->background; +} + static void update_cursor_foreach (GdkDisplay *display, GdkDevice *device, diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index 77523c442b..dcc42acdf9 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -693,6 +693,8 @@ void gdk_window_set_background (GdkWindow *window, void gdk_window_set_back_pixmap (GdkWindow *window, GdkPixmap *pixmap, gboolean parent_relative); +cairo_pattern_t *gdk_window_get_background_pattern (GdkWindow *window); + void gdk_window_set_cursor (GdkWindow *window, GdkCursor *cursor); GdkCursor *gdk_window_get_cursor (GdkWindow *window);