[mutter] Use gdk_window_get_background_pattern() to clear the background
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] Use gdk_window_get_background_pattern() to clear the background
- Date: Tue, 17 Aug 2010 19:02:09 +0000 (UTC)
commit 0839c100c08932fdedacb7ceb43783431d5d3b6c
Author: Florian Müllner <fmuellner gnome org>
Date: Mon Aug 16 19:20:44 2010 +0200
Use gdk_window_get_background_pattern() to clear the background
gdk_window_get_back_pixmap() and gdk_window_get_background() have
been removed/deprecated. Use gdk_window_get_background_pattern()
as replacement.
https://bugzilla.gnome.org/show_bug.cgi?id=626583
src/gdk-compat.h | 17 ---------------
src/ui/frames.c | 60 +++++++++++++++++++++++++++++++++++++++++------------
2 files changed, 46 insertions(+), 31 deletions(-)
---
diff --git a/src/gdk-compat.h b/src/gdk-compat.h
index 236efab..31991e8 100644
--- a/src/gdk-compat.h
+++ b/src/gdk-compat.h
@@ -11,24 +11,7 @@
#if !GTK_CHECK_VERSION (2, 21, 1)
-#define gdk_window_get_background(w,c) *c = GDK_WINDOW_OBJECT (w)->bg_color
#define gdk_visual_get_depth(v) GDK_VISUAL(v)->depth
-#define gdk_window_get_back_pixmap(w,p,r) \
- G_STMT_START { \
- GdkWindowObject *priv = GDK_WINDOW_OBJECT (w); \
- \
- if (p != NULL) \
- { \
- if (priv->bg_pixmap == GDK_PARENT_RELATIVE_BG || \
- priv->bg_pixmap == GDK_NO_BG) \
- *p = NULL; \
- else \
- *p = priv->bg_pixmap; \
- } \
- \
- if (r != NULL) \
- *r = (priv->bg_pixmap == GDK_PARENT_RELATIVE_BG); \
- } G_STMT_END
#endif /*GTK_CHECK_VERSION */
diff --git a/src/ui/frames.c b/src/ui/frames.c
index 27a5381..5ec5b3a 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -2004,32 +2004,64 @@ meta_frames_destroy_event (GtkWidget *widget,
return TRUE;
}
+#if !GTK_CHECK_VERSION(2,21,6)
+/* Copied from GDK */
+static cairo_pattern_t *
+gdk_window_get_background_pattern (GdkWindow *window)
+{
+ GdkWindowObject *private = (GdkWindowObject *) window;
+ cairo_pattern_t *pattern;
+
+ g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+ if (private->bg_pixmap == GDK_PARENT_RELATIVE_BG)
+ pattern = 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);
+ pattern = cairo_pattern_create_for_surface (surface);
+ cairo_surface_destroy (surface);
+
+ cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
+ cairo_pattern_set_user_data (pattern,
+ &key,
+ g_object_ref (private->bg_pixmap),
+ g_object_unref);
+ }
+ else
+ pattern =
+ cairo_pattern_create_rgb (private->bg_color.red / 65535.,
+ private->bg_color.green / 65535.,
+ private->bg_color.blue / 65535.);
+ }
+
+ return pattern;
+}
+#endif
+
static void
setup_bg_cr (cairo_t *cr, GdkWindow *window, int x_offset, int y_offset)
{
GdkWindow *parent = gdk_window_get_parent (window);
- GdkPixmap *back_pixmap;
- gboolean parent_relative;
+ cairo_pattern_t *bg_pattern;
- gdk_window_get_back_pixmap (window, &back_pixmap, &parent_relative);
- if (parent_relative && parent)
+ bg_pattern = gdk_window_get_background_pattern (window);
+ if (bg_pattern == NULL && parent)
{
gint window_x, window_y;
gdk_window_get_position (window, &window_x, &window_y);
setup_bg_cr (cr, parent, x_offset + window_x, y_offset + window_y);
}
- else if (back_pixmap)
+ else if (bg_pattern)
{
- gdk_cairo_set_source_pixmap (cr, back_pixmap, x_offset, y_offset);
- cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
- }
- else
- {
- GdkColor bg_color;
-
- gdk_window_get_background (window, &bg_color);
- gdk_cairo_set_source_color (cr, &bg_color);
+ cairo_translate (cr, - x_offset, - y_offset);
+ cairo_set_source (cr, bg_pattern);
+ cairo_translate (cr, x_offset, y_offset);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]