diff options
| author | 2018-09-19 18:24:12 -0400 | |
|---|---|---|
| committer | 2018-09-19 18:24:12 -0400 | |
| commit | a12f59bc78d8eab79d24e2e625a9a85b81c20a54 (patch) | |
| tree | f9d4bceac647f7f9ce335881f40be31169435349 /src/lib/platform/XWindowsScreen.cpp | |
| parent | 7a723cbbf3b9ba1cf23ca67a08058b41e56831e8 (diff) | |
| parent | 68a36b3b67ec82cdd3f77e88e40d1043cbab5000 (diff) | |
Update upstream source from tag 'upstream/2.1.2+dfsg'
Update to upstream version '2.1.2+dfsg'
with Debian dir a655df7e32df947a70958a6a26869e4705733064
Diffstat (limited to 'src/lib/platform/XWindowsScreen.cpp')
| -rw-r--r-- | src/lib/platform/XWindowsScreen.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp index 581c911..2846412 100644 --- a/src/lib/platform/XWindowsScreen.cpp +++ b/src/lib/platform/XWindowsScreen.cpp @@ -99,6 +99,7 @@ XWindowsScreen::XWindowsScreen( IEventQueue* events) : m_isPrimary(isPrimary), m_mouseScrollDelta(mouseScrollDelta), + m_accumulatedScroll(0), m_display(NULL), m_root(None), m_window(None), @@ -865,9 +866,11 @@ XWindowsScreen::fakeMouseWheel(SInt32, SInt32 yDelta) const return; } - // choose button depending on rotation direction - const unsigned int xButton = mapButtonToX(static_cast<ButtonID>( - (yDelta >= 0) ? -1 : -2)); + int numEvents = accumulateMouseScroll(yDelta); + + // choose button depending on rotation direction + const unsigned int xButton = mapButtonToX(static_cast<ButtonID>( + (numEvents >= 0) ? -1 : -2)); if (xButton == 0) { // If we get here, then the XServer does not support the scroll // wheel buttons, so send PageUp/PageDown keystrokes instead. @@ -886,20 +889,14 @@ XWindowsScreen::fakeMouseWheel(SInt32, SInt32 yDelta) const return; } - // now use absolute value of delta - if (yDelta < 0) { - yDelta = -yDelta; - } - - if (yDelta < m_mouseScrollDelta) { - LOG((CLOG_WARN "Wheel scroll delta (%d) smaller than threshold (%d)", yDelta, m_mouseScrollDelta)); - } + numEvents = std::abs(numEvents); // send as many clicks as necessary - for (; yDelta >= m_mouseScrollDelta; yDelta -= m_mouseScrollDelta) { + for (; numEvents > 0; numEvents--) { XTestFakeButtonEvent(m_display, xButton, True, CurrentTime); XTestFakeButtonEvent(m_display, xButton, False, CurrentTime); } + XFlush(m_display); } @@ -1643,6 +1640,15 @@ XWindowsScreen::onMouseMove(const XMotionEvent& xmotion) } } +int +XWindowsScreen::accumulateMouseScroll(SInt32 yDelta) const +{ + m_accumulatedScroll += yDelta; + int numEvents = m_accumulatedScroll / m_mouseScrollDelta; + m_accumulatedScroll -= numEvents * m_mouseScrollDelta; + return numEvents; +} + Cursor XWindowsScreen::createBlankCursor() const { |
