diff --git a/inc/main.h b/inc/main.h index e3551ee..c1765d3 100644 --- a/inc/main.h +++ b/inc/main.h @@ -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; diff --git a/src/main.c b/src/main.c index 6623099..a64152d 100644 --- a/src/main.c +++ b/src/main.c @@ -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) diff --git a/src/mouse.c b/src/mouse.c index b50e639..04e341a 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -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; } diff --git a/src/settings.c b/src/settings.c index 4ace007..a738b69 100644 --- a/src/settings.c +++ b/src/settings.c @@ -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;