summaryrefslogtreecommitdiff
path: root/src/cairo-xlib-surface.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-09-13 15:25:49 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-09-13 15:30:27 +0100
commit6ee216000ae487492fceda0fb3fecb20bb9a41f6 (patch)
tree657b5479c21cc0b7338c64c3571f141f73595b23 /src/cairo-xlib-surface.c
parente2c4bb9465e6261eb79f24af52d339df0b563b55 (diff)
downloadcairo-6ee216000ae487492fceda0fb3fecb20bb9a41f6.tar.gz
xlib: Explicitly discard the fallback shm pixmap upon user modification
If the user changes the size of the underlying drawable, we much make sure that we discard the current ShmPixmap in order to create a new fallback pixmap of the correct size next time. Reported-by: Weng Xuetian <wengxt@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-xlib-surface.c')
-rw-r--r--src/cairo-xlib-surface.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c
index 913589f5c..4d1ef908a 100644
--- a/src/cairo-xlib-surface.c
+++ b/src/cairo-xlib-surface.c
@@ -358,6 +358,22 @@ _cairo_xlib_surface_create_similar (void *abstract_src,
return &surface->base;
}
+static void
+_cairo_xlib_surface_discard_shm (cairo_xlib_surface_t *surface)
+{
+ if (surface->shm == NULL)
+ return;
+
+ /* Force the flush for an external surface */
+ if (!surface->owns_pixmap)
+ cairo_surface_flush (surface->shm);
+
+ cairo_surface_finish (surface->shm);
+ cairo_surface_destroy (surface->shm);
+
+ surface->shm = NULL;
+}
+
static cairo_status_t
_cairo_xlib_surface_finish (void *abstract_surface)
{
@@ -378,13 +394,7 @@ _cairo_xlib_surface_finish (void *abstract_surface)
if (surface->picture)
XRenderFreePicture (display->display, surface->picture);
- if (surface->shm) {
- /* Force the flush for an external surface */
- if (!surface->owns_pixmap)
- cairo_surface_flush (surface->shm);
- cairo_surface_finish (surface->shm);
- cairo_surface_destroy (surface->shm);
- }
+ _cairo_xlib_surface_discard_shm (surface);
if (surface->owns_pixmap)
XFreePixmap (display->display, surface->drawable);
@@ -2048,6 +2058,9 @@ cairo_xlib_surface_set_size (cairo_surface_t *abstract_surface,
return;
}
+ if (surface->width == width && surface->height == height)
+ return;
+
if (! valid_size (width, height)) {
_cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_INVALID_SIZE));
@@ -2060,9 +2073,12 @@ cairo_xlib_surface_set_size (cairo_surface_t *abstract_surface,
return;
}
+ _cairo_xlib_surface_discard_shm (surface);
+
surface->width = width;
surface->height = height;
}
+
/**
* cairo_xlib_surface_set_drawable:
* @surface: a #cairo_surface_t for the XLib backend
@@ -2142,8 +2158,12 @@ cairo_xlib_surface_set_drawable (cairo_surface_t *abstract_surface,
surface->drawable = drawable;
}
- surface->width = width;
- surface->height = height;
+ if (surface->width != width || surface->height != height) {
+ _cairo_xlib_surface_discard_shm (surface);
+
+ surface->width = width;
+ surface->height = height;
+ }
}
/**