only lock cursor in borderless if game window is the foreground window

This commit is contained in:
FunkyFr3sh 2022-09-20 08:59:36 +02:00
parent c6701a8cd6
commit 1b791fb2cb
7 changed files with 27 additions and 24 deletions

View file

@ -117,7 +117,6 @@ typedef struct CNCDDRAW
HWND hwnd; HWND hwnd;
WNDPROC wndproc; WNDPROC wndproc;
struct { DWORD x; DWORD y; } cursor; struct { DWORD x; DWORD y; } cursor;
BOOL locked;
BOOL adjmouse; BOOL adjmouse;
BOOL devmode; BOOL devmode;
BOOL vsync; BOOL vsync;

View file

@ -5,6 +5,7 @@ void mouse_lock();
void mouse_unlock(); void mouse_unlock();
LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam);
extern BOOL g_mouse_locked;
extern HHOOK g_mouse_hook; extern HHOOK g_mouse_hook;
extern HOOKPROC g_mouse_proc; extern HOOKPROC g_mouse_proc;

View file

@ -502,7 +502,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
g_ddraw->render.run = TRUE; g_ddraw->render.run = TRUE;
BOOL lock_mouse = (g_ddraw->locked || g_ddraw->fullscreen) && !(dwFlags & SDM_LEAVE_FULLSCREEN); BOOL lock_mouse = g_mouse_locked;
mouse_unlock(); mouse_unlock();
memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE));
@ -722,7 +723,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
} }
} }
if (lock_mouse) if (lock_mouse || (g_ddraw->fullscreen && GetForegroundWindow() == g_ddraw->hwnd))
mouse_lock(); mouse_lock();
} }
else else

View file

@ -5,6 +5,7 @@
#include "debug.h" #include "debug.h"
#include "hook.h" #include "hook.h"
#include "dd.h" #include "dd.h"
#include "mouse.h"
DIRECTINPUTCREATEAPROC real_DirectInputCreateA; DIRECTINPUTCREATEAPROC real_DirectInputCreateA;
@ -41,7 +42,7 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW
if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE))
{ {
if (g_ddraw->locked || g_ddraw->devmode) if (g_mouse_locked || g_ddraw->devmode)
{ {
while (real_ShowCursor(FALSE) >= 0); while (real_ShowCursor(FALSE) >= 0);
} }
@ -63,7 +64,7 @@ static HRESULT WINAPI fake_did_GetDeviceData(
HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags);
if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked) if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked)
{ {
if (pdwInOut) if (pdwInOut)
{ {
@ -85,7 +86,7 @@ static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD c
HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); HRESULT result = real_did_GetDeviceState(This, cbData, lpvData);
if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked) if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked)
{ {
if (cbData > 0 && lpvData) if (cbData > 0 && lpvData)
{ {

View file

@ -5,6 +5,7 @@
#include "hook.h" #include "hook.h"
BOOL g_mouse_locked;
HHOOK g_mouse_hook; HHOOK g_mouse_hook;
HOOKPROC g_mouse_proc; HOOKPROC g_mouse_proc;
@ -13,7 +14,7 @@ void mouse_lock()
if (g_ddraw->devmode || g_ddraw->bnet_active) if (g_ddraw->devmode || g_ddraw->bnet_active)
return; return;
if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd)) if (g_hook_active && !g_mouse_locked && !IsIconic(g_ddraw->hwnd))
{ {
int game_count = 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; int cur_count = real_ShowCursor(TRUE) - 1;
@ -46,7 +47,7 @@ void mouse_lock()
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
real_ClipCursor(&rc); real_ClipCursor(&rc);
g_ddraw->locked = TRUE; g_mouse_locked = TRUE;
} }
} }
@ -55,9 +56,9 @@ void mouse_unlock()
if (g_ddraw->devmode || !g_hook_active) if (g_ddraw->devmode || !g_hook_active)
return; return;
if (g_ddraw->locked) if (g_mouse_locked)
{ {
g_ddraw->locked = FALSE; g_mouse_locked = FALSE;
real_ClipCursor(NULL); real_ClipCursor(NULL);
@ -82,7 +83,7 @@ LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam)
if (!g_ddraw) if (!g_ddraw)
return g_mouse_proc(Code, wParam, lParam); return g_mouse_proc(Code, wParam, lParam);
if (Code < 0 || (!g_ddraw->devmode && !g_ddraw->locked)) if (Code < 0 || (!g_ddraw->devmode && !g_mouse_locked))
return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); return CallNextHookEx(g_mouse_hook, Code, wParam, lParam);
fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt);

