[PATCH weston v1 3/3] compositor-x11: remove manual mouse button grab/ungrab
Benoit Gschwind
gschwind at gnu-log.net
Wed May 18 19:13:56 UTC 2016
Hello Bill,
You are right, thus I dug into the git history and I found that the grab
is mostly to confine the cursor into the X11 window. For reference, the
git commit id [1] and the related bug [2].
Since I do not want introduce a regression, I think the minor
improvement is valid.
Best regards.
[1] 7330862f9e25d513cfcc49358b7187524a9e1940
[2] https://bugs.freedesktop.org/show_bug.cgi?id=53558
On 13/05/2016 18:35, Bill Spitzak wrote:
> Does the x11 compositor have to do this at all? It owns that window so
> it gets automatic grabs. This is for one client to eat the events being
> passed to another client.
>
>
> On Fri, May 13, 2016 at 4:34 AM, Benoit Gschwind <gschwind at gnu-log.net
> <mailto:gschwind at gnu-log.net>> wrote:
>
> In current compositor-x11, the mouse buttons are grabbed and ungrabbed
> manually that may produce weird cases like starting a grab while the
> buttons are already released, due to asynchronous X11 events
> dispatching.
>
> The patch avoid the issue by using the better passive button grab, that
> automatically grab buttons as soon as they occur. The passive grab
> include an automatic ungrab when all mouse button are released.
>
> This probably fix some mysterious bugs.
>
> Signed-off-by: Benoit Gschwind <gschwind at gnu-log.net
> <mailto:gschwind at gnu-log.net>>
> ---
> src/compositor-x11.c | 27 +++++++++++++--------------
> 1 file changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
> index 5b76dba..ae155d1 100644
> --- a/src/compositor-x11.c
> +++ b/src/compositor-x11.c
> @@ -882,6 +882,19 @@ x11_backend_create_output(struct x11_backend
> *b, int x, int y,
>
> x11_output_set_wm_protocols(b, output);
>
> + /* Automatically grab and ungrab mouse buttons */
> + xcb_grab_button(b->conn, 0, output->window,
> + XCB_EVENT_MASK_BUTTON_PRESS |
> + XCB_EVENT_MASK_BUTTON_RELEASE |
> + XCB_EVENT_MASK_POINTER_MOTION |
> + XCB_EVENT_MASK_ENTER_WINDOW |
> + XCB_EVENT_MASK_LEAVE_WINDOW,
> + XCB_GRAB_MODE_ASYNC,
> + XCB_GRAB_MODE_ASYNC,
> + output->window, XCB_CURSOR_NONE,
> + XCB_BUTTON_INDEX_ANY,
> + XCB_MOD_MASK_ANY);
> +
> xcb_map_window(b->conn, output->window);
>
> if (fullscreen)
> @@ -1052,20 +1065,6 @@ x11_backend_deliver_button_event(struct
> x11_backend *b,
> if (!output)
> return;
>
> - if (is_button_pressed)
> - xcb_grab_pointer(b->conn, 0, output->window,
> - XCB_EVENT_MASK_BUTTON_PRESS |
> - XCB_EVENT_MASK_BUTTON_RELEASE |
> - XCB_EVENT_MASK_POINTER_MOTION |
> - XCB_EVENT_MASK_ENTER_WINDOW |
> - XCB_EVENT_MASK_LEAVE_WINDOW,
> - XCB_GRAB_MODE_ASYNC,
> - XCB_GRAB_MODE_ASYNC,
> - output->window, XCB_CURSOR_NONE,
> - button_event->time);
> - else
> - xcb_ungrab_pointer(b->conn, button_event->time);
> -
> if (!b->has_xkb)
> update_xkb_state_from_core(b, button_event->state);
>
> --
> 2.7.3
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> <mailto:wayland-devel at lists.freedesktop.org>
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
>
More information about the wayland-devel
mailing list