On Fri, Jan 31, 2014 at 04:07:51PM +0200, Ander Conselvan de Oliveira wrote:
> The input region of the cursor surface is set to empty in
> pointer_cursor_surface_configure(). Since during the commit process
> this function is called before the pending input region is made
> current, it empties surface->pending.input instead of surface->input.
> 
> But pointer_cursor_surface_configure() is also called from
> pointer_set_cursor() in order to map the cursor even if there isn't a
> subsequent attach and commit to the cursor surface. In that case,
> surface->input is never emptied, since the configure function emptied
> only the pending input region and there wasn't a commit that made it
> effective.
> 
> Fix this by emptying both pending and current input regions. The latter
> shouldn't cause problems since the surface can't have a role prior to
> being assigned the cursor role, so it shouldn't be mapped in the first
> place.
> 
> Also change toytoolkit so that it triggers the bug.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=73711

Thanks Ander, that makes sense.

Kristian

> ---
>  clients/window.c | 6 +++---
>  src/input.c      | 1 +
>  2 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/clients/window.c b/clients/window.c
> index d8d79d0..75e6418 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -3458,13 +3458,13 @@ input_set_pointer_image_index(struct input *input, 
> int index)
>       if (!buffer)
>               return;
>  
> -     wl_pointer_set_cursor(input->pointer, input->pointer_enter_serial,
> -                           input->pointer_surface,
> -                           image->hotspot_x, image->hotspot_y);
>       wl_surface_attach(input->pointer_surface, buffer, 0, 0);
>       wl_surface_damage(input->pointer_surface, 0, 0,
>                         image->width, image->height);
>       wl_surface_commit(input->pointer_surface);
> +     wl_pointer_set_cursor(input->pointer, input->pointer_enter_serial,
> +                           input->pointer_surface,
> +                           image->hotspot_x, image->hotspot_y);
>  }
>  
>  static const struct wl_callback_listener pointer_surface_listener;
> diff --git a/src/input.c b/src/input.c
> index 25ed133..5ce7f39 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -1543,6 +1543,7 @@ pointer_cursor_surface_configure(struct weston_surface 
> *es,
>       weston_view_set_position(pointer->sprite, x, y);
>  
>       empty_region(&es->pending.input);
> +     empty_region(&es->input);
>  
>       if (!weston_surface_is_mapped(es)) {
>               wl_list_insert(&es->compositor->cursor_layer.view_list,
> -- 
> 1.8.1.2
> 
> _______________________________________________
> wayland-devel mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to