diff --git a/inc/main.h b/inc/main.h index db8b773..ebdd1f8 100644 --- a/inc/main.h +++ b/inc/main.h @@ -132,6 +132,7 @@ typedef struct IDirectDrawImpl BOOL resizable; BOOL bnetActive; BOOL bnetWasFullscreen; + BOOL bnetWasUpscaled; RECT bnetWinRect; POINT bnetPos; SpeedLimiter ticksLimiter; diff --git a/src/main.c b/src/main.c index 470d503..eb81ed6 100644 --- a/src/main.c +++ b/src/main.c @@ -700,6 +700,8 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD ddraw->cursor.x = width / 2; ddraw->cursor.y = height / 2; + BOOL border = This->border; + if(This->fullscreen) { This->render.width = This->mode.dmPelsWidth; @@ -707,7 +709,7 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD if (This->windowed) //windowed-fullscreen aka borderless { - This->border = FALSE; + border = FALSE; WindowRect.left = -32000; WindowRect.top = -32000; @@ -885,7 +887,7 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD MSG msg; // workaround for "Not Responding" window problem in cnc games PeekMessage(&msg, ddraw->hWnd, 0, 0, PM_NOREMOVE); - if (!This->border) + if (!border) { real_SetWindowLongA(This->hWnd, GWL_STYLE, GetWindowLong(This->hWnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } @@ -1129,12 +1131,20 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (!ddraw->windowed) ddraw->bnetWasFullscreen = FALSE; - if (!ddraw->bnetActive && ddraw->bnetWasFullscreen) + if (!ddraw->bnetActive) { - int ws = WindowState; - ToggleFullscreen(); - WindowState = ws; - ddraw->bnetWasFullscreen = FALSE; + if (ddraw->bnetWasFullscreen) + { + int ws = WindowState; + ToggleFullscreen(); + WindowState = ws; + ddraw->bnetWasFullscreen = FALSE; + } + else if (ddraw->bnetWasUpscaled) + { + SetWindowRect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + ddraw->bnetWasUpscaled = FALSE; + } } return 0; diff --git a/src/mouse.c b/src/mouse.c index 9537f56..0b729e8 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -437,11 +437,11 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) if (ddraw->windowed) { - if (!ddraw->fullscreen) - { - ddraw->bnetPos.x = ddraw->bnetPos.y = 0; - real_ClientToScreen(ddraw->hWnd, &ddraw->bnetPos); + ddraw->bnetPos.x = ddraw->bnetPos.y = 0; + real_ClientToScreen(ddraw->hWnd, &ddraw->bnetPos); + if (!ddraw->bnetWasUpscaled) + { int width = ddraw->bnetWinRect.right - ddraw->bnetWinRect.left; int height = ddraw->bnetWinRect.bottom - ddraw->bnetWinRect.top; UINT flags = width != ddraw->width || height != ddraw->height ? 0 : SWP_NOMOVE; @@ -449,10 +449,9 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) SetWindowRect(ddraw->bnetWinRect.left, ddraw->bnetWinRect.top, width, height, flags); } - if (ddraw->bnetWasFullscreen) - { - SetTimer(ddraw->hWnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); - } + ddraw->fullscreen = ddraw->bnetWasUpscaled; + + SetTimer(ddraw->hWnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); ddraw->resizable = TRUE; } @@ -470,6 +469,9 @@ HWND WINAPI fake_CreateWindowExA( { if (!ddraw->bnetActive) { + ddraw->bnetWasUpscaled = ddraw->fullscreen; + ddraw->fullscreen = FALSE; + if (!ddraw->windowed && !ddraw->bnetWasFullscreen) { int ws = WindowState; @@ -478,20 +480,17 @@ HWND WINAPI fake_CreateWindowExA( ddraw->bnetWasFullscreen = TRUE; } - if (!ddraw->fullscreen) - { - real_GetClientRect(ddraw->hWnd, &ddraw->bnetWinRect); - MapWindowPoints(ddraw->hWnd, HWND_DESKTOP, (LPPOINT)&ddraw->bnetWinRect, 2); + real_GetClientRect(ddraw->hWnd, &ddraw->bnetWinRect); + MapWindowPoints(ddraw->hWnd, HWND_DESKTOP, (LPPOINT)&ddraw->bnetWinRect, 2); - int width = ddraw->bnetWinRect.right - ddraw->bnetWinRect.left; - int height = ddraw->bnetWinRect.bottom - ddraw->bnetWinRect.top; - int x = ddraw->bnetPos.x || ddraw->bnetPos.y ? ddraw->bnetPos.x : -32000; - int y = ddraw->bnetPos.x || ddraw->bnetPos.y ? ddraw->bnetPos.y : -32000; - UINT flags = width != ddraw->width || height != ddraw->height ? 0 : SWP_NOMOVE; + int width = ddraw->bnetWinRect.right - ddraw->bnetWinRect.left; + int height = ddraw->bnetWinRect.bottom - ddraw->bnetWinRect.top; + int x = ddraw->bnetPos.x || ddraw->bnetPos.y ? ddraw->bnetPos.x : -32000; + int y = ddraw->bnetPos.x || ddraw->bnetPos.y ? ddraw->bnetPos.y : -32000; + UINT flags = width != ddraw->width || height != ddraw->height ? 0 : SWP_NOMOVE; - SetWindowRect(x, y, ddraw->width, ddraw->height, flags); - ddraw->resizable = FALSE; - } + SetWindowRect(x, y, ddraw->width, ddraw->height, flags); + ddraw->resizable = FALSE; ddraw->bnetActive = TRUE; mouse_unlock();