mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
fixes for cursor lock
This commit is contained in:
parent
a04e8f4e1f
commit
6cfeadaced
2
inc/dd.h
2
inc/dd.h
@ -107,8 +107,8 @@ typedef struct CNCDDRAW
|
|||||||
char shader[MAX_PATH];
|
char shader[MAX_PATH];
|
||||||
BOOL wine;
|
BOOL wine;
|
||||||
BOOL altenter;
|
BOOL altenter;
|
||||||
BOOL hidecursor;
|
|
||||||
HCURSOR old_cursor;
|
HCURSOR old_cursor;
|
||||||
|
int show_cursor_count;
|
||||||
BOOL accurate_timers;
|
BOOL accurate_timers;
|
||||||
BOOL resizable;
|
BOOL resizable;
|
||||||
BOOL nonexclusive;
|
BOOL nonexclusive;
|
||||||
|
@ -40,7 +40,7 @@ void cfg_load()
|
|||||||
g_ddraw->border = cfg_get_bool("border", TRUE);
|
g_ddraw->border = cfg_get_bool("border", TRUE);
|
||||||
g_ddraw->boxing = cfg_get_bool("boxing", FALSE);
|
g_ddraw->boxing = cfg_get_bool("boxing", FALSE);
|
||||||
g_ddraw->maintas = cfg_get_bool("maintas", FALSE);
|
g_ddraw->maintas = cfg_get_bool("maintas", FALSE);
|
||||||
g_ddraw->adjmouse = cfg_get_bool("adjmouse", TRUE);
|
g_ddraw->adjmouse = cfg_get_bool("adjmouse", TRUE) || !cfg_get_bool("handlemouse", TRUE);
|
||||||
g_ddraw->devmode = cfg_get_bool("devmode", FALSE);
|
g_ddraw->devmode = cfg_get_bool("devmode", FALSE);
|
||||||
g_ddraw->vsync = cfg_get_bool("vsync", FALSE);
|
g_ddraw->vsync = cfg_get_bool("vsync", FALSE);
|
||||||
g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE);
|
g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE);
|
||||||
|
10
src/dd.c
10
src/dd.c
@ -819,13 +819,15 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
|
|||||||
SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd);
|
SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cursor_count = real_ShowCursor(TRUE) - 1;
|
||||||
|
InterlockedExchange(&g_ddraw->show_cursor_count, cursor_count);
|
||||||
|
real_ShowCursor(FALSE);
|
||||||
|
|
||||||
/* Make sure the cursor is visible in windowed mode initially */
|
/* Make sure the cursor is visible in windowed mode initially */
|
||||||
if (g_ddraw->windowed)
|
if (g_ddraw->windowed && !g_ddraw->fullscreen)
|
||||||
{
|
{
|
||||||
CURSORINFO ci = { .cbSize = sizeof(CURSORINFO) };
|
if (cursor_count < 0)
|
||||||
if (real_GetCursorInfo(&ci) && ci.flags == 0)
|
|
||||||
{
|
{
|
||||||
g_ddraw->hidecursor = TRUE;
|
|
||||||
while (real_ShowCursor(TRUE) < 0);
|
while (real_ShowCursor(TRUE) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,9 +97,14 @@ static HRESULT WINAPI fake_di_CreateDevice(
|
|||||||
|
|
||||||
if (SUCCEEDED(result) && !real_did_SetCooperativeLevel)
|
if (SUCCEEDED(result) && !real_did_SetCooperativeLevel)
|
||||||
{
|
{
|
||||||
if (rguid && IsEqualGUID(&GUID_SysMouse, rguid))
|
if (rguid && IsEqualGUID(&GUID_SysMouse, rguid) && g_ddraw)
|
||||||
{
|
{
|
||||||
while (real_ShowCursor(FALSE) >= 0);
|
if (g_ddraw->locked || g_ddraw->devmode)
|
||||||
|
{
|
||||||
|
while (real_ShowCursor(FALSE) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
InterlockedExchange(&g_ddraw->show_cursor_count, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
real_did_SetCooperativeLevel =
|
real_did_SetCooperativeLevel =
|
||||||
|
16
src/mouse.c
16
src/mouse.c
@ -55,10 +55,19 @@ void mouse_lock()
|
|||||||
|
|
||||||
real_SetCursor(g_ddraw->old_cursor);
|
real_SetCursor(g_ddraw->old_cursor);
|
||||||
|
|
||||||
if (g_ddraw->hidecursor)
|
int cur_count = real_ShowCursor(TRUE) - 1;
|
||||||
|
real_ShowCursor(FALSE);
|
||||||
|
|
||||||
|
int game_count = InterlockedExchangeAdd(&g_ddraw->show_cursor_count, 0);
|
||||||
|
|
||||||
|
if (cur_count > game_count)
|
||||||
{
|
{
|
||||||
g_ddraw->hidecursor = FALSE;
|
while (real_ShowCursor(FALSE) > game_count);
|
||||||
real_ShowCursor(FALSE);
|
}
|
||||||
|
|
||||||
|
if (cur_count < game_count)
|
||||||
|
{
|
||||||
|
while (real_ShowCursor(TRUE) < game_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
real_ClipCursor(&rc);
|
real_ClipCursor(&rc);
|
||||||
@ -96,7 +105,6 @@ void mouse_unlock()
|
|||||||
CURSORINFO ci = { .cbSize = sizeof(CURSORINFO) };
|
CURSORINFO ci = { .cbSize = sizeof(CURSORINFO) };
|
||||||
if (real_GetCursorInfo(&ci) && ci.flags == 0)
|
if (real_GetCursorInfo(&ci) && ci.flags == 0)
|
||||||
{
|
{
|
||||||
g_ddraw->hidecursor = TRUE;
|
|
||||||
while (real_ShowCursor(TRUE) < 0);
|
while (real_ShowCursor(TRUE) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,21 +114,34 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
|||||||
|
|
||||||
int WINAPI fake_ShowCursor(BOOL bShow)
|
int WINAPI fake_ShowCursor(BOOL bShow)
|
||||||
{
|
{
|
||||||
static int count;
|
if (g_ddraw)
|
||||||
|
{
|
||||||
|
if (g_ddraw->locked || g_ddraw->devmode)
|
||||||
|
{
|
||||||
|
int count = real_ShowCursor(bShow);
|
||||||
|
InterlockedExchange(&g_ddraw->show_cursor_count, count);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return bShow ?
|
||||||
|
InterlockedIncrement(&g_ddraw->show_cursor_count) :
|
||||||
|
InterlockedDecrement(&g_ddraw->show_cursor_count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//if (g_ddraw)
|
return real_ShowCursor(bShow);
|
||||||
return real_ShowCursor(bShow);
|
|
||||||
|
|
||||||
return bShow ? ++count : --count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
||||||
{
|
{
|
||||||
if (g_ddraw)
|
if (g_ddraw)
|
||||||
|
{
|
||||||
g_ddraw->old_cursor = hCursor;
|
g_ddraw->old_cursor = hCursor;
|
||||||
|
|
||||||
if (g_ddraw && (g_ddraw->locked || g_ddraw->devmode))
|
if (g_ddraw->locked || g_ddraw->devmode)
|
||||||
return real_SetCursor(hCursor);
|
return real_SetCursor(hCursor);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -206,10 +219,16 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y)
|
|||||||
|
|
||||||
POINT pt = { X, Y };
|
POINT pt = { X, Y };
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->adjmouse)
|
if (g_ddraw)
|
||||||
{
|
{
|
||||||
pt.x = (LONG)(pt.x * g_ddraw->render.scale_w);
|
if (g_ddraw->adjmouse)
|
||||||
pt.y = (LONG)(pt.y * g_ddraw->render.scale_h);
|
{
|
||||||
|
pt.x = (LONG)(pt.x * g_ddraw->render.scale_w);
|
||||||
|
pt.y = (LONG)(pt.y * g_ddraw->render.scale_h);
|
||||||
|
}
|
||||||
|
|
||||||
|
pt.x += g_ddraw->render.viewport.x;
|
||||||
|
pt.y += g_ddraw->render.viewport.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y);
|
return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y);
|
||||||
|
@ -737,8 +737,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
g_ddraw->cursor.x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w);
|
g_ddraw->cursor.x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w);
|
||||||
g_ddraw->cursor.y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h);
|
g_ddraw->cursor.y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h);
|
||||||
|
|
||||||
g_ddraw->hidecursor = FALSE;
|
|
||||||
|
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user