| Summary: | [PATCH] RFE: Generate MouseUp event on EmulateWheel button release | ||
|---|---|---|---|
| Product: | xorg | Reporter: | Daniel Stone <daniel> |
| Component: | Input/Mouse | Assignee: | Xorg Project Team <xorg-team> |
| Status: | RESOLVED FIXED | QA Contact: | |
| Severity: | normal | ||
| Priority: | high | CC: | erik.andren, heilong, mat |
| Version: | unspecified | Keywords: | patch |
| Hardware: | x86 (IA32) | ||
| OS: | Windows (All) | ||
| Whiteboard: | |||
| i915 platform: | i915 features: | ||
|
Description
FreeDesktop Bugzilla Database Corruption Fix User
2005-06-16 04:11:02 UTC
I believe the windoze drivers logic is the following - if the middle button is pressed and released without changing the cursor position, then the click event is generated. It could be implemented by keeping a counter of scrolling events emitted, setting it to zero when an EmulateButton is pressed, incrementing it each time any movement (and, thus, scrolling events) occurs, and generating a normal EmulateButton click event if this counter is zero upon EmulateButton unpress. I've just found out that there's already a patch for this, made in Aug 2004! Why isn't it included in the release yet? http://lists.freedesktop.org/pipermail/xorg/2004-August/002404.html Andrew Pimlott andrew at pimlott.net Sun Aug 15 01:55:00 PDT 2004 * Previous message: [Xorg] composite / kde * Next message: [Xorg] [PATCH] allow EmulateWheel to generate normal clicks too * Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] 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. Original reporter e-mail and comments lost in bugzilla disk death.
xorg-team archives show:
Summary: RFE: Generate MouseUp event on EmulateWheel button
release
Product: xorg
Version: unspecified
Platform: PC
OS/Version: Windows XP
Status: NEW
Severity: normal
Priority: P2
Component: Input/Mouse
AssignedTo: xorg-team at lists.x.org
ReportedBy: heilong at bluebottle.com
I've got a thinkpad with trackpoint, and am using EmulateWheel to (middle-button
as EmulateButton) to get horizontal/vertical scrolling. There is the same
feature on windoze, only there the middle button not only works as a
EmulateWheel button, but it also generates click events. I think an option
should be added so that the EmulateButton will generate click events on MouseUp
apart from scrolling events.
It's very inconvenient that I can't use my trackpoint middle button to open tabs
in background in mozilla, while I could do that in windoze.
------- Additional Comments From heilong at bluebottle.com 2005-06-16 04:27 -------
I believe the windoze drivers logic is the following - if the middle button is
pressed and released without changing the cursor position, then the click event
is generated. It could be implemented by keeping a counter of scrolling events
emitted, setting it to zero when an EmulateButton is pressed, incrementing it
each time any movement (and, thus, scrolling events) occurs, and generating a
normal EmulateButton click event if this counter is zero upon EmulateButton
unpress.
------- Additional Comments From heilong at bluebottle.com 2005-06-16 04:45 -------
I've just found out that there's already a patch for this, made in Aug 2004! Why
isn't it included in the release yet?
http://lists.freedesktop.org/pipermail/xorg/2004-August/002404.html
Andrew Pimlott andrew at pimlott.net
Sun Aug 15 01:55:00 PDT 2004
* Previous message: [Xorg] composite / kde
* Next message: [Xorg] [PATCH] allow EmulateWheel to generate normal clicks too
* Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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.
Added patch keyword matthias, does this look alright to you? eh, latest x.org's emulatewheel works exactly as needed even better |
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.