diff --git a/src/lib/deskflow/ISecondaryScreen.h b/src/lib/deskflow/ISecondaryScreen.h index 714695c66..04534c9bf 100644 --- a/src/lib/deskflow/ISecondaryScreen.h +++ b/src/lib/deskflow/ISecondaryScreen.h @@ -50,11 +50,10 @@ public: /** * @brief Synthesize a mouse wheel event of amount - * This method should include the use of `applyScrollModifier` before sending the delta - * @param xDelta - * @param yDelta + * This Implmentation for this method should call `applyScrollModifier` before sending the final delta to the system + * @param delta the raw delta to fake */ - virtual void fakeMouseWheel(int32_t xDelta, int32_t yDelta) const = 0; + virtual void fakeMouseWheel(ScrollDelta delta) const = 0; /** * @brief Applies any scroll modfifers to the provided delta, This should only be done inside the subclasses diff --git a/src/lib/deskflow/PlatformScreen.h b/src/lib/deskflow/PlatformScreen.h index 3b00f7f66..242d71007 100644 --- a/src/lib/deskflow/PlatformScreen.h +++ b/src/lib/deskflow/PlatformScreen.h @@ -44,7 +44,7 @@ public: void fakeMouseButton(ButtonID id, bool press) override = 0; void fakeMouseMove(int32_t x, int32_t y) override = 0; void fakeMouseRelativeMove(int32_t dx, int32_t dy) const override = 0; - void fakeMouseWheel(int32_t xDelta, int32_t yDelta) const override = 0; + void fakeMouseWheel(ScrollDelta delta) const override = 0; // IKeyState overrides void updateKeyMap() override; diff --git a/src/lib/deskflow/Screen.cpp b/src/lib/deskflow/Screen.cpp index 3258acbb3..ad4a2ca3e 100644 --- a/src/lib/deskflow/Screen.cpp +++ b/src/lib/deskflow/Screen.cpp @@ -225,7 +225,7 @@ void Screen::mouseRelativeMove(int32_t dx, int32_t dy) const void Screen::mouseWheel(int32_t xDelta, int32_t yDelta) const { assert(!m_isPrimary); - m_screen->fakeMouseWheel(xDelta, yDelta); + m_screen->fakeMouseWheel({xDelta, yDelta}); } void Screen::resetOptions() diff --git a/src/lib/platform/EiScreen.cpp b/src/lib/platform/EiScreen.cpp index 22aa637c0..dbcad364d 100644 --- a/src/lib/platform/EiScreen.cpp +++ b/src/lib/platform/EiScreen.cpp @@ -313,16 +313,16 @@ void EiScreen::fakeMouseRelativeMove(int32_t dx, int32_t dy) const ei_device_frame(m_eiPointer, ei_now(m_ei)); } -void EiScreen::fakeMouseWheel(int32_t xDelta, int32_t yDelta) const +void EiScreen::fakeMouseWheel(ScrollDelta delta) const { if (!m_eiPointer) return; - auto adjustedDeltas = applyScrollModifier({xDelta, yDelta}); + delta = applyScrollModifier(delta); // libei and deskflow seem to use opposite directions, so we have // to send EI the opposite of the value received if we want to remain // compatible with other platforms (including X11). - ei_device_scroll_discrete(m_eiPointer, -adjustedDeltas.x, -adjustedDeltas.y); + ei_device_scroll_discrete(m_eiPointer, -delta.x, -delta.y); ei_device_frame(m_eiPointer, ei_now(m_ei)); } diff --git a/src/lib/platform/EiScreen.h b/src/lib/platform/EiScreen.h index 5fad4b772..f5fbd6f51 100644 --- a/src/lib/platform/EiScreen.h +++ b/src/lib/platform/EiScreen.h @@ -59,7 +59,7 @@ public: void fakeMouseButton(ButtonID id, bool press) override; void fakeMouseMove(std::int32_t x, std::int32_t y) override; void fakeMouseRelativeMove(std::int32_t dx, std::int32_t dy) const override; - void fakeMouseWheel(std::int32_t xDelta, std::int32_t yDelta) const override; + void fakeMouseWheel(ScrollDelta delta) const override; void fakeKey(std::uint32_t keycode, bool isDown) const; // IPlatformScreen overrides diff --git a/src/lib/platform/MSWindowsScreen.cpp b/src/lib/platform/MSWindowsScreen.cpp index 07254342d..fcd528b59 100644 --- a/src/lib/platform/MSWindowsScreen.cpp +++ b/src/lib/platform/MSWindowsScreen.cpp @@ -706,10 +706,10 @@ void MSWindowsScreen::fakeMouseRelativeMove(int32_t dx, int32_t dy) const m_desks->fakeMouseRelativeMove(dx, dy); } -void MSWindowsScreen::fakeMouseWheel(int32_t xDelta, int32_t yDelta) const +void MSWindowsScreen::fakeMouseWheel(ScrollDelta delta) const { - auto adjustedDeltas = applyScrollModifier({xDelta, yDelta}); - m_desks->fakeMouseWheel(adjustedDeltas.x, adjustedDeltas.y); + delta = applyScrollModifier(delta); + m_desks->fakeMouseWheel(delta.x, delta.y); } void MSWindowsScreen::updateKeys() diff --git a/src/lib/platform/MSWindowsScreen.h b/src/lib/platform/MSWindowsScreen.h index fb1489121..4d6e951d4 100644 --- a/src/lib/platform/MSWindowsScreen.h +++ b/src/lib/platform/MSWindowsScreen.h @@ -96,7 +96,7 @@ public: void fakeMouseButton(ButtonID id, bool press) override; void fakeMouseMove(int32_t x, int32_t y) override; void fakeMouseRelativeMove(int32_t dx, int32_t dy) const override; - void fakeMouseWheel(int32_t xDelta, int32_t yDelta) const override; + void fakeMouseWheel(ScrollDelta delta) const override; // IKeyState overrides virtual void updateKeys(); diff --git a/src/lib/platform/OSXScreen.h b/src/lib/platform/OSXScreen.h index 3e5cc6a29..87b5f4f5b 100644 --- a/src/lib/platform/OSXScreen.h +++ b/src/lib/platform/OSXScreen.h @@ -74,7 +74,7 @@ public: void fakeMouseButton(ButtonID id, bool press) override; void fakeMouseMove(int32_t x, int32_t y) override; void fakeMouseRelativeMove(int32_t dx, int32_t dy) const override; - void fakeMouseWheel(int32_t xDelta, int32_t yDelta) const override; + void fakeMouseWheel(ScrollDelta delta) const override; // IPlatformScreen overrides void enable() override; diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.mm index b11353d96..2bd00d2f0 100644 --- a/src/lib/platform/OSXScreen.mm +++ b/src/lib/platform/OSXScreen.mm @@ -584,17 +584,16 @@ void OSXScreen::fakeMouseRelativeMove(int32_t dx, int32_t dy) const m_cursorPosValid = false; } -void OSXScreen::fakeMouseWheel(int32_t xDelta, int32_t yDelta) const +void OSXScreen::fakeMouseWheel(ScrollDelta delta) const { - if (xDelta != 0 || yDelta != 0) { + if (delta.x != 0 || delta.y != 0) { // use server's acceleration with a little boost since other platforms // take one wheel step as a larger step than the mac does. - auto adjustedDeltas = - applyScrollModifier({static_cast(3.0 * xDelta / 120.0), static_cast(3.0 * y / 120.0)}); + delta = + applyScrollModifier({static_cast(3.0 * delta.x / 120.0), static_cast(3.0 * delta.y / 120.0)}); // create a scroll event, post it and release it. not sure if kCGScrollEventUnitLine // is the right choice here over kCGScrollEventUnitPixel - CGEventRef scrollEvent = - CGEventCreateScrollWheelEvent(nullptr, kCGScrollEventUnitLine, 2, adjustedDeltas.y, adjustedDeltas.x); + CGEventRef scrollEvent = CGEventCreateScrollWheelEvent(nullptr, kCGScrollEventUnitLine, 2, delta.y, delta.x); // Fix for sticky keys CGEventFlags modifiers = m_keyState->getModifierStateAsOSXFlags(); diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp index fdac7ef0d..f4c33fa24 100644 --- a/src/lib/platform/XWindowsScreen.cpp +++ b/src/lib/platform/XWindowsScreen.cpp @@ -784,23 +784,23 @@ void XWindowsScreen::fakeMouseRelativeMove(int32_t dx, int32_t dy) const XFlush(m_display); } -void XWindowsScreen::fakeMouseWheel(int32_t, int32_t yDelta) const +void XWindowsScreen::fakeMouseWheel(ScrollDelta delta) const { // XXX -- support x-axis scrolling - if (yDelta == 0) { + if (delta.y == 0) { return; } - yDelta = applyScrollModifier({0, yDelta}).y; + delta = applyScrollModifier(delta); // choose button depending on rotation direction - const unsigned int xButton = mapButtonToX(yDelta >= 0 ? kX11ScrollWheelUp : kX11ScrollWheelDown); + const unsigned int xButton = mapButtonToX(delta.y >= 0 ? kX11ScrollWheelUp : kX11ScrollWheelDown); if (xButton == 0) { // If we get here, then the XServer does not support the scroll // wheel buttons, so send PageUp/PageDown keystrokes instead. // Patch by Tom Chadwick. KeyCode keycode = 0; - if (yDelta >= 0) { + if (delta.y >= 0) { keycode = XKeysymToKeycode(m_display, XK_Page_Up); } else { keycode = XKeysymToKeycode(m_display, XK_Page_Down); @@ -813,15 +813,15 @@ void XWindowsScreen::fakeMouseWheel(int32_t, int32_t yDelta) const } // now use absolute value of delta - if (yDelta < 0) { - yDelta = -yDelta; + if (delta.y < 0) { + delta.y = -delta.y; } // Delta for a "click" static const auto s_mouseDelta = 120; // send as many clicks as necessary - for (; yDelta >= 0; yDelta -= s_mouseDelta) { + for (; delta.y >= 0; delta.y -= s_mouseDelta) { XTestFakeButtonEvent(m_display, xButton, True, CurrentTime); XTestFakeButtonEvent(m_display, xButton, False, CurrentTime); } diff --git a/src/lib/platform/XWindowsScreen.h b/src/lib/platform/XWindowsScreen.h index f0471fe1d..f2093e6d9 100644 --- a/src/lib/platform/XWindowsScreen.h +++ b/src/lib/platform/XWindowsScreen.h @@ -58,7 +58,7 @@ public: void fakeMouseButton(ButtonID id, bool press) override; void fakeMouseMove(int32_t x, int32_t y) override; void fakeMouseRelativeMove(int32_t dx, int32_t dy) const override; - void fakeMouseWheel(int32_t xDelta, int32_t yDelta) const override; + void fakeMouseWheel(ScrollDelta delta) const override; // IPlatformScreen overrides void enable() override;