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

automatically switch between windowed/fullscreen with d3d9 renderer

This commit is contained in:
FunkyFr3sh 2019-08-07 04:40:43 +02:00
parent 57df372da1
commit 9a9e9feead
4 changed files with 32 additions and 21 deletions

View File

@ -37,6 +37,7 @@ extern BOOL ChildWindowExists;
BOOL detect_cutscene();
void LimitGameTicks();
void ToggleFullscreen();
DWORD WINAPI render_main(void);
DWORD WINAPI render_soft_main(void);
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
@ -127,6 +128,7 @@ typedef struct IDirectDrawImpl
BOOL accurateTimers;
int bnetHack;
BOOL bnetActive;
BOOL bnetD3d9Fullscreen;
BOOL hotPatch;
SpeedLimiter ticksLimiter;
SpeedLimiter flipLimiter;

View File

@ -916,7 +916,7 @@ HRESULT __stdcall ddraw_SetDisplayMode2(IDirectDrawImpl *This, DWORD width, DWOR
void ToggleFullscreen()
{
if (ddraw->bnetHack && ddraw->renderer == render_d3d9_main)
if (ddraw->bnetHack && ddraw->bnetActive && ddraw->renderer == render_d3d9_main)
return;
if (ddraw->windowed)

View File

@ -19,6 +19,7 @@
#include "main.h"
#include "surface.h"
#include "hook.h"
#include "render_d3d9.h"
int yAdjust = 0;
@ -428,6 +429,12 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
{
ddraw->bnetActive = FALSE;
mouse_lock();
if (ddraw->windowed && ddraw->bnetD3d9Fullscreen && ddraw->renderer == render_d3d9_main)
{
ToggleFullscreen();
ddraw->bnetD3d9Fullscreen = FALSE;
}
}
return result;
@ -437,7 +444,28 @@ HWND WINAPI fake_CreateWindowExA(
DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
HWND hWnd = real_CreateWindowExA(
if (lpClassName && _strcmpi(lpClassName, "SDlgDialog") == 0 && ddraw && ddraw->bnetHack)
{
if (!ddraw->bnetActive)
{
if (!ddraw->windowed && !ddraw->bnetD3d9Fullscreen && ddraw->renderer == render_d3d9_main)
{
ToggleFullscreen();
ddraw->bnetD3d9Fullscreen = TRUE;
}
ddraw->bnetActive = TRUE;
mouse_unlock();
}
POINT pt = { 0, 0 };
real_ClientToScreen(ddraw->hWnd, &pt);
X += pt.x;
Y += pt.y;
}
return real_CreateWindowExA(
dwExStyle,
lpClassName,
lpWindowName,
@ -450,20 +478,4 @@ HWND WINAPI fake_CreateWindowExA(
hMenu,
hInstance,
lpParam);
if (_strcmpi(lpClassName, "SDlgDialog") == 0 && ddraw && ddraw->bnetHack)
{
if (!ddraw->bnetActive)
{
ddraw->bnetActive = TRUE;
mouse_unlock();
}
POINT pt = { 0, 0 };
real_ClientToScreen(ddraw->hWnd, &pt);
real_SetWindowPos(hWnd, 0, pt.x + X, pt.y + Y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
}
return hWnd;
}

View File

@ -104,9 +104,6 @@ void Settings_Load()
GetString("renderer", "opengl", tmp, sizeof(tmp));
printf("Using %s renderer\n", tmp);
if (ddraw->bnetHack && tolower(tmp[0]) == 'd')
ddraw->windowed = TRUE;
if (tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') //gdi
{
ddraw->renderer = render_soft_main;