View file

@ -23,7 +23,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
realpt.x = pt.x; realpt.x = pt.x;
realpt.y = pt.y; realpt.y = pt.y;
if (g_ddraw->locked && (!g_ddraw->windowed || real_ScreenToClient(g_ddraw->hwnd, &pt))) if (g_mouse_locked && (!g_ddraw->windowed || real_ScreenToClient(g_ddraw->hwnd, &pt)))
{ {
/* fallback solution for possible ClipCursor failure */ /* fallback solution for possible ClipCursor failure */
int diffx = 0, diffy = 0; int diffx = 0, diffy = 0;
@ -152,7 +152,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
CopyRect(&g_ddraw->mouse.rc, &dst_rc); CopyRect(&g_ddraw->mouse.rc, &dst_rc);
if (g_ddraw->locked) if (g_mouse_locked)
{ {
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2);
@ -167,7 +167,7 @@ int WINAPI fake_ShowCursor(BOOL bShow)
{ {
if (g_ddraw) if (g_ddraw)
{ {
if (g_ddraw->locked || g_ddraw->devmode) if (g_mouse_locked || g_ddraw->devmode)
{ {
int count = real_ShowCursor(bShow); int count = real_ShowCursor(bShow);
InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count); InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count);
@ -190,7 +190,7 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
{ {
HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor);
if (!g_ddraw->locked && !g_ddraw->devmode) if (!g_mouse_locked && !g_ddraw->devmode)
return cursor; return cursor;
} }
@ -265,7 +265,7 @@ BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
BOOL WINAPI fake_SetCursorPos(int X, int Y) BOOL WINAPI fake_SetCursorPos(int X, int Y)
{ {
if (g_ddraw && !g_ddraw->locked && !g_ddraw->devmode) if (g_ddraw && !g_mouse_locked && !g_ddraw->devmode)
return TRUE; return TRUE;
POINT pt = { X, Y }; POINT pt = { X, Y };

View file

@ -105,7 +105,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case HTTOPRIGHT: case HTTOPRIGHT:
return DefWindowProc(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case HTCLIENT: case HTCLIENT:
if (!g_ddraw->locked && !g_ddraw->devmode) if (!g_mouse_locked && !g_ddraw->devmode)
{ {
real_SetCursor(LoadCursor(NULL, IDC_ARROW)); real_SetCursor(LoadCursor(NULL, IDC_ARROW));
return TRUE; return TRUE;
@ -476,7 +476,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGING:
{ {
/* workaround for a bug where sometimes a background window steals the focus */ /* workaround for a bug where sometimes a background window steals the focus */
if (g_ddraw->locked) if (g_mouse_locked)
{ {
WINDOWPOS* pos = (WINDOWPOS*)lParam; WINDOWPOS* pos = (WINDOWPOS*)lParam;
@ -523,14 +523,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
mouse_lock(); mouse_lock();
} }
} }
else if (g_ddraw->fullscreen) else if (g_ddraw->fullscreen && GetForegroundWindow() == g_ddraw->hwnd)
{ {
mouse_lock(); mouse_lock();
} }
} }
else else
{ {
if (!g_ddraw->windowed && !g_ddraw->locked && g_ddraw->noactivateapp && !g_ddraw->devmode) if (!g_ddraw->windowed && !g_mouse_locked && g_ddraw->noactivateapp && !g_ddraw->devmode)
return 0; return 0;
mouse_unlock(); mouse_unlock();
@ -677,7 +677,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WM_RBUTTONUP: case WM_RBUTTONUP:
case WM_MBUTTONUP: case WM_MBUTTONUP:
{ {
if (!g_ddraw->devmode && !g_ddraw->locked) if (!g_ddraw->devmode && !g_mouse_locked)
{ {
int x = GET_X_LPARAM(lParam); int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam); int y = GET_Y_LPARAM(lParam);
@ -718,7 +718,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WM_MBUTTONDOWN: case WM_MBUTTONDOWN:
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
{ {
if (!g_ddraw->devmode && !g_ddraw->locked) if (!g_ddraw->devmode && !g_mouse_locked)
{ {
return 0; return 0;
} }
@ -765,7 +765,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WM_RBUTTONDOWN: case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN: case WM_XBUTTONDOWN:
{ {
if (!g_ddraw->devmode && !g_ddraw->locked) if (!g_ddraw->devmode && !g_mouse_locked)
{ {
int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); 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); int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h);