Feature: Choose a sensible window size on a fresh OTTD config file. (#8536)

pull/217/head
Michael Lutz 4 years ago committed by GitHub
parent 711723d738
commit fa60c1f8b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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));
} }
};
extern std::string _ini_videodriver; protected:
extern std::vector<Dimension> _resolutions; /*
extern Dimension _cur_resolution; * Get the resolution of the main screen.
extern bool _rightclick_emulate; */
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);
}
}
};
#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…
Cancel
Save