[gtk+] API: Add gdk_window_get_background_pattern()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] API: Add gdk_window_get_background_pattern()
- Date: Mon, 16 Aug 2010 17:49:01 +0000 (UTC)
commit 2944561ba301e0317fe7a1f39892df553d5f4e67
Author: Benjamin Otte <otte redhat com>
Date: Sun Aug 15 23:50:02 2010 +0200
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 eb3bf36..de08736 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 8a58243..27f8f6a 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 694391d..dcd6e12 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 d5bc413..e7380c6 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 77523c4..dcc42ac 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]