[PATCH v3 xserver] xwayland-input: Fake crossing to rootwin
Peter Hutterer
peter.hutterer at who-t.net
Thu Jun 23 06:03:04 UTC 2016
On Tue, Jun 21, 2016 at 01:54:35PM +0200, Olivier Fourdan wrote:
> This partially reverts commit c1565f3.
>
> When the pointer moves from an X11 window to a Wayland native window,
> no LeaveNotify event is emitted which can lead to various unexpected
> behaviors like tooltips remaining visible after the pointer has left the
> window.
>
> Yet the pointer_handle_leave() is called and so is the DIX CheckMotion()
> but since the pointer enters a Wayland native window with no other
> Xwayland window matching, DoEnterLeaveEvents() does not get invoked and
> therefore no LeaveNotify event is sent to the X11 client at the time the
> pointer leaves the window for a Wayland native surface.
>
> Restore the XYToWindow() handler in xwayland-input that was previously
> removed with commit c1565f3 and use that handler to pretend that the
> pointer entered the root window in this case so that the LeaveNotify
> event is emitted.
>
> Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
> Acked-by: Daniel Stone <daniels at collabora.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96437
> ---
111a045..7397a21 master -> master
thanks.
Cheers,
Peter
> v2: Forgot to set spriteTraceGood
> v3: Fix wrapping as suggested by Daniel
>
> hw/xwayland/xwayland-input.c | 31 +++++++++++++++++++++++++++++++
> hw/xwayland/xwayland.h | 1 +
> 2 files changed, 32 insertions(+)
>
> diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
> index 45acf0c..e295c71 100644
> --- a/hw/xwayland/xwayland-input.c
> +++ b/hw/xwayland/xwayland-input.c
> @@ -944,6 +944,34 @@ DDXRingBell(int volume, int pitch, int duration)
> {
> }
>
> +static WindowPtr
> +xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int x, int y)
> +{
> + struct xwl_seat *xwl_seat = NULL;
> + DeviceIntPtr device;
> + WindowPtr ret;
> +
> + for (device = inputInfo.devices; device; device = device->next) {
> + if (device->deviceProc == xwl_pointer_proc &&
> + device->spriteInfo->sprite == sprite) {
> + xwl_seat = device->public.devicePrivate;
> + break;
> + }
> + }
> +
> + if (xwl_seat == NULL || !xwl_seat->focus_window) {
> + sprite->spriteTraceGood = 1;
> + return sprite->spriteTrace[0];
> + }
> +
> + screen->XYToWindow = xwl_seat->xwl_screen->XYToWindow;
> + ret = screen->XYToWindow(screen, sprite, x, y);
> + xwl_seat->xwl_screen->XYToWindow = screen->XYToWindow;
> + screen->XYToWindow = xwl_xy_to_window;
> +
> + return ret;
> +}
> +
> void
> xwl_seat_clear_touch(struct xwl_seat *xwl_seat, WindowPtr window)
> {
> @@ -970,6 +998,9 @@ InitInput(int argc, char *argv[])
> wl_registry_add_listener(xwl_screen->input_registry, &input_listener,
> xwl_screen);
>
> + xwl_screen->XYToWindow = pScreen->XYToWindow;
> + pScreen->XYToWindow = xwl_xy_to_window;
> +
> wl_display_roundtrip(xwl_screen->display);
> while (xwl_screen->expecting_event)
> wl_display_roundtrip(xwl_screen->display);
> diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
> index aead0a8..b8a58e7 100644
> --- a/hw/xwayland/xwayland.h
> +++ b/hw/xwayland/xwayland.h
> @@ -62,6 +62,7 @@ struct xwl_screen {
> DestroyWindowProcPtr DestroyWindow;
> RealizeWindowProcPtr RealizeWindow;
> UnrealizeWindowProcPtr UnrealizeWindow;
> + XYToWindowProcPtr XYToWindow;
>
> struct xorg_list output_list;
> struct xorg_list seat_list;
> --
> 2.7.4
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list