[PATCH 3/3] wayland-cursor: Adapt to new shm pool helper functions
Ander Conselvan de Oliveira
conselvan2 at gmail.com
Tue Aug 7 05:15:24 PDT 2012
On 08/04/2012 04:22 PM, Andre Heider wrote:
> ---
> 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
[...]
> @@ -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;
> + }
I like to have the allocate function try to resize the pool if needed.
All users except wayland-cursor allocate a pool large enough, so they
should never reach and on the other hand its convenient not to have to
write the resize logic every time one needs it.
I would go for having the resize by default, and if there is a use case
where we really don't want to resize, we could have something like:
enum wl_shm_mapping_resize_behavior {
/* never try to resize */
WL_SHM_MAPPING_RESIZE_NEVER,
/* try to resize to current size + new allocation size */
WL_SHM_MAPPING_RESIZE_ADD_SIZE,
/* double the allocation size until it is large enough */
WL_SHM_MAPPING_RESIZE_DOUBLE,
...
};
void
wl_shm_mapping_set_resize_behavior(struct wl_shm_mapping *mapping,
enum wl_shm_mapping_resize_behavior behavior);
Or maybe have that as flags for wl_shm_mapping_create(). But the former
is a change that can be done in the future without breaking the API.
Ander
> +
> + 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);
>
More information about the wayland-devel
mailing list