diff options
Diffstat (limited to 'src/ui/frames.c')
-rw-r--r-- | src/ui/frames.c | 119 |
1 files changed, 72 insertions, 47 deletions
diff --git a/src/ui/frames.c b/src/ui/frames.c index 7945a0c6..d8fe3cdc 100644 --- a/src/ui/frames.c +++ b/src/ui/frames.c @@ -2010,46 +2010,73 @@ meta_frames_destroy_event (GtkWidget *widget, return TRUE; } -/* Cut and paste from GDK */ -static GdkGC * -get_bg_gc (GdkWindow *window, int x_offset, int y_offset) +#if !GTK_CHECK_VERSION(2,21,6) +/* Copied from GDK */ +static cairo_surface_t * +_gdk_drawable_ref_cairo_surface (GdkDrawable *drawable) { - GdkWindow *parent = gdk_window_get_parent (window); - GdkPixmap *back_pixmap; - gboolean parent_relative; - guint gc_mask = 0; - GdkGCValues gc_values; + g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL); - gdk_window_get_back_pixmap (window, &back_pixmap, &parent_relative); - if (parent_relative && parent) - { - gint window_x, window_y; + return GDK_DRAWABLE_GET_CLASS (drawable)->ref_cairo_surface (drawable); +} - gdk_window_get_position (window, &window_x, &window_y); - return get_bg_gc (parent, - x_offset + window_x, - y_offset + window_y); - } - else if (back_pixmap) +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) { - gc_values.fill = GDK_TILED; - gc_values.tile = back_pixmap; - gc_values.ts_x_origin = x_offset; - gc_values.ts_y_origin = y_offset; - - gc_mask = GDK_GC_FILL | GDK_GC_TILE | GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN; + static cairo_user_data_key_t key; + cairo_surface_t *surface; - return gdk_gc_new_with_values (window, &gc_values, gc_mask); + 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 { - GdkColor bg_color; - GdkGC *gc = gdk_gc_new (window); + pattern = + cairo_pattern_create_rgb (private->bg_color.red / 65535., + private->bg_color.green / 65535., + private->bg_color.blue / 65535.); + } + + return pattern; +} +#endif - gdk_window_get_background (window, &bg_color); - gdk_gc_set_foreground (gc, &bg_color); +static void +setup_bg_cr (cairo_t *cr, GdkWindow *window, int x_offset, int y_offset) +{ + GdkWindow *parent = gdk_window_get_parent (window); + cairo_pattern_t *bg_pattern; + + bg_pattern = gdk_window_get_background_pattern (window); + if (bg_pattern == NULL && parent) + { + gint window_x, window_y; - return gc; + gdk_window_get_position (window, &window_x, &window_y); + setup_bg_cr (cr, parent, x_offset + window_x, y_offset + window_y); + } + else if (bg_pattern) + { + cairo_translate (cr, - x_offset, - y_offset); + cairo_set_source (cr, bg_pattern); + cairo_translate (cr, x_offset, y_offset); } } @@ -2058,12 +2085,16 @@ clear_backing (GdkPixmap *pixmap, GdkWindow *window, int xoffset, int yoffset) { - GdkGC *tmp_gc = get_bg_gc (window, xoffset, yoffset); + int width, height; + cairo_t *cr = gdk_cairo_create (pixmap); - gdk_draw_rectangle (pixmap, tmp_gc, TRUE, - 0, 0, -1, -1); - - g_object_unref (tmp_gc); + setup_bg_cr (cr, window, xoffset, yoffset); + + gdk_drawable_get_size (GDK_DRAWABLE (pixmap), &width, &height); + cairo_rectangle (cr, 0, 0, width, height); + cairo_fill (cr); + + cairo_destroy (cr); } /* Returns a pixmap with a piece of the windows frame painted on it. @@ -2226,10 +2257,10 @@ cached_pixels_draw (CachedPixels *pixels, GdkWindow *window, GdkRegion *region) { - GdkGC *gc; + cairo_t *cr; int i; - gc = gdk_gc_new (window); + cr = gdk_cairo_create (window); for (i = 0; i < 4; i++) { @@ -2238,16 +2269,15 @@ cached_pixels_draw (CachedPixels *pixels, if (piece->pixmap) { - gdk_draw_drawable (window, gc, piece->pixmap, - 0, 0, - piece->rect.x, piece->rect.y, - -1, -1); + gdk_cairo_set_source_pixmap (cr, piece->pixmap, + piece->rect.x, piece->rect.y); + cairo_paint (cr); subtract_from_region (region, piece->pixmap, piece->rect.x, piece->rect.y); } } - g_object_unref (gc); + cairo_destroy (cr); } static gboolean @@ -2556,11 +2586,6 @@ meta_frames_set_window_background (MetaFrames *frames, GTK_WIDGET (frames), &color); - /* Fill in color.pixel */ - - gdk_rgb_find_color (gtk_widget_get_colormap (GTK_WIDGET (frames)), - &color); - /* Set A in ARGB to window_background_alpha, if we have ARGB */ visual = gtk_widget_get_visual (GTK_WIDGET (frames)); |