add cursor history for missed mouse move events on Windows (only for left click)
This commit is contained in:
@@ -321,6 +321,9 @@ int main()
|
|||||||
|
|
||||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
|
||||||
{
|
{
|
||||||
|
static bool leftDown = false;
|
||||||
|
static DWORD lastTime;
|
||||||
|
static POINT lastPoint;
|
||||||
switch (msg)
|
switch (msg)
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
@@ -367,18 +370,60 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
|
|||||||
break;
|
break;
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
//TODO: find a way to check if event is mouse/stylus. For now use Mouse for all
|
//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;
|
break;
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
//TODO: find a way to check if event is mouse/stylus. For now use Mouse for all
|
//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);
|
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;
|
break;
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
WacomTablet::I.reset_pressure();
|
WacomTablet::I.reset_pressure();
|
||||||
//TODO: find a way to check if event is mouse/stylus. For now use Mouse for all
|
//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);
|
App::I.mouse_up(0, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), kEventSource::Mouse);
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
|
leftDown = false;
|
||||||
break;
|
break;
|
||||||
case WM_RBUTTONDOWN:
|
case WM_RBUTTONDOWN:
|
||||||
App::I.mouse_down(1, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), 1.f, kEventSource::Mouse);
|
App::I.mouse_down(1, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), 1.f, kEventSource::Mouse);
|
||||||
|
|||||||
Reference in New Issue
Block a user