[PATCH xserver] wayland: Emulate crossing for native window

Olivier Fourdan ofourdan at redhat.com
Wed Aug 17 07:53:14 UTC 2016


Hi all,

Gentle reminder about this patch... 

Cheers,
Olivier

----- Original Message -----
> Emitting a LeaveNotify event every time the pointer leaves an X11 window
> may confuse focus follow mouse mode in window managers such as
> mutter/gnome-shell.
> 
> Keep the previously found X window and compare against the new one, and
> if they match then it means the pointer has left an Xwayland window for
> a native Wayland surface, only in this case fake the crossing to the
> root window.
> 
> Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
> ---
>  hw/xwayland/xwayland-input.c | 15 ++++++++++++++-
>  hw/xwayland/xwayland.c       |  3 ++-
>  hw/xwayland/xwayland.h       |  1 +
>  3 files changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
> index e295c71..043379e 100644
> --- a/hw/xwayland/xwayland-input.c
> +++ b/hw/xwayland/xwayland-input.c
> @@ -959,7 +959,7 @@ xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int
> x, int y)
>          }
>      }
>  
> -    if (xwl_seat == NULL || !xwl_seat->focus_window) {
> +    if (xwl_seat == NULL) {
>          sprite->spriteTraceGood = 1;
>          return sprite->spriteTrace[0];
>      }
> @@ -969,6 +969,19 @@ xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int
> x, int y)
>      xwl_seat->xwl_screen->XYToWindow = screen->XYToWindow;
>      screen->XYToWindow = xwl_xy_to_window;
>  
> +    /* If the pointer has left the Wayland surface but the DIX still
> +     * finds the pointer within the previous X11 window, it means that
> +     * the pointer has crossed to another native Wayland window, in this
> +     * case, pretend we entered the root window so that a LeaveNotify
> +     * event is emitted.
> +     */
> +    if (xwl_seat->focus_window == NULL && xwl_seat->last_xwindow == ret) {
> +        sprite->spriteTraceGood = 1;
> +        return sprite->spriteTrace[0];
> +    }
> +
> +    xwl_seat->last_xwindow = ret;
> +
>      return ret;
>  }
>  
> diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
> index 8c49b0b..1b29491 100644
> --- a/hw/xwayland/xwayland.c
> +++ b/hw/xwayland/xwayland.c
> @@ -323,7 +323,8 @@ xwl_unrealize_window(WindowPtr window)
>      xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) {
>          if (xwl_seat->focus_window && xwl_seat->focus_window->window ==
>          window)
>              xwl_seat->focus_window = NULL;
> -
> +        if (xwl_seat->last_xwindow == window)
> +            xwl_seat->last_xwindow = NullWindow;
>          xwl_seat_clear_touch(xwl_seat, window);
>      }
>  
> diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
> index b8a58e7..aa78b44 100644
> --- a/hw/xwayland/xwayland.h
> +++ b/hw/xwayland/xwayland.h
> @@ -132,6 +132,7 @@ struct xwl_seat {
>      struct wl_surface *cursor;
>      struct wl_callback *cursor_frame_cb;
>      Bool cursor_needs_update;
> +    WindowPtr last_xwindow;
>  
>      struct xorg_list touches;
>  
> --
> 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