On 02/01/2014 10:00 AM, Pekka Paalanen wrote:
On Fri, 31 Jan 2014 16:07:51 +0200
Ander Conselvan de Oliveira <[email protected]> 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
---
  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,

Looks good to me!

I wonder, do we have a similar problem with drag icon surfaces?

There isn't a problem because weston_pointer_start_drag() doesn't map the drag icon. It takes an attach/commit to do it and at that point emptying the pending input region does the trick.

The protocol is not clear whether the surface should be mapped/configured when the request is received. If we change this to behave similarly to wl_pointer::set_cursor, then we need a similar fix.

I'm not sure if that change would make sense though. Since wl_data_device::start_drag doesn't have a "hotspot" parameter, it is necessary to set the offset from the pointer on the first attach, unless that offset would be (0, 0). So if the drag_surface already has a buffer, the client would have to first attach NULL to be able to ensure the icon wouldn't be rendered in the wrong position due to the attach that sets the offset being processed a frame later than the start_drag request.

Thanks,
Ander



Thanks,
pq
_______________________________________________
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