mirror of https://github.com/OpenTTD/OpenTTD
(svn r11734) -Change: Allow ToggleFullScreen to return the result of the operation' attempt. Previously, only visual clues were available.
-Fix[FS#1519]: When you can not use this resolution at full screen, now you'll know that it failed. As for the reason it did not work, each computer/OS has its reason.release/0.6
parent
a8611311ac
commit
3dd61f423a
|
@ -1275,12 +1275,13 @@ bool ChangeResInGame(int width, int height)
|
||||||
return (_screen.width == width && _screen.height == height) || _video_driver->ChangeResolution(width, height);
|
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) {
|
if (_fullscreen != fs && _num_resolutions == 0) {
|
||||||
DEBUG(driver, 0, "Could not find a suitable fullscreen resolution");
|
DEBUG(driver, 0, "Could not find a suitable fullscreen resolution");
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CDECL compare_res(const void *pa, const void *pb)
|
static int CDECL compare_res(const void *pa, const void *pb)
|
||||||
|
|
|
@ -151,7 +151,7 @@ void ScreenSizeChanged();
|
||||||
void UndrawMouseCursor();
|
void UndrawMouseCursor();
|
||||||
bool ChangeResInGame(int w, int h);
|
bool ChangeResInGame(int w, int h);
|
||||||
void SortResolutions(int count);
|
void SortResolutions(int count);
|
||||||
void ToggleFullScreen(bool fs);
|
bool ToggleFullScreen(bool fs);
|
||||||
|
|
||||||
/* gfx.cpp */
|
/* gfx.cpp */
|
||||||
#define ASCII_LETTERSTART 32
|
#define ASCII_LETTERSTART 32
|
||||||
|
|
|
@ -941,6 +941,7 @@ STR_OPTIONS_LANG_TIP :{BLACK}Select t
|
||||||
|
|
||||||
STR_OPTIONS_FULLSCREEN :{BLACK}Fullscreen
|
STR_OPTIONS_FULLSCREEN :{BLACK}Fullscreen
|
||||||
STR_OPTIONS_FULLSCREEN_TIP :{BLACK}Check this box to play OpenTTD fullscreen mode
|
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 :{BLACK}Screen resolution
|
||||||
STR_OPTIONS_RES_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
|
STR_OPTIONS_RES_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
|
||||||
|
|
|
@ -201,8 +201,11 @@ static void GameOptionsWndProc(Window *w, WindowEvent *e)
|
||||||
ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_RESOLUTION_START, _num_resolutions), GetCurRes(), 27, 0, 0);
|
ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_RESOLUTION_START, _num_resolutions), GetCurRes(), 27, 0, 0);
|
||||||
return;
|
return;
|
||||||
case 28: /* Click fullscreen on/off */
|
case 28: /* Click fullscreen on/off */
|
||||||
w->SetWidgetLoweredState(28, !_fullscreen);
|
/* try to toggle full-screen on/off */
|
||||||
ToggleFullScreen(!_fullscreen); // toggle full-screen on/off
|
if (!ToggleFullScreen(!_fullscreen)) {
|
||||||
|
ShowErrorMessage(INVALID_STRING_ID, STR_FULLSCREEN_FAILED, 0, 0);
|
||||||
|
}
|
||||||
|
w->SetWidgetLoweredState(28, _fullscreen);
|
||||||
SetWindowDirty(w);
|
SetWindowDirty(w);
|
||||||
return;
|
return;
|
||||||
case 30: case 31: /* Setup screenshot format dropdown */
|
case 30: case 31: /* Setup screenshot format dropdown */
|
||||||
|
|
|
@ -19,7 +19,7 @@ public:
|
||||||
|
|
||||||
/* virtual */ bool ChangeResolution(int w, int h);
|
/* virtual */ bool ChangeResolution(int w, int h);
|
||||||
|
|
||||||
/* virtual */ void ToggleFullscreen(bool fullscreen);
|
/* virtual */ bool ToggleFullscreen(bool fullscreen);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FVideoDriver_Cocoa: public VideoDriverFactory<FVideoDriver_Cocoa> {
|
class FVideoDriver_Cocoa: public VideoDriverFactory<FVideoDriver_Cocoa> {
|
||||||
|
|
|
@ -361,7 +361,7 @@ bool VideoDriver_Cocoa::ChangeResolution(int w, int h)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoDriver_Cocoa::ToggleFullscreen(bool full_screen)
|
bool VideoDriver_Cocoa::ToggleFullscreen(bool full_screen)
|
||||||
{
|
{
|
||||||
bool oldfs;
|
bool oldfs;
|
||||||
|
|
||||||
|
@ -386,6 +386,7 @@ void VideoDriver_Cocoa::ToggleFullscreen(bool full_screen)
|
||||||
QZ_GameSizeChanged();
|
QZ_GameSizeChanged();
|
||||||
|
|
||||||
QZ_UpdateVideoModes();
|
QZ_UpdateVideoModes();
|
||||||
|
return _cocoa_subdriver->IsFullscreen() == full_screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -168,7 +168,7 @@ void VideoDriver_Dedicated::Stop()
|
||||||
|
|
||||||
void VideoDriver_Dedicated::MakeDirty(int left, int top, int width, int height) {}
|
void VideoDriver_Dedicated::MakeDirty(int left, int top, int width, int height) {}
|
||||||
bool VideoDriver_Dedicated::ChangeResolution(int w, int h) { return false; }
|
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)
|
#if defined(UNIX) || defined(__OS2__) || defined(PSP)
|
||||||
static bool InputWaiting()
|
static bool InputWaiting()
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
|
|
||||||
/* virtual */ bool ChangeResolution(int w, int h);
|
/* virtual */ bool ChangeResolution(int w, int h);
|
||||||
|
|
||||||
/* virtual */ void ToggleFullscreen(bool fullscreen);
|
/* virtual */ bool ToggleFullscreen(bool fullscreen);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FVideoDriver_Dedicated: public VideoDriverFactory<FVideoDriver_Dedicated> {
|
class FVideoDriver_Dedicated: public VideoDriverFactory<FVideoDriver_Dedicated> {
|
||||||
|
|
|
@ -38,4 +38,4 @@ void VideoDriver_Null::MainLoop()
|
||||||
|
|
||||||
bool VideoDriver_Null::ChangeResolution(int w, int h) { return false; }
|
bool VideoDriver_Null::ChangeResolution(int w, int h) { return false; }
|
||||||
|
|
||||||
void VideoDriver_Null::ToggleFullscreen(bool fs) {}
|
bool VideoDriver_Null::ToggleFullscreen(bool fs) { return false; }
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
|
|
||||||
/* virtual */ bool ChangeResolution(int w, int h);
|
/* virtual */ bool ChangeResolution(int w, int h);
|
||||||
|
|
||||||
/* virtual */ void ToggleFullscreen(bool fullscreen);
|
/* virtual */ bool ToggleFullscreen(bool fullscreen);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FVideoDriver_Null: public VideoDriverFactory<FVideoDriver_Null> {
|
class FVideoDriver_Null: public VideoDriverFactory<FVideoDriver_Null> {
|
||||||
|
|
|
@ -521,14 +521,16 @@ bool VideoDriver_SDL::ChangeResolution(int w, int h)
|
||||||
return CreateMainSurface(w, h);
|
return CreateMainSurface(w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoDriver_SDL::ToggleFullscreen(bool fullscreen)
|
bool VideoDriver_SDL::ToggleFullscreen(bool fullscreen)
|
||||||
{
|
{
|
||||||
_fullscreen = fullscreen;
|
_fullscreen = fullscreen;
|
||||||
GetVideoModes(); // get the list of available video modes
|
GetVideoModes(); // get the list of available video modes
|
||||||
if (_num_resolutions == 0 || !this->ChangeResolution(_cur_resolution[0], _cur_resolution[1])) {
|
if (_num_resolutions == 0 || !this->ChangeResolution(_cur_resolution[0], _cur_resolution[1])) {
|
||||||
// switching resolution failed, put back full_screen to original status
|
// switching resolution failed, put back full_screen to original status
|
||||||
_fullscreen ^= true;
|
_fullscreen ^= true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WITH_SDL */
|
#endif /* WITH_SDL */
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
|
|
||||||
/* virtual */ bool ChangeResolution(int w, int h);
|
/* virtual */ bool ChangeResolution(int w, int h);
|
||||||
|
|
||||||
/* virtual */ void ToggleFullscreen(bool fullscreen);
|
/* virtual */ bool ToggleFullscreen(bool fullscreen);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FVideoDriver_SDL: public VideoDriverFactory<FVideoDriver_SDL> {
|
class FVideoDriver_SDL: public VideoDriverFactory<FVideoDriver_SDL> {
|
||||||
|
|
|
@ -13,7 +13,7 @@ public:
|
||||||
|
|
||||||
virtual bool ChangeResolution(int w, int h) = 0;
|
virtual bool ChangeResolution(int w, int h) = 0;
|
||||||
|
|
||||||
virtual void ToggleFullscreen(bool fullscreen) = 0;
|
virtual bool ToggleFullscreen(bool fullscreen) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VideoDriverFactoryBase: public DriverFactoryBase {
|
class VideoDriverFactoryBase: public DriverFactoryBase {
|
||||||
|
|
|
@ -210,7 +210,7 @@ static void CALLBACK TrackMouseTimerProc(HWND hwnd, UINT msg, UINT event, DWORD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MakeWindow(bool full_screen)
|
static bool MakeWindow(bool full_screen)
|
||||||
{
|
{
|
||||||
_fullscreen = full_screen;
|
_fullscreen = full_screen;
|
||||||
|
|
||||||
|
@ -242,8 +242,8 @@ static void MakeWindow(bool full_screen)
|
||||||
settings.dmDisplayFrequency = _display_hz;
|
settings.dmDisplayFrequency = _display_hz;
|
||||||
|
|
||||||
if (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) {
|
if (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) {
|
||||||
MakeWindow(false);
|
MakeWindow(false); // don't care about the result
|
||||||
return;
|
return false; // the request failed
|
||||||
}
|
}
|
||||||
} else if (_wnd.fullscreen) {
|
} else if (_wnd.fullscreen) {
|
||||||
// restore display?
|
// restore display?
|
||||||
|
@ -291,6 +291,7 @@ static void MakeWindow(bool full_screen)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GameSizeChanged(); // invalidate all windows, force redraw
|
GameSizeChanged(); // invalidate all windows, force redraw
|
||||||
|
return true; // the request succedded
|
||||||
}
|
}
|
||||||
|
|
||||||
static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
@ -895,12 +896,10 @@ bool VideoDriver_Win32::ChangeResolution(int w, int h)
|
||||||
_wnd.width = _wnd.width_org = w;
|
_wnd.width = _wnd.width_org = w;
|
||||||
_wnd.height = _wnd.height_org = h;
|
_wnd.height = _wnd.height_org = h;
|
||||||
|
|
||||||
MakeWindow(_fullscreen); // _wnd.fullscreen screws up ingame resolution switching
|
return MakeWindow(_fullscreen); // _wnd.fullscreen screws up ingame resolution switching
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoDriver_Win32::ToggleFullscreen(bool full_screen)
|
bool VideoDriver_Win32::ToggleFullscreen(bool full_screen)
|
||||||
{
|
{
|
||||||
MakeWindow(full_screen);
|
return MakeWindow(full_screen);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
|
|
||||||
/* virtual */ bool ChangeResolution(int w, int h);
|
/* virtual */ bool ChangeResolution(int w, int h);
|
||||||
|
|
||||||
/* virtual */ void ToggleFullscreen(bool fullscreen);
|
/* virtual */ bool ToggleFullscreen(bool fullscreen);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FVideoDriver_Win32: public VideoDriverFactory<FVideoDriver_Win32> {
|
class FVideoDriver_Win32: public VideoDriverFactory<FVideoDriver_Win32> {
|
||||||
|
|
Loading…
Reference in New Issue