From d9001a6be9d86a5f30549af9fbb02a466f4b0709 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 26 Jan 2011 12:11:00 +1000 Subject: Add third button emulation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New properties: "Evdev Third Button Emulation" → switch on/off "Evdev Third Button Emulation Timeout" → timeout until event is delivered "Evdev Third Button Emulation Button" → phys button to be emulated "Evdev Third Button Emulation Threshold" → move threshold before emulation is cancelled Signed-off-by: Peter Hutterer Tested-by: Benjamin Tissoires --- src/evdev.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index 74dd04d..bb30655 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -396,6 +396,11 @@ EvdevProcessValuators(InputInfoPtr pInfo) if (pEvdev->invert_y) pEvdev->delta[REL_Y] *= -1; + + Evdev3BEmuProcessRelMotion(pInfo, + pEvdev->delta[REL_X], + pEvdev->delta[REL_Y]); + for (i = 0; i < REL_CNT; i++) { int map = pEvdev->axis_map[i]; @@ -453,6 +458,7 @@ EvdevProcessValuators(InputInfoPtr pInfo) valuator_mask_set(pEvdev->vals, i, val); } + Evdev3BEmuProcessAbsMotion(pInfo, pEvdev->vals); } } @@ -753,6 +759,11 @@ static void EvdevPostQueuedEvents(InputInfoPtr pInfo, int num_v, int first_v, pEvdev->queue[i].val); break; case EV_QUEUE_BTN: + if (Evdev3BEmuFilterEvent(pInfo, + pEvdev->queue[i].key, + pEvdev->queue[i].val)) + break; + if (pEvdev->abs_queued && pEvdev->in_proximity) { xf86PostButtonEventP(pInfo->dev, 1, pEvdev->queue[i].key, pEvdev->queue[i].val, first_v, num_v, @@ -844,6 +855,7 @@ EvdevReadInput(InputInfoPtr pInfo) if (errno == ENODEV) /* May happen after resume */ { EvdevMBEmuFinalize(pInfo); + Evdev3BEmuFinalize(pInfo); xf86RemoveEnabledDevice(pInfo); close(pInfo->fd); pInfo->fd = -1; @@ -1334,6 +1346,7 @@ EvdevInit(DeviceIntPtr device) EvdevInitProperty(device); XIRegisterPropertyHandler(device, EvdevSetProperty, NULL, NULL); EvdevMBEmuInitProperty(device); + Evdev3BEmuInitProperty(device); EvdevWheelEmuInitProperty(device); EvdevDragLockInitProperty(device); @@ -1362,6 +1375,7 @@ EvdevOn(DeviceIntPtr device) xf86FlushInput(pInfo->fd); xf86AddEnabledDevice(pInfo); EvdevMBEmuOn(pInfo); + Evdev3BEmuOn(pInfo); pEvdev->flags |= EVDEV_INITIALIZED; device->public.on = TRUE; @@ -1388,7 +1402,10 @@ EvdevProc(DeviceIntPtr device, int what) case DEVICE_OFF: if (pEvdev->flags & EVDEV_INITIALIZED) + { EvdevMBEmuFinalize(pInfo); + Evdev3BEmuFinalize(pInfo); + } if (pInfo->fd != -1) { EvdevGrabDevice(pInfo, 0, 1); @@ -1862,6 +1879,7 @@ EvdevPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) if (pEvdev->flags & EVDEV_BUTTON_EVENTS) { EvdevMBEmuPreInit(pInfo); + Evdev3BEmuPreInit(pInfo); EvdevWheelEmuPreInit(pInfo); EvdevDragLockPreInit(pInfo); } -- cgit v1.2.3