input: Don't recreate the cursor sprite when only the hotspot changes
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@osg.samsung.com> Reviewed-by: Jonas Ådahl <jadahl@gmail.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
parent
abff883d2c
commit
4e53c53fe7
36
src/input.c
36
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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue