diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index edb56553a9..91aa28c881 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -34,9 +34,6 @@ bool _window_maximize; uint _display_hz; uint _fullscreen_bpp; static uint16 _bck_resolution[2]; -#if !defined(WINCE) -static DEVMODE _fullscreen_dm; -#endif #if !defined(UNICODE) uint _codepage; #endif @@ -205,6 +202,89 @@ static void CALLBACK TrackMouseTimerProc(HWND hwnd, UINT msg, UINT event, DWORD } } +static void MakeWindow(bool full_screen) +{ + _fullscreen = full_screen; + + // recreate window? + if ((full_screen || _wnd.fullscreen) && _wnd.main_wnd) { + DestroyWindow(_wnd.main_wnd); + _wnd.main_wnd = 0; + } + +#if defined(WINCE) + /* WinCE is always fullscreen */ +#else + if (full_screen) { + DEVMODE settings; + + /* Make sure we are always at least the screen-depth of the blitter */ + if (_fullscreen_bpp < BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth()) _fullscreen_bpp = BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth(); + + memset(&settings, 0, sizeof(settings)); + settings.dmSize = sizeof(settings); + settings.dmFields = + (_fullscreen_bpp != 0 ? DM_BITSPERPEL : 0) | + DM_PELSWIDTH | + DM_PELSHEIGHT | + (_display_hz != 0 ? DM_DISPLAYFREQUENCY : 0); + settings.dmBitsPerPel = _fullscreen_bpp; + settings.dmPelsWidth = _wnd.width_org; + settings.dmPelsHeight = _wnd.height_org; + settings.dmDisplayFrequency = _display_hz; + + if (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { + MakeWindow(false); + return; + } + } else if (_wnd.fullscreen) { + // restore display? + ChangeDisplaySettings(NULL, 0); + } +#endif + + { + RECT r; + DWORD style, showstyle; + int x, y, w, h; + + showstyle = SW_SHOWNORMAL; + _wnd.fullscreen = full_screen; + if (_wnd.fullscreen) { + style = WS_POPUP; + SetRect(&r, 0, 0, _wnd.width_org, _wnd.height_org); + } else { + style = WS_OVERLAPPEDWINDOW; + /* On window creation, check if we were in maximize mode before */ + if (_window_maximize) showstyle = SW_SHOWMAXIMIZED; + SetRect(&r, 0, 0, _wnd.width, _wnd.height); + } + +#if !defined(WINCE) + AdjustWindowRect(&r, style, FALSE); +#endif + w = r.right - r.left; + h = r.bottom - r.top; + x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; + y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; + + if (_wnd.main_wnd) { + ShowWindow(_wnd.main_wnd, SW_SHOWNORMAL); // remove maximize-flag + SetWindowPos(_wnd.main_wnd, 0, x, y, w, h, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); + } else { + extern const char _openttd_revision[]; + TCHAR Windowtitle[50]; + + _sntprintf(Windowtitle, sizeof(Windowtitle), _T("OpenTTD %s"), MB_TO_WIDE(_openttd_revision)); + + _wnd.main_wnd = CreateWindow(_T("OTTD"), Windowtitle, style, x, y, w, h, 0, 0, GetModuleHandle(NULL), 0); + if (_wnd.main_wnd == NULL) error("CreateWindow failed"); + ShowWindow(_wnd.main_wnd, showstyle); + } + } + GameSizeChanged(); // invalidate all windows, force redraw +} + static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static uint32 keycode = 0; @@ -528,9 +608,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP if (_wnd.has_focus && _wnd.minimized) { /* Restore the game window */ ShowWindow(hwnd, SW_RESTORE); - ChangeDisplaySettings(&_fullscreen_dm, CDS_FULLSCREEN); - /* Force palette update */ - SendMessage(hwnd, WM_QUERYNEWPALETTE, 0, 0); + MakeWindow(true); } else if (!_wnd.has_focus && !_wnd.minimized) { /* Minimise the window and restore desktop */ ShowWindow(hwnd, SW_MINIMIZE); @@ -567,87 +645,6 @@ static void RegisterWndClass() } } -static void MakeWindow(bool full_screen) -{ - _fullscreen = full_screen; - - // recreate window? - if ((full_screen || _wnd.fullscreen) && _wnd.main_wnd) { - DestroyWindow(_wnd.main_wnd); - _wnd.main_wnd = 0; - } - -#if defined(WINCE) - /* WinCE is always fullscreen */ -#else - if (full_screen) { - /* Make sure we are always at least the screen-depth of the blitter */ - if (_fullscreen_bpp < BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth()) _fullscreen_bpp = BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth(); - - memset(&_fullscreen_dm, 0, sizeof(_fullscreen_dm)); - _fullscreen_dm.dmSize = sizeof(_fullscreen_dm); - _fullscreen_dm.dmFields = - (_fullscreen_bpp != 0 ? DM_BITSPERPEL : 0) | - DM_PELSWIDTH | - DM_PELSHEIGHT | - (_display_hz != 0 ? DM_DISPLAYFREQUENCY : 0); - _fullscreen_dm.dmBitsPerPel = _fullscreen_bpp; - _fullscreen_dm.dmPelsWidth = _wnd.width_org; - _fullscreen_dm.dmPelsHeight = _wnd.height_org; - _fullscreen_dm.dmDisplayFrequency = _display_hz; - - if (ChangeDisplaySettings(&_fullscreen_dm, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { - MakeWindow(false); - return; - } - } else if (_wnd.fullscreen) { - // restore display? - ChangeDisplaySettings(NULL, 0); - } -#endif - - { - RECT r; - DWORD style, showstyle; - int x, y, w, h; - - showstyle = SW_SHOWNORMAL; - _wnd.fullscreen = full_screen; - if (_wnd.fullscreen) { - style = WS_POPUP; - SetRect(&r, 0, 0, _wnd.width_org, _wnd.height_org); - } else { - style = WS_OVERLAPPEDWINDOW; - /* On window creation, check if we were in maximize mode before */ - if (_window_maximize) showstyle = SW_SHOWMAXIMIZED; - SetRect(&r, 0, 0, _wnd.width, _wnd.height); - } - -#if !defined(WINCE) - AdjustWindowRect(&r, style, FALSE); -#endif - w = r.right - r.left; - h = r.bottom - r.top; - x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; - y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; - - if (_wnd.main_wnd) { - ShowWindow(_wnd.main_wnd, SW_SHOWNORMAL); // remove maximize-flag - SetWindowPos(_wnd.main_wnd, 0, x, y, w, h, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); - } else { - extern const char _openttd_revision[]; - TCHAR Windowtitle[50]; - - _sntprintf(Windowtitle, sizeof(Windowtitle), _T("OpenTTD %s"), MB_TO_WIDE(_openttd_revision)); - - _wnd.main_wnd = CreateWindow(_T("OTTD"), Windowtitle, style, x, y, w, h, 0, 0, GetModuleHandle(NULL), 0); - if (_wnd.main_wnd == NULL) error("CreateWindow failed"); - ShowWindow(_wnd.main_wnd, showstyle); - } - } - GameSizeChanged(); // invalidate all windows, force redraw -} - static bool AllocateDibSection(int w, int h) { BITMAPINFO *bi;