From 5700a0eb4c8d275cd43b9fc3a3a39172f6a62b96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 17 Jun 2021 06:13:16 +0200 Subject: [PATCH] fix saved cursor pos --- src/dd.c | 6 +++--- src/directinput.c | 2 +- src/mouse.c | 18 ++++++++++++------ src/winapi_hooks.c | 43 ++++++++++++++++++++++++++++--------------- src/wndproc.c | 45 ++++++++++++++++++++++++++++----------------- 5 files changed, 72 insertions(+), 42 deletions(-) diff --git a/src/dd.c b/src/dd.c index 4826bd9..5923f49 100644 --- a/src/dd.c +++ b/src/dd.c @@ -461,8 +461,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, BOOL setBy g_ddraw->height = dwHeight; g_ddraw->bpp = dwBPP; - g_ddraw->cursor.x = dwWidth / 2; - g_ddraw->cursor.y = dwHeight / 2; + InterlockedExchange((LONG*)&g_ddraw->cursor.x, dwWidth / 2); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, dwHeight / 2); BOOL border = g_ddraw->border; @@ -820,7 +820,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } int cursor_count = real_ShowCursor(TRUE) - 1; - InterlockedExchange(&g_ddraw->show_cursor_count, cursor_count); + InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, cursor_count); real_ShowCursor(FALSE); /* Make sure the cursor is visible in windowed mode initially */ diff --git a/src/directinput.c b/src/directinput.c index 5733e0e..e79435e 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -104,7 +104,7 @@ static HRESULT WINAPI fake_di_CreateDevice( while (real_ShowCursor(FALSE) >= 0); } - InterlockedExchange(&g_ddraw->show_cursor_count, -1); + InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, -1); } real_did_SetCooperativeLevel = diff --git a/src/mouse.c b/src/mouse.c index e7c26ee..e56ac2a 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -42,15 +42,18 @@ void mouse_lock() rc.bottom -= (LONG)((g_ddraw->mouse_y_adjust * 2) * g_ddraw->render.scale_h); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); + if (g_ddraw->adjmouse) { real_SetCursorPos( - (int)(rc.left + (g_ddraw->cursor.x * g_ddraw->render.scale_w)), - (int)(rc.top + ((g_ddraw->cursor.y - g_ddraw->mouse_y_adjust) * g_ddraw->render.scale_h))); + (int)(rc.left + (cur_x * g_ddraw->render.scale_w)), + (int)(rc.top + ((cur_y - g_ddraw->mouse_y_adjust) * g_ddraw->render.scale_h))); } else { - real_SetCursorPos(rc.left + g_ddraw->cursor.x, rc.top + g_ddraw->cursor.y - g_ddraw->mouse_y_adjust); + real_SetCursorPos(rc.left + cur_x, rc.top + cur_y - g_ddraw->mouse_y_adjust); } real_SetCursor(g_ddraw->old_cursor); @@ -58,7 +61,7 @@ void mouse_lock() int cur_count = real_ShowCursor(TRUE) - 1; real_ShowCursor(FALSE); - int game_count = InterlockedExchangeAdd(&g_ddraw->show_cursor_count, 0); + int game_count = (int)InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); if (cur_count > game_count) { @@ -112,8 +115,11 @@ void mouse_unlock() real_ClipCursor(NULL); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); + real_SetCursorPos( - (int)(rc.left + g_ddraw->render.viewport.x + (g_ddraw->cursor.x * g_ddraw->render.scale_w)), - (int)(rc.top + g_ddraw->render.viewport.y + ((g_ddraw->cursor.y + g_ddraw->mouse_y_adjust) * g_ddraw->render.scale_h))); + (int)(rc.left + g_ddraw->render.viewport.x + (cur_x * g_ddraw->render.scale_w)), + (int)(rc.top + g_ddraw->render.viewport.y + ((cur_y + g_ddraw->mouse_y_adjust) * g_ddraw->render.scale_h))); } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c09d186..6b31f5a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -59,16 +59,18 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (diffx || diffy) real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); + int x = 0; + int y = 0; if (g_ddraw->adjmouse) { - g_ddraw->cursor.x = min((DWORD)(roundf(pt.x * g_ddraw->render.unscale_w)), g_ddraw->width); - g_ddraw->cursor.y = min((DWORD)(roundf(pt.y * g_ddraw->render.unscale_h)), g_ddraw->height); + x = min((DWORD)(roundf(pt.x * g_ddraw->render.unscale_w)), g_ddraw->width); + y = min((DWORD)(roundf(pt.y * g_ddraw->render.unscale_h)), g_ddraw->height); } else { - g_ddraw->cursor.x = pt.x; - g_ddraw->cursor.y = pt.y; + x = pt.x; + y = pt.y; } if (g_ddraw->vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0)) @@ -76,27 +78,38 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) diffx = 0; diffy = 0; - if (g_ddraw->cursor.x > g_ddraw->upscale_hack_width) + if (x > g_ddraw->upscale_hack_width) { - diffx = g_ddraw->cursor.x - g_ddraw->upscale_hack_width; - g_ddraw->cursor.x = g_ddraw->upscale_hack_width; + diffx = x - g_ddraw->upscale_hack_width; + x = g_ddraw->upscale_hack_width; } - if (g_ddraw->cursor.y > g_ddraw->upscale_hack_height) + if (y > g_ddraw->upscale_hack_height) { - diffy = g_ddraw->cursor.y - g_ddraw->upscale_hack_height; - g_ddraw->cursor.y = g_ddraw->upscale_hack_height; + diffy = y - g_ddraw->upscale_hack_height; + y = g_ddraw->upscale_hack_height; } if (diffx || diffy) real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); } + + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + + if (lpPoint) + { + lpPoint->x = x; + lpPoint->y = y; + } + + return TRUE; } if (lpPoint) { - lpPoint->x = g_ddraw->cursor.x; - lpPoint->y = g_ddraw->cursor.y; + lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); + lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); } return TRUE; @@ -120,14 +133,14 @@ int WINAPI fake_ShowCursor(BOOL bShow) if (g_ddraw->locked || g_ddraw->devmode) { int count = real_ShowCursor(bShow); - InterlockedExchange(&g_ddraw->show_cursor_count, count); + InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count); return count; } else { return bShow ? - InterlockedIncrement(&g_ddraw->show_cursor_count) : - InterlockedDecrement(&g_ddraw->show_cursor_count); + InterlockedIncrement((LONG*)&g_ddraw->show_cursor_count) : + InterlockedDecrement((LONG*)&g_ddraw->show_cursor_count); } } diff --git a/src/wndproc.c b/src/wndproc.c index 8518ec8..98ce099 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -1,5 +1,6 @@ #include #include +#include #include "dllmain.h" #include "dd.h" #include "hook.h" @@ -636,15 +637,18 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height || y < g_ddraw->render.viewport.y) { - g_ddraw->cursor.x = g_ddraw->width / 2; - g_ddraw->cursor.y = g_ddraw->height / 2; + x = g_ddraw->width / 2; + y = g_ddraw->height / 2; } else { - g_ddraw->cursor.x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); - g_ddraw->cursor.y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); + x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); + y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); } + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + mouse_lock(); return 0; } @@ -684,8 +688,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->adjmouse) { - fake_GetCursorPos(NULL); /* update our own cursor */ - lParam = MAKELPARAM(g_ddraw->cursor.x, g_ddraw->cursor.y); + POINT pt; + fake_GetCursorPos(&pt); + lParam = MAKELPARAM(pt.x, pt.y); } } @@ -693,15 +698,18 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw->adjmouse) { - g_ddraw->cursor.x = (DWORD)(roundf(GET_X_LPARAM(lParam) * g_ddraw->render.unscale_w)); - g_ddraw->cursor.y = (DWORD)(roundf(GET_Y_LPARAM(lParam) * g_ddraw->render.unscale_h)); + x = (DWORD)(roundf(GET_X_LPARAM(lParam) * g_ddraw->render.unscale_w)); + y = (DWORD)(roundf(GET_Y_LPARAM(lParam) * g_ddraw->render.unscale_h)); - lParam = MAKELPARAM(g_ddraw->cursor.x, g_ddraw->cursor.y); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + + lParam = MAKELPARAM(x, y); } else { - g_ddraw->cursor.x = GET_X_LPARAM(lParam); - g_ddraw->cursor.y = GET_Y_LPARAM(lParam); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, GET_X_LPARAM(lParam)); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, GET_Y_LPARAM(lParam)); } } @@ -710,8 +718,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam x = min(GET_X_LPARAM(lParam), g_ddraw->width); y = min(GET_Y_LPARAM(lParam), g_ddraw->height); - g_ddraw->cursor.x = x; - g_ddraw->cursor.y = y; + if (g_ddraw->devmode) + { + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + } lParam = MAKELPARAM(x, y); } @@ -732,11 +743,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_ddraw->devmode && !g_ddraw->locked) { - int x = GET_X_LPARAM(lParam); - int y = GET_Y_LPARAM(lParam); + int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); + int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); - g_ddraw->cursor.x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); - g_ddraw->cursor.y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); mouse_lock(); }