From fa60c1f8b94dd5584a5d5331de277ca23a203422 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Thu, 14 Jan 2021 21:53:06 +0100 Subject: Feature: Choose a sensible window size on a fresh OTTD config file. (#8536) --- src/video/allegro_v.cpp | 2 ++ src/video/cocoa/cocoa_v.h | 3 +++ src/video/cocoa/cocoa_v.mm | 11 +++++++++++ src/video/dedicated_v.cpp | 2 ++ src/video/null_v.cpp | 2 ++ src/video/sdl2_v.cpp | 10 ++++++++++ src/video/sdl2_v.h | 4 ++++ src/video/sdl_v.cpp | 2 ++ src/video/video_driver.hpp | 35 ++++++++++++++++++++++++++++++----- src/video/win32_v.cpp | 7 +++++++ src/video/win32_v.h | 3 +++ 11 files changed, 76 insertions(+), 5 deletions(-) (limited to 'src/video') diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index 9cab0805e..c3df6c650 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -417,6 +417,8 @@ const char *VideoDriver_Allegro::Start(const StringList &parm) } _allegro_instance_count++; + this->UpdateAutoResolution(); + install_timer(); install_mouse(); install_keyboard(); diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index f5d175640..54ff53d15 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -70,6 +70,9 @@ public: /** Main game loop. */ void GameLoop(); // In event.mm. +protected: + Dimension GetScreenSize() const override; + private: friend class WindowQuartzSubdriver; diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index eae1acbc9..f09920fe2 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -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. */ if (!CocoaSetupApplication()) return NULL; + this->UpdateAutoResolution(); + this->orig_res = _cur_resolution; int width = _cur_resolution.width; int height = _cur_resolution.height; @@ -302,6 +304,15 @@ void VideoDriver_Cocoa::EditBoxLostFocus() HandleTextInput(NULL, true); } +/** + * Get the resolution of the main screen. + */ +Dimension VideoDriver_Cocoa::GetScreenSize() const +{ + NSRect frame = [ [ NSScreen mainScreen ] frame ]; + return { static_cast(NSWidth(frame)), static_cast(NSHeight(frame)) }; +} + /** * Handle a change of the display area. */ diff --git a/src/video/dedicated_v.cpp b/src/video/dedicated_v.cpp index 7efd417ce..d237e2d9e 100644 --- a/src/video/dedicated_v.cpp +++ b/src/video/dedicated_v.cpp @@ -135,6 +135,8 @@ static FVideoDriver_Dedicated iFVideoDriver_Dedicated; const char *VideoDriver_Dedicated::Start(const StringList &parm) { + this->UpdateAutoResolution(); + int bpp = BlitterFactory::GetCurrentBlitter()->GetScreenDepth(); _dedicated_video_mem = (bpp == 0) ? nullptr : MallocT(_cur_resolution.width * _cur_resolution.height * (bpp / 8)); diff --git a/src/video/null_v.cpp b/src/video/null_v.cpp index 707045040..49f394153 100644 --- a/src/video/null_v.cpp +++ b/src/video/null_v.cpp @@ -24,6 +24,8 @@ const char *VideoDriver_Null::Start(const StringList &parm) _set_error_mode(_OUT_TO_STDERR); #endif + this->UpdateAutoResolution(); + this->ticks = GetDriverParamInt(parm, "ticks", 1000); _screen.width = _screen.pitch = _cur_resolution.width; _screen.height = _cur_resolution.height; diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index dee0ff93d..f2fbd6d5a 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -674,6 +674,8 @@ const char *VideoDriver_SDL::Start(const StringList &parm) } if (ret_code < 0) return SDL_GetError(); + this->UpdateAutoResolution(); + GetVideoModes(); if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height, false)) { return SDL_GetError(); @@ -930,4 +932,12 @@ void VideoDriver_SDL::ReleaseBlitterLock() 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(mode.w), static_cast(mode.h) }; +} + #endif /* WITH_SDL2 */ diff --git a/src/video/sdl2_v.h b/src/video/sdl2_v.h index c2ac87a06..f0f27df79 100644 --- a/src/video/sdl2_v.h +++ b/src/video/sdl2_v.h @@ -40,6 +40,10 @@ public: void EditBoxLostFocus() override; const char *GetName() const override { return "sdl"; } + +protected: + Dimension GetScreenSize() const override; + private: int PollEvent(); void LoopOnce(); diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index 3fae8e69b..56068fe44 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -614,6 +614,8 @@ const char *VideoDriver_SDL::Start(const StringList &parm) } if (ret_code < 0) return SDL_GetError(); + this->UpdateAutoResolution(); + GetVideoModes(); if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height)) { return SDL_GetError(); diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index 15dd5d0d4..d4e750134 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -12,10 +12,19 @@ #include "../driver.h" #include "../core/geometry_type.hpp" +#include "../core/math_func.hpp" #include +extern std::string _ini_videodriver; +extern std::vector _resolutions; +extern Dimension _cur_resolution; +extern bool _rightclick_emulate; + /** The base of all video drivers. */ class VideoDriver : public Driver { + const uint DEFAULT_WINDOW_WIDTH = 640u; ///< Default window width. + const uint DEFAULT_WINDOW_HEIGHT = 480u; ///< Default window height. + public: /** * Mark a particular area dirty. @@ -102,11 +111,27 @@ public: static VideoDriver *GetInstance() { return static_cast(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO)); } -}; -extern std::string _ini_videodriver; -extern std::vector _resolutions; -extern Dimension _cur_resolution; -extern bool _rightclick_emulate; +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); + } + } +}; #endif /* VIDEO_VIDEO_DRIVER_HPP */ diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 29b85985f..e7e89fd73 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -1114,6 +1114,8 @@ static FVideoDriver_Win32 iFVideoDriver_Win32; const char *VideoDriver_Win32::Start(const StringList &parm) { + this->UpdateAutoResolution(); + memset(&_wnd, 0, sizeof(_wnd)); RegisterWndClass(); @@ -1343,3 +1345,8 @@ void VideoDriver_Win32::EditBoxLostFocus() SetCompositionPos(_wnd.main_wnd); SetCandidatePos(_wnd.main_wnd); } + +Dimension VideoDriver_Win32::GetScreenSize() const +{ + return { static_cast(GetSystemMetrics(SM_CXSCREEN)), static_cast(GetSystemMetrics(SM_CYSCREEN)) }; +} diff --git a/src/video/win32_v.h b/src/video/win32_v.h index 5c1b20322..ef02e132e 100644 --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -40,6 +40,9 @@ public: const char *GetName() const override { return "win32"; } bool MakeWindow(bool full_screen); + +protected: + Dimension GetScreenSize() const override; }; /** The factory for Windows' video driver. */ -- cgit v1.2.3-70-g09d2