mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Make GetCursorPos constant in WM_MOUSEMOVE handler
Fixes most of the cursor trails in Lego Loco (#179).
This commit is contained in:
parent
ca485fc15c
commit
df0b071ddf
@ -191,7 +191,7 @@ namespace Gdi
|
|||||||
g_prevCursorInfo = {};
|
g_prevCursorInfo = {};
|
||||||
|
|
||||||
POINT pos = {};
|
POINT pos = {};
|
||||||
GetCursorPos(&pos);
|
CALL_ORIG_FUNC(GetCursorPos)(&pos);
|
||||||
SetCursorPos(pos.x, pos.y);
|
SetCursorPos(pos.x, pos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
#include <Windowsx.h>
|
||||||
|
|
||||||
#include <Common/Hook.h>
|
#include <Common/Hook.h>
|
||||||
#include <Common/Log.h>
|
#include <Common/Log.h>
|
||||||
@ -54,6 +55,7 @@ namespace
|
|||||||
Compat::SrwLock g_windowProcSrwLock;
|
Compat::SrwLock g_windowProcSrwLock;
|
||||||
std::map<HWND, WindowProc> g_windowProc;
|
std::map<HWND, WindowProc> g_windowProc;
|
||||||
|
|
||||||
|
thread_local POINT* g_cursorPos = nullptr;
|
||||||
thread_local unsigned g_inCreateDialog = 0;
|
thread_local unsigned g_inCreateDialog = 0;
|
||||||
thread_local unsigned g_inMessageBox = 0;
|
thread_local unsigned g_inMessageBox = 0;
|
||||||
thread_local unsigned g_inWindowProc = 0;
|
thread_local unsigned g_inWindowProc = 0;
|
||||||
@ -88,6 +90,7 @@ namespace
|
|||||||
{
|
{
|
||||||
LOG_FUNC("ddcWindowProc", Compat::WindowMessageStruct(hwnd, uMsg, wParam, lParam));
|
LOG_FUNC("ddcWindowProc", Compat::WindowMessageStruct(hwnd, uMsg, wParam, lParam));
|
||||||
ScopedIncrement inc(g_inWindowProc);
|
ScopedIncrement inc(g_inWindowProc);
|
||||||
|
POINT cursorPos = {};
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
@ -111,6 +114,15 @@ namespace
|
|||||||
onInitDialog(hwnd);
|
onInitDialog(hwnd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
if (1 == g_inWindowProc)
|
||||||
|
{
|
||||||
|
cursorPos = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
|
||||||
|
ClientToScreen(hwnd, &cursorPos);
|
||||||
|
g_cursorPos = &cursorPos;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_SYNCPAINT:
|
case WM_SYNCPAINT:
|
||||||
if (Gdi::Window::isTopLevelWindow(hwnd))
|
if (Gdi::Window::isTopLevelWindow(hwnd))
|
||||||
{
|
{
|
||||||
@ -190,6 +202,13 @@ namespace
|
|||||||
onInitMenuPopup(reinterpret_cast<HMENU>(wParam));
|
onInitMenuPopup(reinterpret_cast<HMENU>(wParam));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
if (1 == g_inWindowProc)
|
||||||
|
{
|
||||||
|
g_cursorPos = nullptr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_NCDESTROY:
|
case WM_NCDESTROY:
|
||||||
onDestroyWindow(hwnd);
|
onDestroyWindow(hwnd);
|
||||||
break;
|
break;
|
||||||
@ -247,6 +266,16 @@ namespace
|
|||||||
return LOG_RESULT(CALL_ORIG_FUNC(SetWindowLongA)(hWnd, nIndex, dwNewLong));
|
return LOG_RESULT(CALL_ORIG_FUNC(SetWindowLongA)(hWnd, nIndex, dwNewLong));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI getCursorPos(LPPOINT lpPoint)
|
||||||
|
{
|
||||||
|
if (lpPoint && g_cursorPos)
|
||||||
|
{
|
||||||
|
*lpPoint = *g_cursorPos;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return CALL_ORIG_FUNC(GetCursorPos)(lpPoint);
|
||||||
|
}
|
||||||
|
|
||||||
BOOL WINAPI getMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,
|
BOOL WINAPI getMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,
|
||||||
decltype(&GetMessageA) origGetMessage)
|
decltype(&GetMessageA) origGetMessage)
|
||||||
{
|
{
|
||||||
@ -719,6 +748,7 @@ namespace Gdi
|
|||||||
HOOK_FUNCTION(user32, DialogBoxParamW, createDialog<DialogBoxParamW>);
|
HOOK_FUNCTION(user32, DialogBoxParamW, createDialog<DialogBoxParamW>);
|
||||||
HOOK_FUNCTION(user32, DialogBoxIndirectParamA, createDialog<DialogBoxIndirectParamA>);
|
HOOK_FUNCTION(user32, DialogBoxIndirectParamA, createDialog<DialogBoxIndirectParamA>);
|
||||||
HOOK_FUNCTION(user32, DialogBoxIndirectParamW, createDialog<DialogBoxIndirectParamW>);
|
HOOK_FUNCTION(user32, DialogBoxIndirectParamW, createDialog<DialogBoxIndirectParamW>);
|
||||||
|
HOOK_FUNCTION(user32, GetCursorPos, getCursorPos);
|
||||||
HOOK_FUNCTION(user32, GetMessageA, getMessageA);
|
HOOK_FUNCTION(user32, GetMessageA, getMessageA);
|
||||||
HOOK_FUNCTION(user32, GetMessageW, getMessageW);
|
HOOK_FUNCTION(user32, GetMessageW, getMessageW);
|
||||||
HOOK_FUNCTION(user32, GetWindowLongA, getWindowLongA);
|
HOOK_FUNCTION(user32, GetWindowLongA, getWindowLongA);
|
||||||
|
@ -103,7 +103,7 @@ namespace
|
|||||||
{
|
{
|
||||||
POINT cp = g_cursorPos;
|
POINT cp = g_cursorPos;
|
||||||
POINT origCp = {};
|
POINT origCp = {};
|
||||||
GetCursorPos(&origCp);
|
CALL_ORIG_FUNC(GetCursorPos)(&origCp);
|
||||||
|
|
||||||
cp.x += (llHook.pt.x - origCp.x);
|
cp.x += (llHook.pt.x - origCp.x);
|
||||||
cp.y += (llHook.pt.y - origCp.y);
|
cp.y += (llHook.pt.y - origCp.y);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user