only lock cursor in borderless if game window is the foreground window
This commit is contained in:
parent
c6701a8cd6
commit
1b791fb2cb
7 changed files with 27 additions and 24 deletions
1
inc/dd.h
1
inc/dd.h
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
5
src/dd.c
5
src/dd.c
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
11
src/mouse.c
11
src/mouse.c
|
@ -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);
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -486,8 +486,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
||||||
|
|
||||||
if (GetForegroundWindow() == g_ddraw->hwnd)
|
if (GetForegroundWindow() == g_ddraw->hwnd)
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WM_MOUSELEAVE:
|
case WM_MOUSELEAVE:
|
||||||
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue