1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

fixes for cursor lock

This commit is contained in:
FunkyFr3sh 2021-06-17 04:12:05 +02:00
parent a04e8f4e1f
commit 6cfeadaced
7 changed files with 56 additions and 24 deletions

View File

@ -107,8 +107,8 @@ typedef struct CNCDDRAW
char shader[MAX_PATH];
BOOL wine;
BOOL altenter;
BOOL hidecursor;
HCURSOR old_cursor;
int show_cursor_count;
BOOL accurate_timers;
BOOL resizable;
BOOL nonexclusive;

View File

@ -40,7 +40,7 @@ void cfg_load()
g_ddraw->border = cfg_get_bool("border", TRUE);
g_ddraw->boxing = cfg_get_bool("boxing", 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->vsync = cfg_get_bool("vsync", FALSE);
g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE);

View File

@ -819,13 +819,15 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
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 */
if (g_ddraw->windowed)
if (g_ddraw->windowed && !g_ddraw->fullscreen)
{
CURSORINFO ci = { .cbSize = sizeof(CURSORINFO) };
if (real_GetCursorInfo(&ci) && ci.flags == 0)
if (cursor_count < 0)
{
g_ddraw->hidecursor = TRUE;
while (real_ShowCursor(TRUE) < 0);
}

View File

@ -97,9 +97,14 @@ static HRESULT WINAPI fake_di_CreateDevice(
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 =

View File

@ -55,10 +55,19 @@ void mouse_lock()
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;
real_ShowCursor(FALSE);
while (real_ShowCursor(FALSE) > game_count);
}
if (cur_count < game_count)
{
while (real_ShowCursor(TRUE) < game_count);
}
real_ClipCursor(&rc);
@ -96,7 +105,6 @@ void mouse_unlock()
CURSORINFO ci = { .cbSize = sizeof(CURSORINFO) };
if (real_GetCursorInfo(&ci) && ci.flags == 0)
{
g_ddraw->hidecursor = TRUE;
while (real_ShowCursor(TRUE) < 0);
}

View File

@ -114,21 +114,34 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
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 bShow ? ++count : --count;
return real_ShowCursor(bShow);
}
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
{
if (g_ddraw)
{
g_ddraw->old_cursor = hCursor;
if (g_ddraw && (g_ddraw->locked || g_ddraw->devmode))
return real_SetCursor(hCursor);
if (g_ddraw->locked || g_ddraw->devmode)
return real_SetCursor(hCursor);
}
return NULL;
}
@ -206,10 +219,16 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y)
POINT pt = { X, Y };
if (g_ddraw && g_ddraw->adjmouse)
if (g_ddraw)
{
pt.x = (LONG)(pt.x * g_ddraw->render.scale_w);
pt.y = (LONG)(pt.y * g_ddraw->render.scale_h);
if (g_ddraw->adjmouse)
{
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);

View File

@ -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.y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h);
g_ddraw->hidecursor = FALSE;
mouse_lock();
}
break;