[PATCH v2 wayland] cursor: add wl_cursor_frame_and_duration
Derek Foreman
derekf at osg.samsung.com
Wed Mar 4 09:38:01 PST 2015
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>
---
differences from v1:
Add comment about 0 durations
document return of 0 duration as unchanging image
make sure duration calculation doesn't wrap around or return 0
cursor/wayland-cursor.c | 47 ++++++++++++++++++++++++++++++++++++++++++++---
cursor/wayland-cursor.h | 4 ++++
2 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/cursor/wayland-cursor.c b/cursor/wayland-cursor.c
index dba3b51..ffc3b57 100644
--- a/cursor/wayland-cursor.c
+++ b/cursor/wayland-cursor.c
@@ -458,28 +458,69 @@ 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 or
+ * zero if the cursor won't change.
*
* \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;
+ /* If there is a 0 delay in the image set then this
+ * loop breaks on it and we display that cursor until
+ * time % cursor->total_delay wraps again.
+ * Since a 0 delay is silly, and we've never actually
+ * seen one in a cursor file, we haven't bothered to
+ * "fix" this.
+ */
while (t - cursor->cursor.images[i]->delay < t)
t -= cursor->cursor.images[i++]->delay;
+ if (!duration)
+ return i;
+
+ }
+
+ /* Make sure we don't accidentally tell the caller this is
+ * a static cursor image.
+ */
+ if (t >= cursor->cursor.images[i]->delay)
+ *duration = 1;
+ else
+ *duration = cursor->cursor.images[i]->delay - t;
+
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
--
2.1.4
More information about the wayland-devel
mailing list