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)
|
||||
{
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user