summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdkdraw.c46
-rw-r--r--gdk/gdkinternals.h3
-rw-r--r--gdk/gdkscreen.c20
-rw-r--r--gdk/gdkscreen.h2
-rw-r--r--gdk/x11/gdkgeometry-x11.c56
-rw-r--r--gdk/x11/gdkscreen-x11.c10
-rw-r--r--gdk/x11/gdkscreen-x11.h3
7 files changed, 57 insertions, 83 deletions
diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c
index 3c8152ea62..b7d5bee631 100644
--- a/gdk/gdkdraw.c
+++ b/gdk/gdkdraw.c
@@ -269,52 +269,6 @@ _gdk_drawable_ref_cairo_surface (GdkDrawable *drawable)
/************************************************************************/
-/**
- * _gdk_drawable_get_subwindow_scratch_gc:
- * @drawable: A #GdkDrawable
- *
- * Returns a #GdkGC suitable for drawing on @drawable. The #GdkGC has
- * the standard values for @drawable, except for the graphics_exposures
- * field which is %TRUE and the subwindow mode which is %GDK_INCLUDE_INFERIORS.
- *
- * The foreground color of the returned #GdkGC is undefined. The #GdkGC
- * must not be altered in any way, except to change its foreground color.
- *
- * Return value: A #GdkGC suitable for drawing on @drawable
- *
- * Since: 2.18
- **/
-GdkGC *
-_gdk_drawable_get_subwindow_scratch_gc (GdkDrawable *drawable)
-{
- GdkScreen *screen;
- gint depth;
-
- g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
-
- screen = gdk_drawable_get_screen (drawable);
-
- g_return_val_if_fail (!screen->closed, NULL);
-
- depth = gdk_drawable_get_depth (drawable) - 1;
-
- if (!screen->subwindow_gcs[depth])
- {
- GdkGCValues values;
- GdkGCValuesMask mask;
-
- values.graphics_exposures = TRUE;
- values.subwindow_mode = GDK_INCLUDE_INFERIORS;
- mask = GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW;
-
- screen->subwindow_gcs[depth] =
- gdk_gc_new_with_values (drawable, &values, mask);
- }
-
- return screen->subwindow_gcs[depth];
-}
-
-
/*
* _gdk_drawable_get_source_drawable:
* @drawable: a #GdkDrawable
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index bfd9775a07..33e4958e9e 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -324,9 +324,6 @@ cairo_surface_t * _gdk_drawable_create_cairo_surface (GdkDrawable *drawable,
int width,
int height);
-/* GC caching */
-GdkGC *_gdk_drawable_get_subwindow_scratch_gc (GdkDrawable *drawable);
-
/*************************************
* Interfaces used by windowing code *
*************************************/
diff --git a/gdk/gdkscreen.c b/gdk/gdkscreen.c
index 174c0d58c9..ac56f203d0 100644
--- a/gdk/gdkscreen.c
+++ b/gdk/gdkscreen.c
@@ -29,7 +29,6 @@
#include "gdkintl.h"
-static void gdk_screen_dispose (GObject *object);
static void gdk_screen_finalize (GObject *object);
static void gdk_screen_set_property (GObject *object,
guint prop_id,
@@ -64,7 +63,6 @@ gdk_screen_class_init (GdkScreenClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = gdk_screen_dispose;
object_class->finalize = gdk_screen_finalize;
object_class->set_property = gdk_screen_set_property;
object_class->get_property = gdk_screen_get_property;
@@ -156,24 +154,6 @@ gdk_screen_init (GdkScreen *screen)
}
static void
-gdk_screen_dispose (GObject *object)
-{
- GdkScreen *screen = GDK_SCREEN (object);
- gint i;
-
- for (i = 0; i < 32; ++i)
- {
- if (screen->subwindow_gcs[i])
- {
- g_object_unref (screen->subwindow_gcs[i]);
- screen->subwindow_gcs[i] = NULL;
- }
- }
-
- G_OBJECT_CLASS (gdk_screen_parent_class)->dispose (object);
-}
-
-static void
gdk_screen_finalize (GObject *object)
{
GdkScreen *screen = GDK_SCREEN (object);
diff --git a/gdk/gdkscreen.h b/gdk/gdkscreen.h
index 544b430f25..0f0e4ce91f 100644
--- a/gdk/gdkscreen.h
+++ b/gdk/gdkscreen.h
@@ -49,8 +49,6 @@ struct _GdkScreen
guint GSEAL (closed) : 1;
- GdkGC *GSEAL (subwindow_gcs[32]);
-
cairo_font_options_t *GSEAL (font_options);
double GSEAL (resolution); /* pixels/points scale factor for fonts */
};
diff --git a/gdk/x11/gdkgeometry-x11.c b/gdk/x11/gdkgeometry-x11.c
index 4ddf5b422b..de6ac462e7 100644
--- a/gdk/x11/gdkgeometry-x11.c
+++ b/gdk/x11/gdkgeometry-x11.c
@@ -225,6 +225,47 @@ gdk_window_queue (GdkWindow *window,
g_queue_push_tail (display_x11->translate_queue, item);
}
+static GC
+_get_scratch_gc (GdkWindowObject *window, cairo_region_t *clip_region)
+{
+ GdkScreenX11 *screen;
+ XRectangle *rectangles;
+ gint n_rects;
+ gint depth;
+
+ screen = GDK_SCREEN_X11 (gdk_drawable_get_screen (GDK_DRAWABLE (window)));
+ depth = gdk_drawable_get_depth (GDK_DRAWABLE (window)) - 1;
+
+ if (!screen->subwindow_gcs[depth])
+ {
+ XGCValues values;
+
+ values.graphics_exposures = True;
+ values.subwindow_mode = IncludeInferiors;
+
+ screen->subwindow_gcs[depth] = XCreateGC (screen->xdisplay,
+ GDK_WINDOW_XID (window),
+ GCSubwindowMode | GCGraphicsExposures,
+ &values);
+ }
+
+ _gdk_region_get_xrectangles (clip_region,
+ 0, 0,
+ &rectangles,
+ &n_rects);
+
+ XSetClipRectangles (screen->xdisplay,
+ screen->subwindow_gcs[depth],
+ 0, 0,
+ rectangles, n_rects,
+ YXBanded);
+
+ g_free (rectangles);
+ return screen->subwindow_gcs[depth];
+}
+
+
+
void
_gdk_x11_window_translate (GdkWindow *window,
cairo_region_t *area,
@@ -232,7 +273,7 @@ _gdk_x11_window_translate (GdkWindow *window,
gint dy)
{
GdkWindowQueueItem *item;
- GdkGC *tmp_gc;
+ GC xgc;
GdkRectangle extents;
GdkWindowObject *private, *impl;
int px, py;
@@ -255,17 +296,10 @@ _gdk_x11_window_translate (GdkWindow *window,
cairo_region_get_extents (area, &extents);
- tmp_gc = _gdk_drawable_get_subwindow_scratch_gc ((GdkWindow *)private);
- gdk_gc_set_clip_region (tmp_gc, area);
+ xgc = _get_scratch_gc (impl, area);
cairo_region_translate (area, -dx, -dy); /* Move to source region */
- /* Ensure that the gc is flushed so that we get the right
- serial from NextRequest in gdk_window_queue, i.e. the
- the serial for the XCopyArea, not the ones from flushing
- the gc. */
- _gdk_x11_gc_flush (tmp_gc);
-
item = g_new (GdkWindowQueueItem, 1);
item->type = GDK_WINDOW_QUEUE_TRANSLATE;
item->u.translate.area = cairo_region_copy (area);
@@ -276,12 +310,10 @@ _gdk_x11_window_translate (GdkWindow *window,
XCopyArea (GDK_WINDOW_XDISPLAY (impl),
GDK_DRAWABLE_IMPL_X11 (private->impl)->xid,
GDK_DRAWABLE_IMPL_X11 (impl->impl)->xid,
- GDK_GC_GET_XGC (tmp_gc),
+ xgc,
extents.x - dx, extents.y - dy,
extents.width, extents.height,
extents.x, extents.y);
-
- gdk_gc_set_clip_region (tmp_gc, NULL);
}
gboolean
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index 7c20a0e917..44abed2cc3 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
@@ -297,6 +297,16 @@ static void
gdk_screen_x11_dispose (GObject *object)
{
GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (object);
+ int i;
+
+ for (i = 0; i < 32; ++i)
+ {
+ if (screen_x11->subwindow_gcs[i])
+ {
+ XFreeGC (screen_x11->xdisplay, screen_x11->subwindow_gcs[i]);
+ screen_x11->subwindow_gcs[i] = 0;
+ }
+ }
_gdk_screen_x11_events_uninit (GDK_SCREEN (object));
diff --git a/gdk/x11/gdkscreen-x11.h b/gdk/x11/gdkscreen-x11.h
index c066f9f930..98cca0e2a6 100644
--- a/gdk/x11/gdkscreen-x11.h
+++ b/gdk/x11/gdkscreen-x11.h
@@ -95,6 +95,9 @@ struct _GdkScreenX11
GdkX11Monitor *monitors;
gint primary_monitor;
+ /* cache for window->translate vfunc */
+ GC subwindow_gcs[32];
+
/* Xft resources for the display, used for default values for
* the Xft/ XSETTINGS
*/