summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-04-03 11:21:27 -0400
committerKristian Høgsberg <krh@bitplanet.net>2012-04-03 11:22:06 -0400
commit16626282fdb8f97188caea7ed8705cd66f062a31 (patch)
treea04c7b2b8077503bce38190aab9fefe23c9eb0c7
parent919fbf0fee39a5e0636569bfbca9e45af790332d (diff)
clients: Use new shm interface
-rw-r--r--clients/screenshot.c8
-rw-r--r--clients/simple-shm.c8
-rw-r--r--clients/simple-touch.c9
-rw-r--r--clients/window.c62
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;
}