diff --git a/src/gfx.cpp b/src/gfx.cpp --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1275,12 +1275,13 @@ bool ChangeResInGame(int width, int heig return (_screen.width == width && _screen.height == height) || _video_driver->ChangeResolution(width, height); } -void ToggleFullScreen(bool fs) +bool ToggleFullScreen(bool fs) { - _video_driver->ToggleFullscreen(fs); + bool result = _video_driver->ToggleFullscreen(fs); if (_fullscreen != fs && _num_resolutions == 0) { DEBUG(driver, 0, "Could not find a suitable fullscreen resolution"); } + return result; } static int CDECL compare_res(const void *pa, const void *pb) diff --git a/src/gfx_func.h b/src/gfx_func.h --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -151,7 +151,7 @@ void ScreenSizeChanged(); void UndrawMouseCursor(); bool ChangeResInGame(int w, int h); void SortResolutions(int count); -void ToggleFullScreen(bool fs); +bool ToggleFullScreen(bool fs); /* gfx.cpp */ #define ASCII_LETTERSTART 32 diff --git a/src/lang/english.txt b/src/lang/english.txt --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -941,6 +941,7 @@ STR_OPTIONS_LANG_TIP STR_OPTIONS_FULLSCREEN :{BLACK}Fullscreen STR_OPTIONS_FULLSCREEN_TIP :{BLACK}Check this box to play OpenTTD fullscreen mode +STR_FULLSCREEN_FAILED :{WHITE}Fullscreen mode failed STR_OPTIONS_RES :{BLACK}Screen resolution STR_OPTIONS_RES_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING} diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -201,8 +201,11 @@ static void GameOptionsWndProc(Window *w ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_RESOLUTION_START, _num_resolutions), GetCurRes(), 27, 0, 0); return; case 28: /* Click fullscreen on/off */ - w->SetWidgetLoweredState(28, !_fullscreen); - ToggleFullScreen(!_fullscreen); // toggle full-screen on/off + /* try to toggle full-screen on/off */ + if (!ToggleFullScreen(!_fullscreen)) { + ShowErrorMessage(INVALID_STRING_ID, STR_FULLSCREEN_FAILED, 0, 0); + } + w->SetWidgetLoweredState(28, _fullscreen); SetWindowDirty(w); return; case 30: case 31: /* Setup screenshot format dropdown */ diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -19,7 +19,7 @@ public: /* virtual */ bool ChangeResolution(int w, int h); - /* virtual */ void ToggleFullscreen(bool fullscreen); + /* virtual */ bool ToggleFullscreen(bool fullscreen); }; class FVideoDriver_Cocoa: public VideoDriverFactory { diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -361,7 +361,7 @@ bool VideoDriver_Cocoa::ChangeResolution return ret; } -void VideoDriver_Cocoa::ToggleFullscreen(bool full_screen) +bool VideoDriver_Cocoa::ToggleFullscreen(bool full_screen) { bool oldfs; @@ -386,6 +386,7 @@ void VideoDriver_Cocoa::ToggleFullscreen QZ_GameSizeChanged(); QZ_UpdateVideoModes(); + return _cocoa_subdriver->IsFullscreen() == full_screen; } diff --git a/src/video/dedicated_v.cpp b/src/video/dedicated_v.cpp --- a/src/video/dedicated_v.cpp +++ b/src/video/dedicated_v.cpp @@ -168,7 +168,7 @@ void VideoDriver_Dedicated::Stop() void VideoDriver_Dedicated::MakeDirty(int left, int top, int width, int height) {} bool VideoDriver_Dedicated::ChangeResolution(int w, int h) { return false; } -void VideoDriver_Dedicated::ToggleFullscreen(bool fs) {} +bool VideoDriver_Dedicated::ToggleFullscreen(bool fs) { return false; } #if defined(UNIX) || defined(__OS2__) || defined(PSP) static bool InputWaiting() diff --git a/src/video/dedicated_v.h b/src/video/dedicated_v.h --- a/src/video/dedicated_v.h +++ b/src/video/dedicated_v.h @@ -17,7 +17,7 @@ public: /* virtual */ bool ChangeResolution(int w, int h); - /* virtual */ void ToggleFullscreen(bool fullscreen); + /* virtual */ bool ToggleFullscreen(bool fullscreen); }; class FVideoDriver_Dedicated: public VideoDriverFactory { diff --git a/src/video/null_v.cpp b/src/video/null_v.cpp --- a/src/video/null_v.cpp +++ b/src/video/null_v.cpp @@ -38,4 +38,4 @@ void VideoDriver_Null::MainLoop() bool VideoDriver_Null::ChangeResolution(int w, int h) { return false; } -void VideoDriver_Null::ToggleFullscreen(bool fs) {} +bool VideoDriver_Null::ToggleFullscreen(bool fs) { return false; } diff --git a/src/video/null_v.h b/src/video/null_v.h --- a/src/video/null_v.h +++ b/src/video/null_v.h @@ -20,7 +20,7 @@ public: /* virtual */ bool ChangeResolution(int w, int h); - /* virtual */ void ToggleFullscreen(bool fullscreen); + /* virtual */ bool ToggleFullscreen(bool fullscreen); }; class FVideoDriver_Null: public VideoDriverFactory { diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -521,14 +521,16 @@ bool VideoDriver_SDL::ChangeResolution(i return CreateMainSurface(w, h); } -void VideoDriver_SDL::ToggleFullscreen(bool fullscreen) +bool VideoDriver_SDL::ToggleFullscreen(bool fullscreen) { _fullscreen = fullscreen; GetVideoModes(); // get the list of available video modes if (_num_resolutions == 0 || !this->ChangeResolution(_cur_resolution[0], _cur_resolution[1])) { // switching resolution failed, put back full_screen to original status _fullscreen ^= true; + return false; } + return true; } #endif /* WITH_SDL */ diff --git a/src/video/sdl_v.h b/src/video/sdl_v.h --- a/src/video/sdl_v.h +++ b/src/video/sdl_v.h @@ -17,7 +17,7 @@ public: /* virtual */ bool ChangeResolution(int w, int h); - /* virtual */ void ToggleFullscreen(bool fullscreen); + /* virtual */ bool ToggleFullscreen(bool fullscreen); }; class FVideoDriver_SDL: public VideoDriverFactory { diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -13,7 +13,7 @@ public: virtual bool ChangeResolution(int w, int h) = 0; - virtual void ToggleFullscreen(bool fullscreen) = 0; + virtual bool ToggleFullscreen(bool fullscreen) = 0; }; class VideoDriverFactoryBase: public DriverFactoryBase { diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -210,7 +210,7 @@ static void CALLBACK TrackMouseTimerProc } } -static void MakeWindow(bool full_screen) +static bool MakeWindow(bool full_screen) { _fullscreen = full_screen; @@ -242,8 +242,8 @@ static void MakeWindow(bool full_screen) settings.dmDisplayFrequency = _display_hz; if (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { - MakeWindow(false); - return; + MakeWindow(false); // don't care about the result + return false; // the request failed } } else if (_wnd.fullscreen) { // restore display? @@ -291,6 +291,7 @@ static void MakeWindow(bool full_screen) } } GameSizeChanged(); // invalidate all windows, force redraw + return true; // the request succedded } static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) @@ -895,12 +896,10 @@ bool VideoDriver_Win32::ChangeResolution _wnd.width = _wnd.width_org = w; _wnd.height = _wnd.height_org = h; - MakeWindow(_fullscreen); // _wnd.fullscreen screws up ingame resolution switching - - return true; + return MakeWindow(_fullscreen); // _wnd.fullscreen screws up ingame resolution switching } -void VideoDriver_Win32::ToggleFullscreen(bool full_screen) +bool VideoDriver_Win32::ToggleFullscreen(bool full_screen) { - MakeWindow(full_screen); + return MakeWindow(full_screen); } diff --git a/src/video/win32_v.h b/src/video/win32_v.h --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -17,7 +17,7 @@ public: /* virtual */ bool ChangeResolution(int w, int h); - /* virtual */ void ToggleFullscreen(bool fullscreen); + /* virtual */ bool ToggleFullscreen(bool fullscreen); }; class FVideoDriver_Win32: public VideoDriverFactory {