[PATCH 3/3] wayland-cursor: Adapt to new shm pool helper functions
Andre Heider
a.heider at gmail.com
Sat Aug 4 06:22:55 PDT 2012
---
cursor/wayland-cursor.c | 115 ++++++++++-------------------------------------
1 file changed, 24 insertions(+), 91 deletions(-)
diff --git a/cursor/wayland-cursor.c b/cursor/wayland-cursor.c
index 10e8f62..8e467f6 100644
--- a/cursor/wayland-cursor.c
+++ b/cursor/wayland-cursor.c
@@ -31,93 +31,12 @@
#include "../shared/os-compatibility.h"
-struct shm_pool {
- struct wl_shm_pool *pool;
- int fd;
- unsigned int size;
- unsigned int used;
- char *data;
-};
-
-static struct shm_pool *
-shm_pool_create(struct wl_shm *shm, int size)
-{
- struct shm_pool *pool;
-
- pool = malloc(sizeof *pool);
- if (!pool)
- return NULL;
-
- pool->fd = os_create_anonymous_file(size);
- if (pool->fd < 0)
- goto err_free;
-
- pool->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
- pool->fd, 0);
-
- if (pool->data == MAP_FAILED)
- goto err_close;
-
- pool->pool = wl_shm_create_pool(shm, pool->fd, size);
- pool->size = size;
- pool->used = 0;
-
- return pool;
-
-err_close:
- close(pool->fd);
-err_free:
- free(pool);
- return NULL;
-}
-
-static int
-shm_pool_resize(struct shm_pool *pool, int size)
-{
- if (ftruncate(pool->fd, size) < 0)
- return 0;
-
- wl_shm_pool_resize(pool->pool, size);
-
- munmap(pool->data, pool->size);
-
- pool->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
- pool->fd, 0);
- pool->size = size;
-
- return 1;
-}
-
-static int
-shm_pool_allocate(struct shm_pool *pool, int size)
-{
- int offset;
-
- if (pool->used + size > pool->size)
- if (!shm_pool_resize(pool, 2 * pool->size + size))
- return -1;
-
- offset = pool->used;
- pool->used += size;
-
- return offset;
-}
-
-static void
-shm_pool_destroy(struct shm_pool *pool)
-{
- munmap(pool->data, pool->size);
- wl_shm_pool_destroy(pool->pool);
- close(pool->fd);
- free(pool);
-}
-
-
struct wl_cursor_theme {
unsigned int cursor_count;
struct wl_cursor **cursors;
struct wl_shm *shm;
- struct shm_pool *pool;
+ struct wl_shm_pool_helper *pool;
+ uint32_t pool_size;
char *name;
int size;
};
@@ -145,10 +64,12 @@ wl_cursor_image_get_buffer(struct wl_cursor_image *_img)
{
struct cursor_image *image = (struct cursor_image *) _img;
struct wl_cursor_theme *theme = image->theme;
+ struct wl_shm_pool *pool;
if (!image->buffer) {
+ pool = wl_shm_pool_helper_get_pool(theme->pool);
image->buffer =
- wl_shm_pool_create_buffer(theme->pool->pool,
+ wl_shm_pool_create_buffer(pool,
image->offset,
_img->width, _img->height,
_img->width * 4,
@@ -187,7 +108,8 @@ wl_cursor_create_from_xcursor_images(XcursorImages *images,
{
struct cursor *cursor;
struct cursor_image *image;
- int i, size;
+ int i, size, offset, resize;
+ void *p;
cursor = malloc(sizeof *cursor);
if (!cursor)
@@ -220,9 +142,21 @@ wl_cursor_create_from_xcursor_images(XcursorImages *images,
/* copy pixels to shm pool */
size = image->image.width * image->image.height * 4;
- image->offset = shm_pool_allocate(theme->pool, size);
- memcpy(theme->pool->data + image->offset,
- images->images[i]->pixels, size);
+ p = wl_shm_pool_helper_allocate(theme->pool, size, &offset);
+ if (!p) {
+ resize = 2 * wl_shm_pool_helper_get_size(theme->pool) +
+ size;
+ if (!wl_shm_pool_helper_resize(theme->pool, resize)) {
+ free(cursor);
+ return NULL;
+ }
+
+ p = wl_shm_pool_helper_allocate(theme->pool, size,
+ &offset);
+ }
+
+ image->offset = offset;
+ memcpy(p, images->images[i]->pixels, size);
}
return &cursor->cursor;
@@ -280,8 +214,7 @@ wl_cursor_theme_load(const char *name, int size, struct wl_shm *shm)
theme->cursor_count = 0;
theme->cursors = NULL;
- theme->pool =
- shm_pool_create(shm, size * size * 4);
+ theme->pool = wl_shm_pool_helper_create(shm, size * size * 4);
if (!theme->pool) {
free(theme->name);
free(theme);
@@ -305,7 +238,7 @@ wl_cursor_theme_destroy(struct wl_cursor_theme *theme)
for (i = 0; i < theme->cursor_count; i++)
wl_cursor_destroy(theme->cursors[i]);
- shm_pool_destroy(theme->pool);
+ wl_shm_pool_helper_destroy(theme->pool, 1);
free(theme->cursors);
free(theme);
--
1.7.10.4
More information about the wayland-devel
mailing list