[PATCH v2 2/2] Populate touch emulated button state separately

Peter Hutterer peter.hutterer at who-t.net
Wed Jul 11 23:34:55 PDT 2012


On Mon, Jul 09, 2012 at 05:12:44PM -0700, Chase Douglas wrote:
> When a touch begin is pointer emulated, do not include touch state when
> calculating the button state for the initial motion and button press
> events. This change ensures the logical state of the buttons prior to the
> events is set properly for emulated events.
> 
> Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
> ---
>  Xi/exevents.c    |   15 +++++++++++++++
>  dix/events.c     |    2 ++
>  dix/inpututils.c |    4 ----
>  3 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index c1fcc55..0341ad5 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -1445,6 +1445,13 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
>      event_set_state(dev, kbd, &ptrev->device_event);
>      ptrev->device_event.corestate = event_get_corestate(dev, kbd);
>  
> +    /* Add button 1 emulated state only for touch update and touch end events.
> +     * The state confers the *previous* state of the button. */
> +    if (ev->any.type != ET_TouchBegin) {
> +        SetBit(ptrev->device_event.buttons, dev->button->map[1]);
> +        ptrev->device_event.corestate |= (Button1Mask >> 1) << dev->button->map[1];
> +    }
> +

can we move this into event_get_corestate?

>      if (grab) {
>          /* this side-steps the usual activation mechansims, but... */
>          if (ev->any.type == ET_TouchBegin && !dev->deviceGrab.grab)
> @@ -1701,6 +1708,14 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
>      corestate = event_get_corestate(mouse, kbd);
>      event_set_state(mouse, kbd, event);
>  
> +    /* Touch button state is already set for pointer emulated events. */
> +    if (!(event->flags & XIPointerEmulated)) {
> +        if (mouse && mouse->touch && mouse->touch->buttonsDown > 0) {
> +            SetBit(event->buttons, mouse->button->map[1]);
> +            event->corestate |= (Button1Mask >> 1) << mouse->button->map[1];
> +        }
> +    }
> +

same here, let's move this into event_set_state()? i feel a bit queasy about
having a function that returns us the core state, only to have that state
messed with on returning.

Cheers,
  Peter

>      ret = UpdateDeviceState(device, event);
>      if (ret == DONT_PROCESS)
>          return;
> diff --git a/dix/events.c b/dix/events.c
> index 86336fe..00ae8a9 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -5135,6 +5135,8 @@ ProcQueryPointer(ClientPtr client)
>      rep.type = X_Reply;
>      rep.sequenceNumber = client->sequence;
>      rep.mask = event_get_corestate(mouse, keyboard);
> +    if (mouse && mouse->touch)
> +        rep.mask |= mouse->touch->state;
>      rep.length = 0;
>      rep.root = (GetCurrentRootWindow(mouse))->drawable.id;
>      rep.rootX = pSprite->hot.x;
> diff --git a/dix/inpututils.c b/dix/inpututils.c
> index 223d547..3ae41cc 100644
> --- a/dix/inpututils.c
> +++ b/dix/inpututils.c
> @@ -671,7 +671,6 @@ event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd)
>                   kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->
>                                                    state) : 0;
>      corestate |= (mouse && mouse->button) ? (mouse->button->state) : 0;
> -    corestate |= (mouse && mouse->touch) ? (mouse->touch->state) : 0;
>  
>      return corestate;
>  }
> @@ -685,9 +684,6 @@ event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd, DeviceEvent *event)
>          if (BitIsOn(mouse->button->down, i))
>              SetBit(event->buttons, mouse->button->map[i]);
>  
> -    if (mouse && mouse->touch && mouse->touch->buttonsDown > 0)
> -        SetBit(event->buttons, mouse->button->map[1]);
> -
>      if (kbd && kbd->key) {
>          XkbStatePtr state;
>  
> -- 
> 1.7.10.4
> 


More information about the xorg-devel mailing list