add cursor history for missed mouse move events on Windows (only for left click)

This commit is contained in:
2017-09-28 21:35:58 +01:00
parent c85ce8cb8f
commit b4b9cf2a7c

View File

@@ -321,6 +321,9 @@ int main()
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static bool leftDown = false;
static DWORD lastTime;
static POINT lastPoint;
switch (msg)
{
case WM_CREATE:
@@ -367,18 +370,60 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
break;
case WM_MOUSEMOVE:
//TODO: find a way to check if event is mouse/stylus. For now use Mouse for all
App::I.mouse_move((float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse);
if (leftDown)
{
POINT pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) };
// See discussion for why this code is wrong
ClientToScreen(hWnd, &pt);
MOUSEMOVEPOINT mmpt = { pt.x & 0x0000FFFF, pt.y & 0x0000FFFF, GetMessageTime() };
MOUSEMOVEPOINT rgmmpt[64];
int cmmpt = GetMouseMovePointsEx(sizeof(mmpt), &mmpt,
rgmmpt, 64, GMMP_USE_DISPLAY_POINTS);
POINT ptLastScreen = lastPoint;
ClientToScreen(hWnd, &ptLastScreen);
int i;
for (i = 0; i < cmmpt; i++)
{
if (rgmmpt[i].x > 32767) rgmmpt[i].x -= 65536;
if (rgmmpt[i].y > 32767) rgmmpt[i].y -= 65536;
if (rgmmpt[i].time < lastTime) break;
if (rgmmpt[i].time == lastTime &&
rgmmpt[i].x == ptLastScreen.x &&
rgmmpt[i].y == ptLastScreen.y) break;
}
while (--i >= 0)
{
POINT ptClient = { rgmmpt[i].x, rgmmpt[i].y };
ScreenToClient(hWnd, &ptClient);
if (ptClient.x != lastPoint.x || ptClient.y != lastPoint.y)
{
lastPoint = ptClient;
App::I.mouse_move((float)ptClient.x, (float)ptClient.y, WacomTablet::I.get_pressure(), kEventSource::Mouse);
}
}
lastTime = GetMessageTime();
}
else
{
App::I.mouse_move((float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse);
}
break;
case WM_LBUTTONDOWN:
//TODO: find a way to check if event is mouse/stylus. For now use Mouse for all
App::I.mouse_down(0, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse);
leftDown = true;
SetCapture(hWnd);
lastTime = GetMessageTime();
lastPoint = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) };
App::I.mouse_down(0, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse);
break;
case WM_LBUTTONUP:
WacomTablet::I.reset_pressure();
//TODO: find a way to check if event is mouse/stylus. For now use Mouse for all
App::I.mouse_up(0, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), kEventSource::Mouse);
ReleaseCapture();
leftDown = false;
break;
case WM_RBUTTONDOWN:
App::I.mouse_down(1, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), 1.f, kEventSource::Mouse);