[PATCH xwayland 4/4] xwayland: Make the XYToWindowProc implementation aware of touchpoints
Jasper St. Pierre
jstpierre at mecheye.net
Wed May 27 10:56:14 PDT 2015
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 at 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 at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
--
Jasper
More information about the wayland-devel
mailing list