[xwayland,4/4] xwayland: Make the XYToWindowProc implementation aware of touchpoints

Submitted by Carlos Garnacho on May 27, 2015, 4:42 p.m.

Details

Message ID 1432744921-16414-5-git-send-email-carlosg@gnome.org
State Not Applicable
Headers show

Not browsing as part of any series.

Commit Message

Carlos Garnacho May 27, 2015, 4:42 p.m.
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(-)

Patch hide | download patch | download mbox

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 {

Comments

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