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;
WNDPROC wndproc;
struct { DWORD x; DWORD y; } cursor;
BOOL locked;
BOOL adjmouse;
BOOL devmode;
BOOL vsync;

View file

@ -5,6 +5,7 @@ void mouse_lock();
void mouse_unlock();
LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam);
extern BOOL g_mouse_locked;
extern HHOOK g_mouse_hook;
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;
BOOL lock_mouse = (g_ddraw->locked || g_ddraw->fullscreen) && !(dwFlags & SDM_LEAVE_FULLSCREEN);
BOOL lock_mouse = g_mouse_locked;
mouse_unlock();
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();
}
else

View file

@ -5,6 +5,7 @@
#include "debug.h"
#include "hook.h"
#include "dd.h"
#include "mouse.h"
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 (g_ddraw->locked || g_ddraw->devmode)
if (g_mouse_locked || g_ddraw->devmode)
{
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);
if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked)
if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked)
{
if (pdwInOut)
{
@ -85,7 +86,7 @@ static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD c
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)
{

View file

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

View file

@ -23,7 +23,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
realpt.x = pt.x;
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 */
int diffx = 0, diffy = 0;
@ -152,7 +152,7 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
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);
@ -167,7 +167,7 @@ int WINAPI fake_ShowCursor(BOOL bShow)
{
if (g_ddraw)
{
if (g_ddraw->locked || g_ddraw->devmode)
if (g_mouse_locked || g_ddraw->devmode)
{
int count = real_ShowCursor(bShow);
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);
if (!g_ddraw->locked && !g_ddraw->devmode)
if (!g_mouse_locked && !g_ddraw->devmode)
return cursor;
}
@ -265,7 +265,7 @@ BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
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;
POINT pt = { X, Y };

View file

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