#5183 Accumulate fractional moves across updates.

This commit is contained in:
Andrew Magill 2016-01-19 00:22:08 -07:00 committed by Andrew Nelless
parent 42ba77ae04
commit 217eb475de
2 changed files with 34 additions and 7 deletions

View File

@ -105,6 +105,7 @@ MSWindowsScreen::MSWindowsScreen(
m_xCenter(0), m_yCenter(0),
m_multimon(false),
m_xCursor(0), m_yCursor(0),
m_xFractionalMove(0.0f), m_yFractionalMove(0.0f),
m_sequenceNumber(0),
m_mark(0),
m_markReceived(0),
@ -575,6 +576,21 @@ void MSWindowsScreen::saveMousePosition(SInt32 x, SInt32 y) {
LOG((CLOG_DEBUG5 "saved mouse position for next delta: %+d,%+d", x,y));
}
void MSWindowsScreen::accumulateFractionalMove(float x, float y, SInt32& intX, SInt32& intY)
{
// Accumulate together the move into the running total
m_xFractionalMove += x;
m_yFractionalMove += y;
// Return the integer part
intX = (SInt32)m_xFractionalMove;
intY = (SInt32)m_yFractionalMove;
// And keep only the fractional part
m_xFractionalMove -= intX;
m_yFractionalMove -= intY;
}
UInt32
MSWindowsScreen::registerHotKey(KeyID key, KeyModifierMask mask)
{
@ -1355,16 +1371,18 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
{
SInt32 originalMX = mx;
SInt32 originalMY = my;
float scaledMX = (float)mx;
float scaledMY = (float)my;
if (DpiHelper::s_dpiScaled) {
mx = (SInt32)(mx / DpiHelper::getDpi());
my = (SInt32)(my / DpiHelper::getDpi());
scaledMX /= DpiHelper::getDpi();
scaledMY /= DpiHelper::getDpi();
}
// compute motion delta (relative to the last known
// mouse position)
SInt32 x = mx - m_xCursor;
SInt32 y = my - m_yCursor;
float x = scaledMX - m_xCursor;
float y = scaledMY - m_yCursor;
LOG((CLOG_DEBUG3
"mouse move - motion delta: %+d=(%+d - %+d),%+d=(%+d - %+d)",
@ -1377,7 +1395,7 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
}
// save position to compute delta of next motion
saveMousePosition(mx, my);
saveMousePosition((SInt32)scaledMX, (SInt32)scaledMY);
if (m_isOnScreen) {
@ -1415,7 +1433,9 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
}
else {
// send motion
sendEvent(m_events->forIPrimaryScreen().motionOnSecondary(), MotionInfo::alloc(x, y));
SInt32 ix, iy;
accumulateFractionalMove(x, y, ix, iy);
sendEvent(m_events->forIPrimaryScreen().motionOnSecondary(), MotionInfo::alloc(ix, iy));
}
}

View File

@ -216,6 +216,10 @@ private: // HACK
// save last position of mouse to compute next delta movement
void saveMousePosition(SInt32 x, SInt32 y);
// accumulates together a series of fractional pixel moves, each time
// taking away and returning just the integer part of the running total.
void accumulateFractionalMove(float x, float y, SInt32& intX, SInt32& intY);
// check if it is a modifier key repeating message
bool isModifierRepeat(KeyModifierMask oldState,
KeyModifierMask state, WPARAM wParam) const;
@ -266,6 +270,9 @@ private:
// last mouse position
SInt32 m_xCursor, m_yCursor;
// accumulated fractional pixel moves
float m_xFractionalMove, m_yFractionalMove;
// last clipboard
UInt32 m_sequenceNumber;