From 918037dd3e613e722cfb473c9821022409a028f6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:27:42 +0200 Subject: [PATCH] fix jumping cursor while zooming --- src/dd.c | 4 ++-- src/mouse.c | 31 +++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 819a0fd..42921db 100644 --- a/src/dd.c +++ b/src/dd.c @@ -642,8 +642,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.height = dwHeight; g_ddraw.bpp = dwBPP; - InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2); - InterlockedExchange((LONG*)&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_config.border; BOOL nonexclusive = FALSE; diff --git a/src/mouse.c b/src/mouse.c index c5b25eb..391e985 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -38,12 +38,35 @@ void mouse_lock() real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); - int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + POINT pt; + real_GetCursorPos(&pt); + + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt)) + { + if (pt.x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + pt.x < g_ddraw.render.viewport.x || + pt.y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + pt.y < g_ddraw.render.viewport.y) + { + pt.x = g_ddraw.width / 2; + pt.y = g_ddraw.height / 2; + } + else + { + pt.x = (DWORD)((pt.x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + pt.y = (DWORD)((pt.y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + pt.x = min(pt.x, g_ddraw.width - 1); + pt.y = min(pt.y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, pt.x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, pt.y); + } real_SetCursorPos( - g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x, - g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y); + g_config.adjmouse ? (int)(rc.left + (pt.x * g_ddraw.mouse.scale_x)) : rc.left + pt.x, + g_config.adjmouse ? (int)(rc.top + (pt.y * g_ddraw.mouse.scale_y)) : rc.top + pt.y); CopyRect(&rc, &g_ddraw.mouse.rc); real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);