[PATCH xserver] wayland: Emulate crossing for native window

Peter Hutterer peter.hutterer at who-t.net
Fri Aug 19 01:09:45 UTC 2016


On Wed, Aug 17, 2016 at 03:53:14AM -0400, Olivier Fourdan wrote:
> Hi all,
> 
> Gentle reminder about this patch... 

sorry about the delay.

   48c5c23..6e5bec2  master -> master

Cheers,
   Peter

> 
> 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
> _______________________________________________
> 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