summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-07-22 02:26:05 +0200
committerBenjamin Otte <otte@redhat.com>2010-08-10 21:02:29 +0200
commitf7608c33aca855e33d8087622f2780e4a23e5928 (patch)
treebc8385c22c5da999bcb903eef04bcc71e1f945c1 /gdk
parent9c026fb32e6034c8e770f7dde25bc0e77f7ef661 (diff)
downloadgtk+-f7608c33aca855e33d8087622f2780e4a23e5928.tar.gz
gdk: Move scratch GC handling to X11
... and implement it directly instead of using GdkGC, as GdkGC is about to be deleted, but we need this code.
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
*/