refactor: use ScrollDelta for fakeMouseWheel

This commit is contained in:
sithlord48 2026-02-06 09:55:41 -05:00 committed by Nick Bolton
parent 5612e99f1d
commit 050cb649c2
11 changed files with 28 additions and 30 deletions

View file

@ -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

View file

@ -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;

View file

@ -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()

View file

@ -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));
}

View file

@ -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

View file

@ -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()

View file

@ -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();

View file

@ -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;

View file

@ -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<int32_t>(3.0 * xDelta / 120.0), static_cast<int32_t>(3.0 * y / 120.0)});
delta =
applyScrollModifier({static_cast<int32_t>(3.0 * delta.x / 120.0), static_cast<int32_t>(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();

View file

@ -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);
}

View file

@ -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;