Hello, recently I've been gifted with/annoyed by a Toshiba laptop with a nipple-mouse and two buttons only. This has some consequences;
either middle-mouse emulation but no scroll-emulation; or scroll-emulation on right button, but then: no middle mouse emulation, not possible to right-click drag (resizing windows, context-menus in git, etc.) or scroll-emulation on left button, but then: no middle mouse emulation, not possible to select text, move windows or left-button drag&drop There are several related bugs, some also with some patches: https://bugs.freedesktop.org/show_bug.cgi?id=39174 to have wheel emu on emulated middle mouse https://bugs.freedesktop.org/show_bug.cgi?id=58763 explaining the status quo https://bugs.freedesktop.org/show_bug.cgi?id=2065 using the wheel emulation from another mouse https://bugs.freedesktop.org/show_bug.cgi?id=70780 patch to do this on a synaptics hardcoded for IBM trackpoints Since I'm now affected by this and would like to fix it, some things I'd like to look into is either like #39174 to support the wheel emulation through emulated middle button, and/or put the wheel emulation on left mouse button, but *pass through* movement so that move/text selection/dnd still work (similar to the button emulation for single-button mice), but also make sure that middle-mouse emulation can work. Being new to Xorg, I've attached a PoC to pass through the movement operations, which works and restores the ability to move windows etc, but still doesn't give middle-mouse emulation because that is snatched away by the wheel emulation code. I'd appreciate any input how I should proceed to evolve the code which would eventually be acceptable for merge into the driver. Thanks, Nei diff -pru a/src/emuWheel.c b/src/emuWheel.c --- a/src/emuWheel.c 2014-05-13 07:38:52.000000000 +0200 +++ b/src/emuWheel.c 2015-01-19 17:10:54.366213413 +0100 @@ -66,6 +66,9 @@ EvdevWheelEmuFilterButton(InputInfoPtr p /* Check for EmulateWheelButton */ if (pEvdev->emulateWheel.button == button) { + if (pEvdev->emulateWheel.button_state == value) + return FALSE; + pEvdev->emulateWheel.button_state = value; if (value) @@ -110,8 +113,11 @@ EvdevWheelEmuFilterMotion(InputInfoPtr p if (pEvdev->emulateWheel.button) { int ms = pEvdev->emulateWheel.expires - GetTimeInMillis(); - if (ms > 0) + if (ms > 0) { + EvdevPostButtonEvent(pInfo, pEvdev->emulateWheel.button, BUTTON_PRESS); + pEvdev->emulateWheel.button_state = 0; + return FALSE; - return TRUE; + } } if(pEv->type == EV_ABS) { _______________________________________________ xorg@lists.x.org: X.Org support Archives: http://lists.freedesktop.org/archives/xorg Info: http://lists.x.org/mailman/listinfo/xorg Your subscription address: %(user_address)s