[Xorg] [PATCH] allow EmulateWheel to generate normal clicks too
Jim Gettys
Jim.Gettys at hp.com
Sun Aug 15 11:10:49 PDT 2004
Andrew,
It is too late to consider this for the upcoming release.
But please put this in the bugzilla so we won't lose it.
- Jim
On Sun, 2004-08-15 at 04:55, Andrew Pimlott wrote:
> I just got hooked on the EmulateWheel feature, for which I use
> EmulateWheelButton 2. But I also like having a third button, and I
> believe it's possible to have the best of both: If I press button 2 and
> release it without moving the mouse, it's a button 2 press; otherwise,
> it's an emulated wheel.
>
> This doesn't work for everyone. It requires you to press and release a
> button without moving the mouse, which may be hard with a normal mouse,
> but easy with a trackball or trackpoint. And it requires you not to
> press button 2 to scroll, then change your mind and release without
> moving the mouse. But I have found I never do this anyway, so the
> behavior I've implemented works great.
>
> I have put this behavior under the option EmulateWheelClickToo, which
> defaults to off.
>
> The patch is fairly straightforward, except someone should check my
> addition to the man page, because I just aped what I saw.
>
> Andrew
>
>
> --- hw/xfree86/os-support/xf86OSmouse.h.orig 2004-08-15 00:24:15.000000000 -0700
> +++ hw/xfree86/os-support/xf86OSmouse.h 2004-08-15 01:02:04.000000000 -0700
> @@ -150,6 +150,8 @@
> Bool emulateWheel;
> int wheelInertia;
> int wheelButtonMask;
> + Bool wheelButtonClick;
> + Bool 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-15 01:15:47.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 = pMse->wheelButtonMoved || dx || 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) {
> + 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.
>
>
> _______________________________________________
> xorg mailing list
> xorg at freedesktop.org
> http://freedesktop.org/mailman/listinfo/xorg
More information about the xorg
mailing list