From 16626282fdb8f97188caea7ed8705cd66f062a31 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 3 Apr 2012 11:21:27 -0400 Subject: [PATCH] clients: Use new shm interface --- clients/screenshot.c | 8 ++++--- clients/simple-shm.c | 8 ++++--- clients/simple-touch.c | 9 +++++--- clients/window.c | 62 +++++++++++++++++++++++++++++++------------------- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/clients/screenshot.c b/clients/screenshot.c index 8b1edf6..6cc2ebb 100644 --- a/clients/screenshot.c +++ b/clients/screenshot.c @@ -89,6 +89,7 @@ static struct wl_buffer * create_shm_buffer(int width, int height, void **data_out) { char filename[] = "/tmp/wayland-shm-XXXXXX"; + struct wl_shm_pool *pool; struct wl_buffer *buffer; int fd, size, stride; void *data; @@ -115,10 +116,11 @@ create_shm_buffer(int width, int height, void **data_out) return NULL; } - buffer = wl_shm_create_buffer(shm, fd, width, height, stride, - WL_SHM_FORMAT_XRGB8888); - + pool = wl_shm_create_pool(shm, fd, size); close(fd); + buffer = wl_shm_pool_create_buffer(pool, 0, width, height, stride, + WL_SHM_FORMAT_XRGB8888); + wl_shm_pool_destroy(pool); *data_out = data; diff --git a/clients/simple-shm.c b/clients/simple-shm.c index 7026af9..d1fe0c6 100644 --- a/clients/simple-shm.c +++ b/clients/simple-shm.c @@ -57,6 +57,7 @@ create_shm_buffer(struct display *display, int width, int height, uint32_t format, void **data_out) { char filename[] = "/tmp/wayland-shm-XXXXXX"; + struct wl_shm_pool *pool; struct wl_buffer *buffer; int fd, size, stride; void *data; @@ -83,9 +84,10 @@ create_shm_buffer(struct display *display, return NULL; } - buffer = wl_shm_create_buffer(display->shm, fd, - width, height, stride, format); - + pool = wl_shm_create_pool(display->shm, fd, size); + buffer = wl_shm_pool_create_buffer(pool, 0, + width, height, stride, format); + wl_shm_pool_destroy(pool); close(fd); *data_out = data; diff --git a/clients/simple-touch.c b/clients/simple-touch.c index 0e2bac6..c3ee877 100644 --- a/clients/simple-touch.c +++ b/clients/simple-touch.c @@ -50,6 +50,7 @@ struct touch { static void create_shm_buffer(struct touch *touch) { + struct wl_shm_pool *pool; char filename[] = "/tmp/wayland-shm-XXXXXX"; int fd, size, stride; @@ -76,10 +77,12 @@ create_shm_buffer(struct touch *touch) exit(1); } + pool = wl_shm_create_pool(touch->shm, fd, size); touch->buffer = - wl_shm_create_buffer(touch->shm, fd, - touch->width, touch->height, stride, - WL_SHM_FORMAT_ARGB8888); + wl_shm_pool_create_buffer(pool, 0, + touch->width, touch->height, stride, + WL_SHM_FORMAT_ARGB8888); + wl_shm_pool_destroy(pool); close(fd); } diff --git a/clients/window.c b/clients/window.c index 74ddedd..3e949c2 100644 --- a/clients/window.c +++ b/clients/window.c @@ -461,44 +461,59 @@ shm_surface_data_destroy(void *p) munmap(data->map, data->length); } -static cairo_surface_t * -display_create_shm_surface(struct display *display, - struct rectangle *rectangle, uint32_t flags) +static struct wl_shm_pool * +make_shm_pool(struct display *display, int size, void **data) { - struct shm_surface_data *data; - uint32_t format; - cairo_surface_t *surface; - int stride, fd; char filename[] = "/tmp/wayland-shm-XXXXXX"; + struct wl_shm_pool *pool; + int fd; - data = malloc(sizeof *data); - if (data == NULL) - return NULL; - - stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, - rectangle->width); - data->length = stride * rectangle->height; fd = mkstemp(filename); if (fd < 0) { fprintf(stderr, "open %s failed: %m\n", filename); return NULL; } - if (ftruncate(fd, data->length) < 0) { + if (ftruncate(fd, size) < 0) { fprintf(stderr, "ftruncate failed: %m\n"); close(fd); return NULL; } - data->map = mmap(NULL, data->length, - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); unlink(filename); - if (data->map == MAP_FAILED) { + if (*data == MAP_FAILED) { fprintf(stderr, "mmap failed: %m\n"); close(fd); return NULL; } + pool = wl_shm_create_pool(display->shm, fd, size); + + close(fd); + + return pool; +} + +static cairo_surface_t * +display_create_shm_surface(struct display *display, + struct rectangle *rectangle, uint32_t flags) +{ + struct shm_surface_data *data; + struct wl_shm_pool *pool; + uint32_t format; + cairo_surface_t *surface; + int stride; + + data = malloc(sizeof *data); + if (data == NULL) + return NULL; + + stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, + rectangle->width); + data->length = stride * rectangle->height; + pool = make_shm_pool(display, data->length, &data->map); + surface = cairo_image_surface_create_for_data (data->map, CAIRO_FORMAT_ARGB32, rectangle->width, @@ -513,13 +528,12 @@ display_create_shm_surface(struct display *display, else format = WL_SHM_FORMAT_ARGB8888; - data->data.buffer = wl_shm_create_buffer(display->shm, - fd, - rectangle->width, - rectangle->height, - stride, format); + data->data.buffer = wl_shm_pool_create_buffer(pool, 0, + rectangle->width, + rectangle->height, + stride, format); - close(fd); + wl_shm_pool_destroy(pool); return surface; } -- 2.7.4