[PATCH evdev 4/5] Dummy process MT events.

Benjamin Tissoires tissoire at cena.fr
Tue Apr 13 01:39:44 PDT 2010



Le 09/04/2010 07:44, Peter Hutterer a écrit :
> On Sun, Mar 28, 2010 at 01:58:12PM +0200, Benjamin Tissoires wrote:
>> In case the driver receive a mt event, it stores it at the first
>> available place, i.e. it does not overrides older mt values.
>>
>> At the end, in the EV_SYNC event, it only send the values it has
>> filled.
>>
>> Signed-off-by: Benjamin Tissoires<tissoire at cena.fr>
>> ---
>>   src/evdev.c |   31 ++++++++++++++++++++++++++++---
>>   src/evdev.h |    1 +
>>   2 files changed, 29 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/evdev.c b/src/evdev.c
>> index 7e59601..76af8dc 100644
>> --- a/src/evdev.c
>> +++ b/src/evdev.c
>> @@ -422,6 +422,8 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
>>        */
>>       else if (pEvdev->abs&&  pEvdev->tool) {
>>           memcpy(v, pEvdev->vals, sizeof(int) * pEvdev->num_vals);
>> +        if (pEvdev->current_num_multitouch>  EVDEV_MAX_TOUCHPOINTS)
>> +            pEvdev->current_num_multitouch = EVDEV_MAX_TOUCHPOINTS;
>
> do I understand this correctly that if you get 6 touchpoints the last one
> overwrites touchpoint 5? is this preferable to just dropping them once they
> overflow?

not exactly. What you propose is already occurring: this assignment is 
made in the function EvdevProcessValuators which is called at the end of 
the frame (on an EV_SYNC event).
When mt-values are coming, the EvdevProcessAbsoluteMotionEvent function 
is called and this function drops them if current_num_multitouch > 
EVDEV_MAX_TOUCHPOINTS.

I had to clamp current_num_multitouch at the end as I rely on it to know 
how many valuators do I need to send

>
> also, can we rename current_num_multitouch to mt_current_touchpoint?
> otherwise this may get confused with the number of touchpoints supported by
> the device.

ack.

>
>>           if (pEvdev->swap_axes) {
>>               int tmp = v[0];
>> @@ -448,7 +450,8 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
>>               v[1] = (pEvdev->absinfo[ABS_Y].maximum - v[1] +
>>                       pEvdev->absinfo[ABS_Y].minimum);
>>
>> -        *num_v = pEvdev->num_vals;
>> +        *num_v = pEvdev->mt_first_axis +
>> +                    pEvdev->current_num_multitouch * pEvdev->mt_num_valuators;
>
> on an absolute, non-MT device this always gives you a num_v of 0?

arf, did not saw this one.... I 'll add a test (flags & 
EVDEV_MULTITOUCH) to keep the non-mt absolute device work.


>
>>           *first_v = 0;
>>       }
>>   }
>> @@ -551,7 +554,15 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
>>       if (EvdevWheelEmuFilterMotion(pInfo, ev))
>>           return;
>>
>> -    pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
>> +    if (ev->code<  ABS_MT_TOUCH_MAJOR)
>> +        pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
>> +    else if (pEvdev->current_num_multitouch<  EVDEV_MAX_TOUCHPOINTS) {
>> +        /* MT value ->  store it at the first available place */
>> +        pEvdev->vals[pEvdev->axis_map[ev->code] +
>> +                        pEvdev->current_num_multitouch * pEvdev->mt_num_valuators] = value;
>> +    } else
>> +        return; /* mt-event, but not enough place to store it */
>> +
>>       if (ev->code == ABS_X)
>>           pEvdev->abs |= ABS_X_VALUE;
>>       else if (ev->code == ABS_Y)
>> @@ -693,6 +704,17 @@ EvdevProcessSyncEvent(InputInfoPtr pInfo, struct input_event *ev)
>>       pEvdev->num_queue = 0;
>>       pEvdev->abs = 0;
>>       pEvdev->rel = 0;
>> +    pEvdev->current_num_multitouch = 0;
>> +}
>> +
>> +/**
>> + * Take the mt-synchronization input event and process it accordingly.
>> + */
>
> meh. not the most descriptive comment. every time you see a "process it
> accordingly" comment that just means that there was either nothing to say or
> the developer was too lazy to say anything useful. You pick which one it is
> in this case ;)

sorry :-/

>
>> +static void
>> +EvdevProcessMTSyncReport(InputInfoPtr pInfo, struct input_event *ev)
>> +{
>> +    EvdevPtr pEvdev = pInfo->private;
>> +    pEvdev->current_num_multitouch++;
>>   }
>>
>>   /**
>> @@ -713,7 +735,10 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
>>               EvdevProcessKeyEvent(pInfo, ev);
>>               break;
>>           case EV_SYN:
>> -            EvdevProcessSyncEvent(pInfo, ev);
>> +            if (ev->code == SYN_MT_REPORT)
>> +                EvdevProcessMTSyncReport(pInfo, ev);
>> +            else
>> +                EvdevProcessSyncEvent(pInfo, ev);
>>               break;
>>       }
>>   }
>> diff --git a/src/evdev.h b/src/evdev.h
>> index 383a904..0dba366 100644
>> --- a/src/evdev.h
>> +++ b/src/evdev.h
>> @@ -198,6 +198,7 @@ typedef struct {
>>
>>       unsigned int mt_first_axis;
>>       unsigned int mt_num_valuators;
>> +    unsigned int current_num_multitouch;
>>   } EvdevRec, *EvdevPtr;
>>
>>   /* Event posting functions */
>> --
>> 1.6.6.1
>>
> Cheers,
>    Peter
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list