mirror of https://github.com/OpenTTD/OpenTTD
Feature: Choose a sensible window size on a fresh OTTD config file. (#8536)
parent
711723d738
commit
fa60c1f8b9
|
@ -708,14 +708,12 @@ int openttd_main(int argc, char *argv[])
|
||||||
|
|
||||||
if (resolution.width != 0) _cur_resolution = resolution;
|
if (resolution.width != 0) _cur_resolution = resolution;
|
||||||
|
|
||||||
/*
|
/* Limit width times height times bytes per pixel to fit a 32 bit
|
||||||
* The width and height must be at least 1 pixel and width times
|
* integer, This way all internal drawing routines work correctly.
|
||||||
* height times bytes per pixel must still fit within a 32 bits
|
* A resolution that has one component as 0 is treated as a marker to
|
||||||
* integer, even for 32 bpp video modes. This way all internal
|
* auto-detect a good window size. */
|
||||||
* drawing routines work correctly.
|
_cur_resolution.width = std::min(_cur_resolution.width, UINT16_MAX / 2u);
|
||||||
*/
|
_cur_resolution.height = std::min(_cur_resolution.height, UINT16_MAX / 2u);
|
||||||
_cur_resolution.width = ClampU(_cur_resolution.width, 1, UINT16_MAX / 2);
|
|
||||||
_cur_resolution.height = ClampU(_cur_resolution.height, 1, UINT16_MAX / 2);
|
|
||||||
|
|
||||||
/* Assume the cursor starts within the game as not all video drivers
|
/* Assume the cursor starts within the game as not all video drivers
|
||||||
* get an event that the cursor is within the window when it is opened.
|
* get an event that the cursor is within the window when it is opened.
|
||||||
|
|
|
@ -120,7 +120,7 @@ name = ""resolution""
|
||||||
type = SLE_INT
|
type = SLE_INT
|
||||||
length = 2
|
length = 2
|
||||||
var = _cur_resolution
|
var = _cur_resolution
|
||||||
def = ""640,480""
|
def = ""0,0""
|
||||||
cat = SC_BASIC
|
cat = SC_BASIC
|
||||||
|
|
||||||
[SDTG_STR]
|
[SDTG_STR]
|
||||||
|
|
|
@ -417,6 +417,8 @@ const char *VideoDriver_Allegro::Start(const StringList &parm)
|
||||||
}
|
}
|
||||||
_allegro_instance_count++;
|
_allegro_instance_count++;
|
||||||
|
|
||||||
|
this->UpdateAutoResolution();
|
||||||
|
|
||||||
install_timer();
|
install_timer();
|
||||||
install_mouse();
|
install_mouse();
|
||||||
install_keyboard();
|
install_keyboard();
|
||||||
|
|
|
@ -70,6 +70,9 @@ public:
|
||||||
/** Main game loop. */
|
/** Main game loop. */
|
||||||
void GameLoop(); // In event.mm.
|
void GameLoop(); // In event.mm.
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Dimension GetScreenSize() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class WindowQuartzSubdriver;
|
friend class WindowQuartzSubdriver;
|
||||||
|
|
||||||
|
|
|
@ -200,6 +200,8 @@ const char *VideoDriver_Cocoa::Start(const StringList &parm)
|
||||||
/* Don't create a window or enter fullscreen if we're just going to show a dialog. */
|
/* Don't create a window or enter fullscreen if we're just going to show a dialog. */
|
||||||
if (!CocoaSetupApplication()) return NULL;
|
if (!CocoaSetupApplication()) return NULL;
|
||||||
|
|
||||||
|
this->UpdateAutoResolution();
|
||||||
|
|
||||||
this->orig_res = _cur_resolution;
|
this->orig_res = _cur_resolution;
|
||||||
int width = _cur_resolution.width;
|
int width = _cur_resolution.width;
|
||||||
int height = _cur_resolution.height;
|
int height = _cur_resolution.height;
|
||||||
|
@ -302,6 +304,15 @@ void VideoDriver_Cocoa::EditBoxLostFocus()
|
||||||
HandleTextInput(NULL, true);
|
HandleTextInput(NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the resolution of the main screen.
|
||||||
|
*/
|
||||||
|
Dimension VideoDriver_Cocoa::GetScreenSize() const
|
||||||
|
{
|
||||||
|
NSRect frame = [ [ NSScreen mainScreen ] frame ];
|
||||||
|
return { static_cast<uint>(NSWidth(frame)), static_cast<uint>(NSHeight(frame)) };
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle a change of the display area.
|
* Handle a change of the display area.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -135,6 +135,8 @@ static FVideoDriver_Dedicated iFVideoDriver_Dedicated;
|
||||||
|
|
||||||
const char *VideoDriver_Dedicated::Start(const StringList &parm)
|
const char *VideoDriver_Dedicated::Start(const StringList &parm)
|
||||||
{
|
{
|
||||||
|
this->UpdateAutoResolution();
|
||||||
|
|
||||||
int bpp = BlitterFactory::GetCurrentBlitter()->GetScreenDepth();
|
int bpp = BlitterFactory::GetCurrentBlitter()->GetScreenDepth();
|
||||||
_dedicated_video_mem = (bpp == 0) ? nullptr : MallocT<byte>(_cur_resolution.width * _cur_resolution.height * (bpp / 8));
|
_dedicated_video_mem = (bpp == 0) ? nullptr : MallocT<byte>(_cur_resolution.width * _cur_resolution.height * (bpp / 8));
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@ const char *VideoDriver_Null::Start(const StringList &parm)
|
||||||
_set_error_mode(_OUT_TO_STDERR);
|
_set_error_mode(_OUT_TO_STDERR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
this->UpdateAutoResolution();
|
||||||
|
|
||||||
this->ticks = GetDriverParamInt(parm, "ticks", 1000);
|
this->ticks = GetDriverParamInt(parm, "ticks", 1000);
|
||||||
_screen.width = _screen.pitch = _cur_resolution.width;
|
_screen.width = _screen.pitch = _cur_resolution.width;
|
||||||
_screen.height = _cur_resolution.height;
|
_screen.height = _cur_resolution.height;
|
||||||
|
|
|
@ -674,6 +674,8 @@ const char *VideoDriver_SDL::Start(const StringList &parm)
|
||||||
}
|
}
|
||||||
if (ret_code < 0) return SDL_GetError();
|
if (ret_code < 0) return SDL_GetError();
|
||||||
|
|
||||||
|
this->UpdateAutoResolution();
|
||||||
|
|
||||||
GetVideoModes();
|
GetVideoModes();
|
||||||
if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height, false)) {
|
if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height, false)) {
|
||||||
return SDL_GetError();
|
return SDL_GetError();
|
||||||
|
@ -930,4 +932,12 @@ void VideoDriver_SDL::ReleaseBlitterLock()
|
||||||
if (_draw_mutex != nullptr) _draw_mutex->unlock();
|
if (_draw_mutex != nullptr) _draw_mutex->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Dimension VideoDriver_SDL::GetScreenSize() const
|
||||||
|
{
|
||||||
|
SDL_DisplayMode mode;
|
||||||
|
if (SDL_GetCurrentDisplayMode(0, &mode) != 0) return VideoDriver::GetScreenSize();
|
||||||
|
|
||||||
|
return { static_cast<uint>(mode.w), static_cast<uint>(mode.h) };
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* WITH_SDL2 */
|
#endif /* WITH_SDL2 */
|
||||||
|
|
|
@ -40,6 +40,10 @@ public:
|
||||||
void EditBoxLostFocus() override;
|
void EditBoxLostFocus() override;
|
||||||
|
|
||||||
const char *GetName() const override { return "sdl"; }
|
const char *GetName() const override { return "sdl"; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Dimension GetScreenSize() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int PollEvent();
|
int PollEvent();
|
||||||
void LoopOnce();
|
void LoopOnce();
|
||||||
|
|
|
@ -614,6 +614,8 @@ const char *VideoDriver_SDL::Start(const StringList &parm)
|
||||||
}
|
}
|
||||||
if (ret_code < 0) return SDL_GetError();
|
if (ret_code < 0) return SDL_GetError();
|
||||||
|
|
||||||
|
this->UpdateAutoResolution();
|
||||||
|
|
||||||
GetVideoModes();
|
GetVideoModes();
|
||||||
if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height)) {
|
if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height)) {
|
||||||
return SDL_GetError();
|
return SDL_GetError();
|
||||||
|
|
|
@ -12,10 +12,19 @@
|
||||||
|
|
||||||
#include "../driver.h"
|
#include "../driver.h"
|
||||||
#include "../core/geometry_type.hpp"
|
#include "../core/geometry_type.hpp"
|
||||||
|
#include "../core/math_func.hpp"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
extern std::string _ini_videodriver;
|
||||||
|
extern std::vector<Dimension> _resolutions;
|
||||||
|
extern Dimension _cur_resolution;
|
||||||
|
extern bool _rightclick_emulate;
|
||||||
|
|
||||||
/** The base of all video drivers. */
|
/** The base of all video drivers. */
|
||||||
class VideoDriver : public Driver {
|
class VideoDriver : public Driver {
|
||||||
|
const uint DEFAULT_WINDOW_WIDTH = 640u; ///< Default window width.
|
||||||
|
const uint DEFAULT_WINDOW_HEIGHT = 480u; ///< Default window height.
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Mark a particular area dirty.
|
* Mark a particular area dirty.
|
||||||
|
@ -102,11 +111,27 @@ public:
|
||||||
static VideoDriver *GetInstance() {
|
static VideoDriver *GetInstance() {
|
||||||
return static_cast<VideoDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO));
|
return static_cast<VideoDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/*
|
||||||
|
* Get the resolution of the main screen.
|
||||||
|
*/
|
||||||
|
virtual Dimension GetScreenSize() const { return { DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT }; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply resolution auto-detection and clamp to sensible defaults.
|
||||||
|
*/
|
||||||
|
void UpdateAutoResolution()
|
||||||
|
{
|
||||||
|
if (_cur_resolution.width == 0 || _cur_resolution.height == 0) {
|
||||||
|
/* Auto-detect a good resolution. We aim for 75% of the screen size.
|
||||||
|
* Limit width times height times bytes per pixel to fit a 32 bit
|
||||||
|
* integer, This way all internal drawing routines work correctly. */
|
||||||
|
Dimension res = this->GetScreenSize();
|
||||||
|
_cur_resolution.width = ClampU(res.width * 3 / 4, DEFAULT_WINDOW_WIDTH, UINT16_MAX / 2);
|
||||||
|
_cur_resolution.height = ClampU(res.height * 3 / 4, DEFAULT_WINDOW_HEIGHT, UINT16_MAX / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
extern std::string _ini_videodriver;
|
|
||||||
extern std::vector<Dimension> _resolutions;
|
|
||||||
extern Dimension _cur_resolution;
|
|
||||||
extern bool _rightclick_emulate;
|
|
||||||
|
|
||||||
#endif /* VIDEO_VIDEO_DRIVER_HPP */
|
#endif /* VIDEO_VIDEO_DRIVER_HPP */
|
||||||
|
|
|
@ -1114,6 +1114,8 @@ static FVideoDriver_Win32 iFVideoDriver_Win32;
|
||||||
|
|
||||||
const char *VideoDriver_Win32::Start(const StringList &parm)
|
const char *VideoDriver_Win32::Start(const StringList &parm)
|
||||||
{
|
{
|
||||||
|
this->UpdateAutoResolution();
|
||||||
|
|
||||||
memset(&_wnd, 0, sizeof(_wnd));
|
memset(&_wnd, 0, sizeof(_wnd));
|
||||||
|
|
||||||
RegisterWndClass();
|
RegisterWndClass();
|
||||||
|
@ -1343,3 +1345,8 @@ void VideoDriver_Win32::EditBoxLostFocus()
|
||||||
SetCompositionPos(_wnd.main_wnd);
|
SetCompositionPos(_wnd.main_wnd);
|
||||||
SetCandidatePos(_wnd.main_wnd);
|
SetCandidatePos(_wnd.main_wnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Dimension VideoDriver_Win32::GetScreenSize() const
|
||||||
|
{
|
||||||
|
return { static_cast<uint>(GetSystemMetrics(SM_CXSCREEN)), static_cast<uint>(GetSystemMetrics(SM_CYSCREEN)) };
|
||||||
|
}
|
||||||
|
|
|
@ -40,6 +40,9 @@ public:
|
||||||
const char *GetName() const override { return "win32"; }
|
const char *GetName() const override { return "win32"; }
|
||||||
|
|
||||||
bool MakeWindow(bool full_screen);
|
bool MakeWindow(bool full_screen);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Dimension GetScreenSize() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** The factory for Windows' video driver. */
|
/** The factory for Windows' video driver. */
|
||||||
|
|
Loading…
Reference in New Issue