On 01/03/2012 05:52 PM, Chase Douglas wrote:
> Evdev is a 100% stateful protocol. The following is correct, and
> represents a double tap:
> 
> ABS_MT_SLOT           0       /* Set touch slot */
> ABS_MT_TRACKING_ID    0       /* New touch with ID 0 in slot 0 */
> ABS_MT_POSITION_X     500     /* Initial X position */
> ABS_MT_POSITION_Y     500     /* Initial Y position */
> SYNC                          /* End of frame */
> ABS_MT_TRACKING_ID    -1      /* Touch in last slot (0) ended */
> SYNC                          /* End of frame */
> ABS_MT_TRACKING_ID    1       /* New touch in last slot (0) with ID 1 */
> SYNC                          /* End of frame */
> ABS_MT_TRACKING_ID    -1      /* Touch in last slot (0) ended */
> SYNC                          /* End of frame */
> 
> Note that touch 1 has the same X and Y position as touch 0. This is
> implied because no new value was emitted. In fact, evdev will not emit
> an event with the same value as the previous event, even if the driver
> reports the event, so we can only assume that all the MT valuators have
> the same values as they were when they were last sent.
> 
> This change adds a new valuator mask to hold all the last valuator
> values that came from evdev. When a new touch begins, all the last
> values are copied into it.

This isn't quite correct. While the evdev event list above is accurate,
it only captures part of the issue. The valuator values for a given slot
must be assumed to be the last values given for that specific slot
unless a new value comes in. So:

ABS_MT_SLOT             0       /* Set touch slot */
ABS_MT_TRACKING_ID      0       /* New touch with ID 0 in slot 0 */
ABS_MT_POSITION_X       500     /* Initial X position */
ABS_MT_POSITION_Y       500     /* Initial Y position */
ABS_MT_SLOT             1       /* Set touch slot */
ABS_MT_TRACKING_ID      1       /* New touch with ID 1 in slot 1 */
ABS_MT_POSITION_X       1000    /* Initial X position */
ABS_MT_POSITION_Y       1000    /* Initial Y position */
SYNC                            /* End of frame */
ABS_MT_SLOT             0       /* Go back to slot 0 */
ABS_MT_TRACKING_ID      -1      /* Touch in slot 0 ended */
ABS_MT_SLOT             1       /* Go to slot 1 */
ABS_MT_TRACKING_ID      -1      /* Touch in slot 1 ended */
SYNC                            /* End of frame */
ABS_MT_SLOT             0       /* Go back to slot 0 */
ABS_MT_TRACKING_ID      2       /* New touch in slot 0 with ID 2 */
SYNC                            /* End of frame */
ABS_MT_TRACKING_ID      -1      /* Touch in last slot (0) ended */
SYNC                            /* End of frame */

Here, the touch with tracking ID 2 occurs at (500, 500) because those
were the last coordinates given for slot 0.

I will fix this patch up and resend.

-- Chase
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to