[Xorg] [PATCH] allow EmulateWheel to generate normal clicks too
Andrew Pimlott
andrew at pimlott.net
Tue Aug 17 21:49:25 PDT 2004
On Mon, Aug 16, 2004 at 08:00:16PM +0200, Mathias Fröhlich wrote:
> I never thought about an other solution to that problem since it works
> sufficiently well for me.
Likewise, I just wrote the first way that occurred to me, and didn't
think about a timeout until I saw your patch.
> My experience with that feature (and my hardware) is that my trackpoint on my
> thinkpad sometimes slightly drifts away with a more or less little speed,
> even if I do not touch the trackpoint at all.
Good point--I have seen this on multiple laptops. On my current one, it
is not bad, but I have seen a middle-click fail at least once with my
patch because of the drifting trackpoint.
> IMO this could be better handled with the timeout approach since the decision
> of emitting middle mouse button clicks does not depend on a funky mouse
> hardware but only on your click speed ...
True; on the other hand, I'm not sure that users are very aware of how
long they hold down the mouse for a click. They may be more aware of
whether or not they moved the mouse. And maybe a threshold will remove
the funky mouse issue.
> Is the movement threshold configurable?
I did not implement a threshold initially. But it seems that it would
be necessary for my approach, so I added it, hard-coded at 5 pixels for
now. (The distance for a scroll is 10 pixels. BTW, the documentation
is wrong about that and the code is inconsistent.)
> I don't think that we should overcomlicate that issue with different
> approaches, much configuration options ....
right
> Could you provide me a mouse module with the movement approach?
The new patch is appended, and I can send you (and anyone else) the
module in a separate message. If you didn't catch the beginning of the
thread, it's at
http://freedesktop.org/pipermail/xorg/2004-August/002404.html
> I will tell you in a few days if this does not work well with that drift in
> hardware.
Likewise, I'll try out your patch soon. What timeout do you suggest?
Andrew
--- hw/xfree86/os-support/xf86OSmouse.h.orig 2004-08-15 00:24:15.000000000 -0700
+++ hw/xfree86/os-support/xf86OSmouse.h 2004-08-17 21:31:18.000000000 -0700
@@ -150,6 +150,8 @@
Bool emulateWheel;
int wheelInertia;
int wheelButtonMask;
+ Bool wheelButtonClick;
+ int wheelButtonMoved;
int negativeX; /* Button values. Unlike the Z and */
int positiveX; /* W equivalents, these are button */
int negativeY; /* values rather than button masks. */
--- hw/xfree86/input/mouse/mouse.c.orig 2004-08-15 00:07:41.000000000 -0700
+++ hw/xfree86/input/mouse/mouse.c 2004-08-17 21:34:55.000000000 -0700
@@ -185,6 +185,7 @@
OPTION_RESOLUTION,
OPTION_EMULATE_WHEEL,
OPTION_EMU_WHEEL_BUTTON,
+ OPTION_EMU_WHEEL_CLICK,
OPTION_EMU_WHEEL_INERTIA,
OPTION_X_AXIS_MAPPING,
OPTION_Y_AXIS_MAPPING,
@@ -222,6 +223,7 @@
{ OPTION_RESOLUTION, "Resolution", OPTV_INTEGER, {0}, FALSE },
{ OPTION_EMULATE_WHEEL, "EmulateWheel", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_EMU_WHEEL_BUTTON, "EmulateWheelButton", OPTV_INTEGER, {0}, FALSE },
+ { OPTION_EMU_WHEEL_CLICK, "EmulateWheelClickToo", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_EMU_WHEEL_INERTIA, "EmulateWheelInertia", OPTV_INTEGER, {0}, FALSE },
{ OPTION_X_AXIS_MAPPING, "XAxisMapping", OPTV_STRING, {0}, FALSE },
{ OPTION_Y_AXIS_MAPPING, "YAxisMapping", OPTV_STRING, {0}, FALSE },
@@ -619,6 +621,9 @@
}
pMse->wheelButtonMask = 1 << (wheelButton - 1);
+ pMse->wheelButtonClick = xf86SetBoolOption(pInfo->options,
+ "EmulateWheelClickToo", FALSE);
+
pMse->wheelInertia = xf86SetIntOption(pInfo->options,
"EmulateWheelInertia", 10);
if (pMse->wheelInertia <= 0) {
@@ -689,8 +694,9 @@
pInfo->name, pMse->negativeY, pMse->positiveY);
}
xf86Msg(X_CONFIG, "%s: EmulateWheel, EmulateWheelButton: %d, "
- "EmulateWheelInertia: %d\n",
- pInfo->name, wheelButton, pMse->wheelInertia);
+ "EmulateWheelClickToo: %d, EmulateWheelInertia: %d\n",
+ pInfo->name, wheelButton, pMse->wheelInertia,
+ pMse->wheelButtonClick);
}
if (origButtons != pMse->buttons)
from = X_CONFIG;
@@ -1992,6 +1998,8 @@
/* Intercept wheel emulation. */
if (pMse->emulateWheel && (buttons & pMse->wheelButtonMask)) {
+ pMse->wheelButtonMoved += abs(dx) + abs(dy);
+
/* Y axis movement */
if (pMse->negativeY != MSE_NOAXISMAP) {
pMse->wheelYDistance += dy;
@@ -2044,10 +2052,9 @@
}
}
- /* Absorb the mouse movement and the wheel button press. */
+ /* Absorb the mouse movement. */
dx = 0;
dy = 0;
- buttons &= ~pMse->wheelButtonMask;
}
if (dx || dy)
@@ -2060,6 +2067,31 @@
else
change = buttons ^ reverseBits(reverseMap, pMse->lastButtons);
+ /* We generally swallow wheelButtonMask events, except when a wheel
+ * button is released, and we haven't moved the mouse since a wheel
+ * button was pressed, and EmulateWheelClickToo is set. */
+
+ if (pMse->emulateWheel && change & pMse->wheelButtonMask) {
+ int wheelChange = change & pMse->wheelButtonMask;
+
+ while (wheelChange) {
+ id = ffs(wheelChange);
+ wheelChange &= ~(1 << (id - 1));
+ if (pMse->wheelButtonClick &&
+ ! (buttons & (1 << (id - 1))) && /* released */
+ pMse->wheelButtonMoved < 5) {
+ xf86PostButtonEvent(pInfo->dev, 0, id, 1, 0, 0);
+ xf86PostButtonEvent(pInfo->dev, 0, id, 0, 0, 0);
+ }
+ }
+
+ if (! (buttons & pMse->wheelButtonMask))
+ pMse->wheelButtonMoved = 0;
+
+ buttons &= ~pMse->wheelButtonMask;
+ change &= ~pMse->wheelButtonMask;
+ }
+
/*
* adjust buttons state for drag locks!
* if there is drag locks
--- hw/xfree86/input/mouse/mouse.man.orig 2004-08-15 01:04:07.000000000 -0700
+++ hw/xfree86/input/mouse/mouse.man 2004-08-15 01:16:00.000000000 -0700
@@ -112,6 +112,12 @@
.B YAxisMapping
settings. Default: 4.
.TP 7
+.BI "Option \*qEmulateWheelClickToo\*q \*q" boolean \*q
+Causes
+.B EmulateWheelButton
+to generate normal clicks when the mouse isn't moved between press and
+release. Default: off
+.TP 7
.BI "Option \*qEmulateWheelInertia\*q \*q" integer \*q
Specifies how far (in pixels) the pointer must move to generate button
press/release events in wheel emulation mode. Default: 50.
More information about the xorg
mailing list