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.hutte...@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.
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...
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,
_______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel