[PATCH wayland] cursor: add wl_cursor_frame_and_duration
Pekka Paalanen
ppaalanen at gmail.com
Tue Mar 3 23:50:16 PST 2015
On Tue, 3 Mar 2015 15:24:13 -0600
Derek Foreman <derekf at osg.samsung.com> wrote:
> It's useful to know how long the current cursor frame should be displayed
> so we can wait that long to change it.
>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>
> In a follow up weston patch I use this to let toytoolkit set the cursor
> with a timerfd instead of using a frame callback.
>
> cursor/wayland-cursor.c | 29 ++++++++++++++++++++++++++---
> cursor/wayland-cursor.h | 4 ++++
> 2 files changed, 30 insertions(+), 3 deletions(-)
>
> diff --git a/cursor/wayland-cursor.c b/cursor/wayland-cursor.c
> index dba3b51..d5c8221 100644
> --- a/cursor/wayland-cursor.c
> +++ b/cursor/wayland-cursor.c
> @@ -458,22 +458,28 @@ wl_cursor_theme_get_cursor(struct wl_cursor_theme *theme,
> }
>
> /** Find the frame for a given elapsed time in a cursor animation
> + * as well as the time left until next cursor change.
> *
> * \param cursor The cursor
> - * \param time Elapsed time since the beginning of the animation
> + * \param time Elapsed time in ms since the beginning of the animation
> + * \param duration pointer to uint32_t to store time left for this image
I think you'd want to document the special duration time of zero
meaning "forever", right?
> *
> * \return The index of the image that should be displayed for the
> * given time in the cursor animation.
> */
> WL_EXPORT int
> -wl_cursor_frame(struct wl_cursor *_cursor, uint32_t time)
> +wl_cursor_frame_and_duration(struct wl_cursor *_cursor, uint32_t time,
> + uint32_t *duration)
> {
> struct cursor *cursor = (struct cursor *) _cursor;
> uint32_t t;
> int i;
>
> - if (cursor->cursor.image_count == 1)
> + if (cursor->cursor.image_count == 1) {
> + if (*duration)
> + duration = 0;
> return 0;
> + }
>
> i = 0;
> t = time % cursor->total_delay;
> @@ -481,5 +487,22 @@ wl_cursor_frame(struct wl_cursor *_cursor, uint32_t time)
> while (t - cursor->cursor.images[i]->delay < t)
> t -= cursor->cursor.images[i++]->delay;
>
> + if (duration)
> + *duration = cursor->cursor.images[i]->delay - t;
This can never produce zero duration, right?
I think it can't, and it's certainly logical to never produce zero, but
I didn't rigorously think it through. So, we don't accidentally hit the
special zero here.
> +
> return i;
> }
> +
> +/** Find the frame for a given elapsed time in a cursor animation
> + *
> + * \param cursor The cursor
> + * \param time Elapsed time in ms since the beginning of the animation
> + *
> + * \return The index of the image that should be displayed for the
> + * given time in the cursor animation.
> + */
> +WL_EXPORT int
> +wl_cursor_frame(struct wl_cursor *_cursor, uint32_t time)
> +{
> + return wl_cursor_frame_and_duration(_cursor, time, NULL);
> +}
> diff --git a/cursor/wayland-cursor.h b/cursor/wayland-cursor.h
> index c7548ae..c3884a0 100644
> --- a/cursor/wayland-cursor.h
> +++ b/cursor/wayland-cursor.h
> @@ -63,6 +63,10 @@ wl_cursor_image_get_buffer(struct wl_cursor_image *image);
> int
> wl_cursor_frame(struct wl_cursor *cursor, uint32_t time);
>
> +int
> +wl_cursor_frame_and_duration(struct wl_cursor *cursor, uint32_t time,
> + uint32_t *duration);
> +
> #ifdef __cplusplus
> }
> #endif
With that one documentation bit fixed:
Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Thanks,
pq
More information about the wayland-devel
mailing list