| Message ID | 1432744921-16414-5-git-send-email-carlosg@gnome.org |
|---|---|
| State | Not Applicable |
| Headers | show |
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index 3229c54..9d554a8 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -818,29 +818,71 @@ DDXRingBell(int volume, int pitch, int duration) { } -static WindowPtr -xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int x, int y) +static int32_t +lookup_sprite_touch_client_id (SpritePtr sprite) { - struct xwl_seat *xwl_seat = NULL; DeviceIntPtr device; + int i; 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 (!device->touch) + continue; + + for (i = 0; i < device->touch->num_touches; i++) { + TouchPointInfoPtr ti = device->touch->touches + i; + + if (sprite == &ti->sprite) + return ti->client_id; } } - if (xwl_seat == NULL) { - /* XTEST device */ - sprite->spriteTraceGood = 1; - return sprite->spriteTrace[0]; + return 0; +} + +static struct xwl_touch * +xwl_touch_lookup_from_client_id (struct xwl_seat *xwl_seat, int32_t client_id) +{ + DeviceIntPtr touch = xwl_seat->touch; + int i; + + for (i = 0; i < touch->last.num_touches; i++) { + DDXTouchPointInfoPtr ddx_ti = touch->last.touches + i; + + if (ddx_ti->client_id == client_id) + return xwl_seat_lookup_touch(xwl_seat, ddx_ti->ddx_id); + } + + return NULL; +} + +static WindowPtr +xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int x, int y) +{ + struct xwl_screen *xwl_screen; + struct xwl_seat *xwl_seat = NULL; + struct xwl_window *xwl_window = NULL; + struct xwl_touch *xwl_touch; + int32_t client_id; + + xwl_screen = xwl_screen_get(screen); + + xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) { + if (xwl_seat->pointer->spriteInfo->sprite == sprite) { + xwl_window = xwl_seat->focus_window; + } else if ((client_id = lookup_sprite_touch_client_id (sprite)) != 0) { + xwl_touch = xwl_touch_lookup_from_client_id (xwl_seat, client_id); + + if (xwl_touch) + xwl_window = xwl_touch->window; + } + + if (xwl_window) + break; } - if (xwl_seat->focus_window) { + if (xwl_window) { sprite->spriteTraceGood = 2; - sprite->spriteTrace[1] = xwl_seat->focus_window->window; + sprite->spriteTrace[1] = xwl_window->window; return miSpriteTrace(sprite, x, y); } else {
I'm planning on removing this hook and just make compositors deal with the fallout. Unfortunately, it hasn't been merged yet. http://patchwork.freedesktop.org/patch/43021/ On Wed, May 27, 2015 at 9:42 AM, Carlos Garnacho <carlosg@gnome.org> wrote: > For these, we must first lookup the DIX sequence from the Sprite, we can > then lookup the DDX ID/xwl_touch from xwayland's touch device. > > Signed-off-by: Carlos Garnacho <carlosg@gnome.org> > --- > hw/xwayland/xwayland-input.c | 68 +++++++++++++++++++++++++++++++++++--------- > 1 file changed, 55 insertions(+), 13 deletions(-) > > diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c > index 3229c54..9d554a8 100644 > --- a/hw/xwayland/xwayland-input.c > +++ b/hw/xwayland/xwayland-input.c > @@ -818,29 +818,71 @@ DDXRingBell(int volume, int pitch, int duration) > { > } > > -static WindowPtr > -xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int x, int y) > +static int32_t > +lookup_sprite_touch_client_id (SpritePtr sprite) > { > - struct xwl_seat *xwl_seat = NULL; > DeviceIntPtr device; > + int i; > > 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 (!device->touch) > + continue; > + > + for (i = 0; i < device->touch->num_touches; i++) { > + TouchPointInfoPtr ti = device->touch->touches + i; > + > + if (sprite == &ti->sprite) > + return ti->client_id; > } > } > > - if (xwl_seat == NULL) { > - /* XTEST device */ > - sprite->spriteTraceGood = 1; > - return sprite->spriteTrace[0]; > + return 0; > +} > + > +static struct xwl_touch * > +xwl_touch_lookup_from_client_id (struct xwl_seat *xwl_seat, int32_t client_id) > +{ > + DeviceIntPtr touch = xwl_seat->touch; > + int i; > + > + for (i = 0; i < touch->last.num_touches; i++) { > + DDXTouchPointInfoPtr ddx_ti = touch->last.touches + i; > + > + if (ddx_ti->client_id == client_id) > + return xwl_seat_lookup_touch(xwl_seat, ddx_ti->ddx_id); > + } > + > + return NULL; > +} > + > +static WindowPtr > +xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int x, int y) > +{ > + struct xwl_screen *xwl_screen; > + struct xwl_seat *xwl_seat = NULL; > + struct xwl_window *xwl_window = NULL; > + struct xwl_touch *xwl_touch; > + int32_t client_id; > + > + xwl_screen = xwl_screen_get(screen); > + > + xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) { > + if (xwl_seat->pointer->spriteInfo->sprite == sprite) { > + xwl_window = xwl_seat->focus_window; > + } else if ((client_id = lookup_sprite_touch_client_id (sprite)) != 0) { > + xwl_touch = xwl_touch_lookup_from_client_id (xwl_seat, client_id); > + > + if (xwl_touch) > + xwl_window = xwl_touch->window; > + } > + > + if (xwl_window) > + break; > } > > - if (xwl_seat->focus_window) { > + if (xwl_window) { > sprite->spriteTraceGood = 2; > - sprite->spriteTrace[1] = xwl_seat->focus_window->window; > + sprite->spriteTrace[1] = xwl_window->window; > return miSpriteTrace(sprite, x, y); > } > else { > -- > 2.4.1 > > _______________________________________________ > wayland-devel mailing list > wayland-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Hey Jasper, On Wed, May 27, 2015 at 7:56 PM, Jasper St. Pierre <jstpierre@mecheye.net> wrote: > I'm planning on removing this hook and just make compositors deal with > the fallout. Unfortunately, it hasn't been merged yet. > > http://patchwork.freedesktop.org/patch/43021/ That'd be even better AFAICT. I'll play on top of your patch (and without this one). Cheers, Carlos
On 29/05/15 11:45, Carlos Garnacho wrote: > Hey Jasper, > > On Wed, May 27, 2015 at 7:56 PM, Jasper St. Pierre > <jstpierre@mecheye.net> wrote: >> I'm planning on removing this hook and just make compositors deal with >> the fallout. Unfortunately, it hasn't been merged yet. >> >> http://patchwork.freedesktop.org/patch/43021/ > > That'd be even better AFAICT. I'll play on top of your patch (and > without this one). NAK Given that I picked Jasper's patch that removes XYToWindow(), this patch is no longer required. Cheers, Olivier
For these, we must first lookup the DIX sequence from the Sprite, we can then lookup the DDX ID/xwl_touch from xwayland's touch device. Signed-off-by: Carlos Garnacho <carlosg@gnome.org> --- hw/xwayland/xwayland-input.c | 68 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 13 deletions(-)