clients: Use new shm interface
authorKristian Høgsberg <krh@bitplanet.net>
Tue, 3 Apr 2012 15:21:27 +0000 (11:21 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 3 Apr 2012 15:22:06 +0000 (11:22 -0400)
clients/screenshot.c
clients/simple-shm.c
clients/simple-touch.c
clients/window.c

index 8b1edf6..6cc2ebb 100644 (file)
@@ -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;
 
index 7026af9..d1fe0c6 100644 (file)
@@ -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;
index 0e2bac6..c3ee877 100644 (file)
@@ -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);
 }
index 74ddedd..3e949c2 100644 (file)
@@ -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;
 }