[PATCH weston v2] input: Make setting the same pointer cursor state again a no-op

Derek Foreman derekf at osg.samsung.com
Thu Mar 19 10:37:02 PDT 2015


On 18/03/15 09:23 PM, Jonas Ådahl wrote:
> If the client calls wl_pointer.set_cursor with the same surface and hot
> spot coordinate that is already set, don't do anything as no state was
> changed.
> 
> This avoids an issue where a client setting the same cursor surface
> multiple times would receive wl_surface.leave/enter on that surface
> every time.
> 
> Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
> ---
> 
> Changes since v1:
> 
> Only no-op if both surface and hotspot was unchanged.
> 
>  src/input.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/src/input.c b/src/input.c
> index 3867de2..469d5ce 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -1655,6 +1655,10 @@ pointer_set_cursor(struct wl_client *client, struct wl_resource *resource,
>  			return;
>  	}
>  
> +	if (pointer->sprite && pointer->sprite->surface == surface &&
> +	    pointer->hotspot_x == x && pointer->hotspot_y == y)
> +		return;

Sorry to bikeshed this - this does fix the hotspot problem for me, but I
think there are still spurious enter/leave events when, for example,
moving from the decor to the text area in weston-terminal.

what about...

if (pointer->sprite && pointer->sprite->surface) {
	pointer->hotspot_x = x;
	pointer->hotspot_y = y;
	pointer_cursor_surface_configure(surface, 0, 0);
	return;
}

Technically, the cursor surface configure is only required when the
hotspot changes, but I don't know how complicated you want to make this. :)

> +
>  	if (pointer->sprite)
>  		pointer_unmap_sprite(pointer);
>  
> 



More information about the wayland-devel mailing list