From 350cdbd0badd725dc413e8b0eab8bc5cd22cb4e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 19 Jun 2021 04:28:15 +0200 Subject: [PATCH] fix SetCursor hook --- src/dd.c | 15 ++++++++------- src/mouse.c | 7 +++---- src/winapi_hooks.c | 8 ++++---- src/wndproc.c | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/dd.c b/src/dd.c index 5923f49..fa20dc0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -819,19 +819,20 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd); } + if (!g_ddraw->devmode) + { + HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW)); + InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)cursor); + } + int cursor_count = real_ShowCursor(TRUE) - 1; InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, cursor_count); real_ShowCursor(FALSE); /* Make sure the cursor is visible in windowed mode initially */ - if (g_ddraw->windowed && !g_ddraw->fullscreen) + if (g_ddraw->windowed && !g_ddraw->fullscreen && cursor_count < 0) { - if (cursor_count < 0) - { - while (real_ShowCursor(TRUE) < 0); - } - - real_SetCursor(LoadCursor(NULL, IDC_ARROW)); + while (real_ShowCursor(TRUE) < 0); } GetWindowText(g_ddraw->hwnd, (LPTSTR)&g_ddraw->title, sizeof(g_ddraw->title)); diff --git a/src/mouse.c b/src/mouse.c index 21c7596..9f5f79b 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -43,9 +43,7 @@ void mouse_lock() real_SetCursorPos(rc.left + cur_x, rc.top + cur_y - g_ddraw->mouse_y_adjust); } - real_SetCursor(g_ddraw->old_cursor); - - int game_count = (int)InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); + int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; real_ShowCursor(FALSE); @@ -58,6 +56,8 @@ void mouse_lock() while (real_ShowCursor(TRUE) < game_count); } + real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw->old_cursor, 0)); + real_ClipCursor(&rc); g_ddraw->locked = TRUE; @@ -83,7 +83,6 @@ void mouse_unlock() while (real_ShowCursor(TRUE) < 0); } - real_SetCursor(LoadCursor(NULL, IDC_ARROW)); real_ClipCursor(NULL); int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6b31f5a..c02c428 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -151,13 +151,13 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) { if (g_ddraw) { - g_ddraw->old_cursor = hCursor; + HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); - if (g_ddraw->locked || g_ddraw->devmode) - return real_SetCursor(hCursor); + if (!g_ddraw->locked && !g_ddraw->devmode) + return cursor; } - return NULL; + return real_SetCursor(hCursor); } BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) diff --git a/src/wndproc.c b/src/wndproc.c index 294c2a3..dfd55ee 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -105,7 +105,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (!g_ddraw->locked && !g_ddraw->devmode) { real_SetCursor(LoadCursor(NULL, IDC_ARROW)); - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return TRUE; } default: break;