[PATCH evdev 2/3] Add proximity support.

Benjamin Tissoires tissoire at cena.fr
Tue Oct 12 00:25:28 PDT 2010


Le 12/10/2010 03:38, Peter Hutterer a écrit :
> On Mon, Oct 11, 2010 at 12:58:06PM +0200, Benjamin Tissoires wrote:
>> Hi Peter,
>>
>> see my comments:
>>
>> Le 11/10/2010 01:33, Peter Hutterer a écrit :
>>> When one of the tools comes into proximity, queue up a proximity event and
>>> send it accordingly.
>>>
>>> Signed-off-by: Peter Hutterer<peter.hutterer at who-t.net>
>>> ---
>>>   src/evdev.c |   62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>>>   src/evdev.h |    4 ++-
>>>   2 files changed, 64 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/src/evdev.c b/src/evdev.c
>>> index 9e1fb10..634c174 100644
>>> --- a/src/evdev.c
>>> +++ b/src/evdev.c
>>> @@ -322,7 +322,18 @@ EvdevQueueButtonEvent(InputInfoPtr pInfo, int button, int value)
>>>           pQueue->key = button;
>>>           pQueue->val = value;
>>>       }
>>> +}
>>>
>>> +void
>>> +EvdevQueueProximityEvent(InputInfoPtr pInfo, int value)
>>> +{
>>> +    EventQueuePtr pQueue;
>>> +    if ((pQueue = EvdevNextInQueue(pInfo)))
>>> +    {
>>> +        pQueue->type = EV_QUEUE_PROXIMITY;
>>> +        pQueue->key = 0;
>>> +        pQueue->val = value;
>>> +    }
>>>   }
>>>
>>>   /**
>>> @@ -459,6 +470,16 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
>>>       }
>>>   }
>>>
>>> +static void
>>> +EvdevProcessProximityEvent(InputInfoPtr pInfo, struct input_event *ev)
>>> +{
>>> +    EvdevPtr pEvdev = pInfo->private;
>>> +
>>> +    pEvdev->prox = 1;
>>> +
>>> +    EvdevQueueProximityEvent(pInfo, ev->value);
>>> +}
>>> +
>>>   /**
>>>    * Take a button input event and process it accordingly.
>>>    */
>>> @@ -583,6 +604,7 @@ EvdevProcessKeyEvent(InputInfoPtr pInfo, struct input_event *ev)
>>>               return;
>>>
>>>       switch (ev->code) {
>>> +        /* keep this list in sync with InitProximityClassDeviceStruct */
>>>           case BTN_TOOL_PEN:
>>>           case BTN_TOOL_RUBBER:
>>>           case BTN_TOOL_BRUSH:
>>> @@ -591,7 +613,7 @@ EvdevProcessKeyEvent(InputInfoPtr pInfo, struct input_event *ev)
>>>           case BTN_TOOL_FINGER:
>>>           case BTN_TOOL_MOUSE:
>>>           case BTN_TOOL_LENS:
>>> -            pEvdev->proximity = value ? ev->code : 0;
>>> +            EvdevProcessProximityEvent(pInfo, ev);
>>
>> You removed the pEvdev->proximity assignment, and you did not add it
>> in  EvdevProcessProximityEvent. Is it normal? Otherwise,
>> pEvdev->proximity will still be 1 in the rest of the code (and the
>> life of the device), and so the related tests do not need to exist.
>
> urgh, yes. that was a bad commit split, if you squash this patch and the
> next one it makes more sense.
>
>>>               break;
>>>
>>>           case BTN_TOUCH:
>>> @@ -645,6 +667,27 @@ EvdevPostAbsoluteMotionEvents(InputInfoPtr pInfo, int num_v, int first_v,
>>>       }
>>>   }
>>>
>>> +static void
>>> +EvdevPostProximityEvents(InputInfoPtr pInfo, int which, int num_v, int first_v,
>>> +                                  int v[MAX_VALUATORS])
>>> +{
>>> +    int i;
>>> +    EvdevPtr pEvdev = pInfo->private;
>>> +
>>> +    for (i = 0; pEvdev->prox&&   i<   pEvdev->num_queue; i++) {
>>> +        switch (pEvdev->queue[i].type) {
>>> +            case EV_QUEUE_KEY:
>>> +            case EV_QUEUE_BTN:
>>> +                break;
>>> +            case EV_QUEUE_PROXIMITY:
>>> +                if (pEvdev->queue[i].val == which)
>>
>> You call EvdevPostProximityEvents with only TRUE and FALSE. However,
>> .val can have BTN_TOOL_PEN..BTN_TOOL_LENS isn't it? These value will
>> not ever be send...
>
> no, that was the old code but it was rather pointless since we didn't use it
> for checks or anything. with this code, val is value, thus 0 or 1.
>
> Cheers,
>    Peter

oups, sorry...

BTW, I did not found that the patch set transfers the tool type to the 
client. Thus Gimp and others will not now them (if it's a rubber, an 
airbrush, etc)? It is maybe a lack in the protocol, but I know we use 
this field in our applications.

Cheers,
Benjamin

>
>>> +                    xf86PostProximityEventP(pInfo->dev, which, first_v, num_v,
>>> +                            v + first_v);
>>> +                break;
>>> +        }
>>> +    }
>>> +}
>>> +
>>>   /**
>>>    * Post the queued key/button events.
>>>    */
>>> @@ -672,6 +715,8 @@ static void EvdevPostQueuedEvents(InputInfoPtr pInfo, int num_v, int first_v,
>>>                   xf86PostButtonEvent(pInfo->dev, 0, pEvdev->queue[i].key,
>>>                                       pEvdev->queue[i].val, 0, 0);
>>>               break;
>>> +        case EV_QUEUE_PROXIMITY:
>>> +            break;
>>>           }
>>>       }
>>>   }
>>> @@ -689,15 +734,19 @@ EvdevProcessSyncEvent(InputInfoPtr pInfo, struct input_event *ev)
>>>
>>>       EvdevProcessValuators(pInfo, v,&num_v,&first_v);
>>>
>>> +    EvdevPostProximityEvents(pInfo, TRUE, num_v, first_v, v);
>>>       EvdevPostRelativeMotionEvents(pInfo, num_v, first_v, v);
>>>       EvdevPostAbsoluteMotionEvents(pInfo, num_v, first_v, v);
>>>       EvdevPostQueuedEvents(pInfo, num_v, first_v, v);
>>> +    EvdevPostProximityEvents(pInfo, FALSE, num_v, first_v, v);
>>>
>>>       memset(pEvdev->delta, 0, sizeof(pEvdev->delta));
>>>       memset(pEvdev->queue, 0, sizeof(pEvdev->queue));
>>>       pEvdev->num_queue = 0;
>>>       pEvdev->abs = 0;
>>>       pEvdev->rel = 0;
>>> +    pEvdev->prox = 0;
>>> +
>>>   }
>>>
>>>   /**
>>> @@ -1226,6 +1275,17 @@ EvdevAddAbsClass(DeviceIntPtr device)
>>>
>>>       free(atoms);
>>>
>>> +    /* keep this list in sync with EvdevProcessKeyEvent */
>>> +    if (TestBit(BTN_TOOL_PEN, pEvdev->key_bitmask) ||
>>> +        TestBit(BTN_TOOL_RUBBER, pEvdev->key_bitmask) ||
>>> +        TestBit(BTN_TOOL_BRUSH, pEvdev->key_bitmask) ||
>>> +        TestBit(BTN_TOOL_PENCIL, pEvdev->key_bitmask) ||
>>> +        TestBit(BTN_TOOL_AIRBRUSH, pEvdev->key_bitmask) ||
>>> +        TestBit(BTN_TOOL_FINGER, pEvdev->key_bitmask) ||
>>> +        TestBit(BTN_TOOL_MOUSE, pEvdev->key_bitmask) ||
>>> +        TestBit(BTN_TOOL_LENS, pEvdev->key_bitmask))
>>> +        InitProximityClassDeviceStruct(device);
>>> +
>>>       if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc))
>>>           return !Success;
>>>
>>> diff --git a/src/evdev.h b/src/evdev.h
>>> index b382670..08f3c13 100644
>>> --- a/src/evdev.h
>>> +++ b/src/evdev.h
>>> @@ -109,6 +109,7 @@ typedef struct {
>>>       enum {
>>>           EV_QUEUE_KEY,	/* xf86PostKeyboardEvent() */
>>>           EV_QUEUE_BTN,	/* xf86PostButtonEvent() */
>>> +        EV_QUEUE_PROXIMITY, /* xf86PostProximityEvent() */
>>>       } type;
>>>       int key;		/* May be either a key code or button number. */
>>>       int val;		/* State of the key/button; pressed or released. */
>>> @@ -131,7 +132,7 @@ typedef struct {
>>>       BOOL invert_y;
>>>
>>>       int delta[REL_CNT];
>>> -    unsigned int abs, rel;
>>> +    unsigned int abs, rel, prox;
>>>
>>>       /* XKB stuff has to be per-device rather than per-driver */
>>>   #if GET_ABI_MAJOR(ABI_XINPUT_VERSION)<   5
>>> @@ -198,6 +199,7 @@ typedef struct {
>>>   /* Event posting functions */
>>>   void EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value);
>>>   void EvdevQueueButtonEvent(InputInfoPtr pInfo, int button, int value);
>>> +void EvdevQueueProximityEvent(InputInfoPtr pInfo, int value);
>>>   void EvdevPostButtonEvent(InputInfoPtr pInfo, int button, int value);
>>>   void EvdevQueueButtonClicks(InputInfoPtr pInfo, int button, int count);
>>>   void EvdevPostRelativeMotionEvents(InputInfoPtr pInfo, int num_v, int first_v,
> Cheers,
>    Peter



More information about the xorg-devel mailing list