diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-05-08 18:20:11 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-05-08 18:24:48 +0100 |
commit | 9d863cd3942c3086c24d67305f7a5892604d0eeb (patch) | |
tree | a8251b12822c03c7b05926b3d45bd46f6c5045e6 | |
parent | 448d3571088463fc61641badcdfdc8c0002ae12a (diff) |
xcb: Find the correct xcb_screen_t for faking Screen
When choosing the xcb_screen_t to use for the xlib-xcb backing surface,
it helps if it matches the screen used to generate similar surfaces and
snapshots - otherwise we end up pulling the image back from the XServer
every time we want to use the Picture.
-rw-r--r-- | src/cairo-xlib-xcb-surface.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/cairo-xlib-xcb-surface.c b/src/cairo-xlib-xcb-surface.c index 4db129eb..7e674bf0 100644 --- a/src/cairo-xlib-xcb-surface.c +++ b/src/cairo-xlib-xcb-surface.c @@ -342,6 +342,21 @@ cairo_xlib_surface_create_for_bitmap (Display *dpy, } #if CAIRO_HAS_XLIB_XRENDER_SURFACE +static xcb_screen_t * +_cairo_xcb_screen_from_root (xcb_connection_t *connection, + xcb_window_t id) +{ + xcb_depth_iterator_t d; + xcb_screen_iterator_t s; + + s = xcb_setup_roots_iterator (xcb_get_setup (connection)); + for (; s.rem; xcb_screen_next (&s)) { + if (s.data->root == id) + return s.data; + } + + return NULL; +} cairo_surface_t * cairo_xlib_surface_create_with_xrender_format (Display *dpy, Drawable drawable, @@ -351,6 +366,8 @@ cairo_xlib_surface_create_with_xrender_format (Display *dpy, int height) { xcb_render_pictforminfo_t xcb_format; + xcb_connection_t *connection; + xcb_screen_t *screen; xcb_format.id = format->id; xcb_format.type = format->type; @@ -365,9 +382,11 @@ cairo_xlib_surface_create_with_xrender_format (Display *dpy, xcb_format.direct.alpha_mask = format->direct.alphaMask; xcb_format.colormap = format->colormap; + connection = XGetXCBConnection (dpy); + screen = _cairo_xcb_screen_from_root (connection, (xcb_window_t) scr->root); + return _cairo_xlib_xcb_surface_create (dpy, scr, NULL, format, - cairo_xcb_surface_create_with_xrender_format (XGetXCBConnection (dpy), - (xcb_screen_t *) scr, + cairo_xcb_surface_create_with_xrender_format (connection, screen, drawable, &xcb_format, width, height)); |