This makes sense to me. Reviewed-by: Jasper St. Pierre <jstpie...@mecheye.net>
On Mon, May 25, 2015 at 12:15 PM, Rui Matos <tiagoma...@gmail.com> wrote: > In some extreme cases with animated cursors at a high frame rate we > could end up filling the wl_display outgoing buffer and end up with > wl_display_flush() failing. > > In any case, using the frame callback to throttle ourselves is the > right thing to do. > > Signed-off-by: Rui Matos <tiagoma...@gmail.com> > --- > hw/xwayland/xwayland-cursor.c | 20 ++++++++++++++++++++ > hw/xwayland/xwayland-input.c | 2 ++ > hw/xwayland/xwayland.h | 1 + > 3 files changed, 23 insertions(+) > > diff --git a/hw/xwayland/xwayland-cursor.c b/hw/xwayland/xwayland-cursor.c > index 5a9d1fe..3ba5ad6 100644 > --- a/hw/xwayland/xwayland-cursor.c > +++ b/hw/xwayland/xwayland-cursor.c > @@ -82,6 +82,19 @@ xwl_unrealize_cursor(DeviceIntPtr device, ScreenPtr > screen, CursorPtr cursor) > return xwl_shm_destroy_pixmap(pixmap); > } > > +static void > +frame_callback(void *data, > + struct wl_callback *callback, > + uint32_t time) > +{ > + struct xwl_seat *xwl_seat = data; > + xwl_seat->cursor_frame_cb = NULL; > +} > + > +static const struct wl_callback_listener frame_listener = { > + frame_callback > +}; > + > void > xwl_seat_set_cursor(struct xwl_seat *xwl_seat) > { > @@ -98,6 +111,9 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) > return; > } > > + if (xwl_seat->cursor_frame_cb) > + return; > + > cursor = xwl_seat->x_cursor; > pixmap = dixGetPrivate(&cursor->devPrivates, &xwl_cursor_private_key); > stride = cursor->bits->width * 4; > @@ -117,6 +133,10 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) > wl_surface_damage(xwl_seat->cursor, 0, 0, > xwl_seat->x_cursor->bits->width, > xwl_seat->x_cursor->bits->height); > + > + xwl_seat->cursor_frame_cb = wl_surface_frame(xwl_seat->cursor); > + wl_callback_add_listener(xwl_seat->cursor_frame_cb, &frame_listener, > xwl_seat); > + > wl_surface_commit(xwl_seat->cursor); > } > > diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c > index 5230d8c..a3142f4 100644 > --- a/hw/xwayland/xwayland-input.c > +++ b/hw/xwayland/xwayland-input.c > @@ -586,6 +586,8 @@ xwl_seat_destroy(struct xwl_seat *xwl_seat) > RemoveDevice(xwl_seat->keyboard, FALSE); > wl_seat_destroy(xwl_seat->seat); > wl_surface_destroy(xwl_seat->cursor); > + if (xwl_seat->cursor_frame_cb) > + wl_callback_destroy(xwl_seat->cursor_frame_cb); > wl_array_release(&xwl_seat->keys); > free(xwl_seat); > } > diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h > index bfffa71..92d6d6e 100644 > --- a/hw/xwayland/xwayland.h > +++ b/hw/xwayland/xwayland.h > @@ -116,6 +116,7 @@ struct xwl_seat { > struct wl_keyboard *wl_keyboard; > struct wl_array keys; > struct wl_surface *cursor; > + struct wl_callback *cursor_frame_cb; > struct xwl_window *focus_window; > uint32_t id; > uint32_t pointer_enter_serial; > -- > 2.4.0 > > _______________________________________________ > xorg-de...@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel -- Jasper _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel