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 <[email protected]> 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 <[email protected]> > --- > 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 > [email protected] > http://lists.freedesktop.org/mailman/listinfo/wayland-devel -- Jasper _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
