[PATCH v2 weston] input: Don't recreate the cursor sprite when only the hotspot changes
Pekka Paalanen
ppaalanen at gmail.com
Thu Mar 26 01:25:08 PDT 2015
On Mon, 23 Mar 2015 10:55:32 -0500
Derek Foreman <derekf at osg.samsung.com> wrote:
> Currently we unmap and re-map the cursor when the hotspot changes which
> causes spurious enter/leave events.
>
> This changes the pointer_set_cursor() logic to avoid this.
>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>
> Remove comments and unnecessary variable.
>
> src/input.c | 36 ++++++++++++++++++++----------------
> 1 file changed, 20 insertions(+), 16 deletions(-)
>
> diff --git a/src/input.c b/src/input.c
> index 469d5ce..142c670 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -1648,31 +1648,35 @@ pointer_set_cursor(struct wl_client *client, struct wl_resource *resource,
> if (pointer->focus_serial - serial > UINT32_MAX / 2)
> return;
>
> - if (surface) {
> - if (weston_surface_set_role(surface, "wl_pointer-cursor",
> - resource,
> - WL_POINTER_ERROR_ROLE) < 0)
> - return;
> + if (!surface) {
> + if (pointer->sprite)
> + pointer_unmap_sprite(pointer);
> + return;
> }
>
> if (pointer->sprite && pointer->sprite->surface == surface &&
> pointer->hotspot_x == x && pointer->hotspot_y == y)
> return;
>
> - if (pointer->sprite)
> - pointer_unmap_sprite(pointer);
> + if (!pointer->sprite || pointer->sprite->surface != surface) {
> + if (weston_surface_set_role(surface, "wl_pointer-cursor",
> + resource,
> + WL_POINTER_ERROR_ROLE) < 0)
> + return;
>
> - if (!surface)
> - return;
> + if (pointer->sprite)
> + pointer_unmap_sprite(pointer);
>
> - wl_signal_add(&surface->destroy_signal,
> - &pointer->sprite_destroy_listener);
> + wl_signal_add(&surface->destroy_signal,
> + &pointer->sprite_destroy_listener);
> +
> + surface->configure = pointer_cursor_surface_configure;
> + surface->configure_private = pointer;
> + weston_surface_set_label_func(surface,
> + pointer_cursor_surface_get_label);
> + pointer->sprite = weston_view_create(surface);
> + }
>
> - surface->configure = pointer_cursor_surface_configure;
> - surface->configure_private = pointer;
> - weston_surface_set_label_func(surface,
> - pointer_cursor_surface_get_label);
> - pointer->sprite = weston_view_create(surface);
> pointer->hotspot_x = x;
> pointer->hotspot_y = y;
>
Pushed with my and Jonas' R-b.
abff883..4e53c53 master -> master
Thanks,
pq
More information about the wayland-devel
mailing list