[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