# User Darren Salt # Date 1379621782 -3600 # Thu Sep 19 21:16:22 2013 +0100 Work around a false-positive in the X11 mouse wheel code This false positive occurs when one particular button on my mouse is pressed. The kernel which I'm using is patched to cause a release event to be synthesised immediately when the mouse says that this button is pressed because the mouse doesn't signal release until the button is next pressed. (Also documents a false negative, observed with the horizontal scroll wheel on the same mouse.) diff -ur libsdl2-2.0.0+dfsg1.orig/src/video/x11/SDL_x11events.c libsdl2-2.0.0+dfsg1/src/video/x11/SDL_x11events.c --- libsdl2-2.0.0+dfsg1.orig/src/video/x11/SDL_x11events.c 2013-09-19 21:36:30.000000000 +0100 +++ libsdl2-2.0.0+dfsg1/src/video/x11/SDL_x11events.c 2013-09-19 21:34:59.582201080 +0100 @@ -135,7 +135,9 @@ XPointer arg) { XEvent *event = (XEvent *) arg; + /* we only handle buttons 4 and 5 - false positive avoidance */ if (chkev->type == ButtonRelease && + (event->xbutton.button == Button4 || event->xbutton.button == Button5) && chkev->xbutton.button == event->xbutton.button && chkev->xbutton.time == event->xbutton.time) return True; @@ -150,7 +152,12 @@ however, mouse wheel events trigger a button press and a button release immediately. thus, checking if the same button was released at the same time as it was pressed, should be an adequate hack to derive a mouse - wheel event. */ + wheel event. + However, there is broken and unusual hardware out there... + - False positive: a button for which a release event is + generated (or synthesised) immediately. + - False negative: a wheel which, when rolled, doesn't have + a release event generated immediately. */ if (XCheckIfEvent(display, &relevent, X11_IsWheelCheckIfEvent, (XPointer) event)) {