diff --git a/external/libutil b/external/libutil index cb940ef62c..350a076870 160000 --- a/external/libutil +++ b/external/libutil @@ -1 +1 @@ -Subproject commit cb940ef62c2324875d12bc6014838a22dbf290d2 +Subproject commit 350a0768701fc94408fa44b5405619481dbe31f3 diff --git a/extras/videoDrivers/SDL2/VideoSDL2.cpp b/extras/videoDrivers/SDL2/VideoSDL2.cpp index d279e7a001..1b6514ff51 100644 --- a/extras/videoDrivers/SDL2/VideoSDL2.cpp +++ b/extras/videoDrivers/SDL2/VideoSDL2.cpp @@ -103,7 +103,7 @@ void VideoSDL2::UpdateCurrentSizes() SetNewSize(VideoMode(w, h), Extent(w2, h2)); } -bool VideoSDL2::CreateScreen(const std::string& title, const VideoMode& size, bool fullscreen) +bool VideoSDL2::CreateScreen(const std::string& title, const VideoMode& size, DisplayMode displayMode) { if(!initialized) return false; @@ -125,18 +125,19 @@ bool VideoSDL2::CreateScreen(const std::string& title, const VideoMode& size, bo CHECK_SDL(SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8)); CHECK_SDL(SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1)); - int wndPos = SDL_WINDOWPOS_CENTERED; - + const int wndPos = SDL_WINDOWPOS_CENTERED; + const auto fullscreen = bitset::isSet(displayMode, DisplayMode::Fullscreen); const auto requestedSize = fullscreen ? FindClosestVideoMode(size) : size; - + const unsigned commonFlags = SDL_WINDOW_OPENGL; + const unsigned fullscreenFlag = (fullscreen ? SDL_WINDOW_FULLSCREEN : 0); window = SDL_CreateWindow(title.c_str(), wndPos, wndPos, requestedSize.width, requestedSize.height, - SDL_WINDOW_OPENGL | (fullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE)); + commonFlags | fullscreenFlag); // Fallback to non-fullscreen if(!window && fullscreen) { - window = SDL_CreateWindow(title.c_str(), wndPos, wndPos, requestedSize.width, requestedSize.height, - SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); + window = + SDL_CreateWindow(title.c_str(), wndPos, wndPos, requestedSize.width, requestedSize.height, commonFlags); } if(!window) @@ -145,10 +146,11 @@ bool VideoSDL2::CreateScreen(const std::string& title, const VideoMode& size, bo return false; } - isFullscreen_ = (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) != 0; + displayMode_ = + bitset::set(displayMode_, DisplayMode::Fullscreen, (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) != 0); UpdateCurrentSizes(); - if(!isFullscreen_) + if(!bitset::isSet(displayMode_, DisplayMode::Fullscreen)) MoveWindowToCenter(); SDL_Surface* iconSurf = @@ -173,16 +175,19 @@ bool VideoSDL2::CreateScreen(const std::string& title, const VideoMode& size, bo return true; } -bool VideoSDL2::ResizeScreen(const VideoMode& newSize, bool fullscreen) +bool VideoSDL2::ResizeScreen(const VideoMode& newSize, DisplayMode displayMode) { if(!initialized) return false; - if(isFullscreen_ != fullscreen) + const auto newFullscreen = bitset::isSet(displayMode, DisplayMode::Fullscreen); + auto fullscreen = bitset::isSet(displayMode_, DisplayMode::Fullscreen); + if(fullscreen != newFullscreen) { - SDL_SetWindowFullscreen(window, fullscreen ? SDL_WINDOW_FULLSCREEN : 0); - isFullscreen_ = (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) != 0; - if(!isFullscreen_) + SDL_SetWindowFullscreen(window, newFullscreen ? SDL_WINDOW_FULLSCREEN : 0); + fullscreen = (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) != 0; + displayMode_ = bitset::set(displayMode_, DisplayMode::Fullscreen, fullscreen); + if(!fullscreen) { #if SDL_VERSION_ATLEAST(2, 0, 5) SDL_SetWindowResizable(window, SDL_TRUE); @@ -193,7 +198,7 @@ bool VideoSDL2::ResizeScreen(const VideoMode& newSize, bool fullscreen) if(newSize != GetWindowSize()) { - if(isFullscreen_) + if(fullscreen) { auto const targetMode = FindClosestVideoMode(newSize); SDL_DisplayMode target; @@ -267,7 +272,8 @@ bool VideoSDL2::MessageLoop() { case SDL_WINDOWEVENT_RESIZED: { - isFullscreen_ = (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) != 0; + displayMode_ = bitset::set(displayMode_, DisplayMode::Fullscreen, + (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) != 0); VideoMode newSize(ev.window.data1, ev.window.data2); if(newSize != GetWindowSize()) { diff --git a/extras/videoDrivers/SDL2/VideoSDL2.h b/extras/videoDrivers/SDL2/VideoSDL2.h index 0a34be639c..0c03184cf4 100644 --- a/extras/videoDrivers/SDL2/VideoSDL2.h +++ b/extras/videoDrivers/SDL2/VideoSDL2.h @@ -24,8 +24,8 @@ class VideoSDL2 final : public VideoDriver bool Initialize() override; - bool CreateScreen(const std::string& title, const VideoMode& size, bool fullscreen) override; - bool ResizeScreen(const VideoMode& newSize, bool fullscreen) override; + bool CreateScreen(const std::string& title, const VideoMode& size, DisplayMode displayMode) override; + bool ResizeScreen(const VideoMode& newSize, DisplayMode displayMode) override; void DestroyScreen() override; diff --git a/extras/videoDrivers/WinAPI/WinAPI.cpp b/extras/videoDrivers/WinAPI/WinAPI.cpp index 8b43cb086c..0a2d6f9de4 100644 --- a/extras/videoDrivers/WinAPI/WinAPI.cpp +++ b/extras/videoDrivers/WinAPI/WinAPI.cpp @@ -138,17 +138,18 @@ void VideoWinAPI::CleanUp() * @bug Hardwarecursor ist bei Fenstermodus sichtbar, * Cursor deaktivieren ist fehlerhaft */ -bool VideoWinAPI::CreateScreen(const std::string& title, const VideoMode& newSize, bool fullscreen) +bool VideoWinAPI::CreateScreen(const std::string& title, const VideoMode& newSize, DisplayMode displayMode) { if(!initialized) return false; + const auto fullscreen = bitset::isSet(displayMode, DisplayMode::Fullscreen); if(!RegisterAndCreateWindow(title, newSize, fullscreen)) return false; if(fullscreen && !MakeFullscreen(GetWindowSize())) return false; - isFullscreen_ = fullscreen; + displayMode_ = bitset::set(displayMode_, DisplayMode::Fullscreen); if(!InitOGL()) return false; @@ -174,34 +175,37 @@ bool VideoWinAPI::CreateScreen(const std::string& title, const VideoMode& newSiz * * @todo Vollbildmodus ggf. wechseln */ -bool VideoWinAPI::ResizeScreen(const VideoMode& newSize, bool fullscreen) +bool VideoWinAPI::ResizeScreen(const VideoMode& newSize, DisplayMode displayMode) { if(!initialized || !isWindowResizable) return false; - if(isFullscreen_ == fullscreen && newSize == GetWindowSize()) + const auto newFullscreen = bitset::isSet(displayMode, DisplayMode::Fullscreen); + auto fullscreen = bitset::isSet(displayMode_, DisplayMode::Fullscreen); + if(fullscreen == newFullscreen && newSize == GetWindowSize()) return true; ShowWindow(screen, SW_HIDE); - VideoMode windowSize = fullscreen ? FindClosestVideoMode(newSize) : newSize; + VideoMode windowSize = newFullscreen ? FindClosestVideoMode(newSize) : newSize; // Try to switch full screen first - if(isFullscreen_ && !fullscreen) + if(fullscreen && !newFullscreen) { if(ChangeDisplaySettings(nullptr, 0) != DISP_CHANGE_SUCCESSFUL) return false; - } else if(isFullscreen_ || fullscreen) + } else if(fullscreen || newFullscreen) { if(!MakeFullscreen(windowSize)) return false; } + displayMode_ = bitset::set(displayMode_, DisplayMode::Fullscreen, newFullscreen); // Fensterstyle ggf. ändern - std::pair style = GetStyleFlags(isFullscreen_); + std::pair style = GetStyleFlags(newFullscreen); SetWindowLongPtr(screen, GWL_STYLE, style.first); SetWindowLongPtr(screen, GWL_EXSTYLE, style.second); - RECT wRect = CalculateWindowRect(isFullscreen_, windowSize); + RECT wRect = CalculateWindowRect(newFullscreen, windowSize); // Fenstergröße ändern UINT flags = SWP_SHOWWINDOW | SWP_DRAWFRAME | SWP_FRAMECHANGED; @@ -405,7 +409,7 @@ void VideoWinAPI::DestroyScreen() UnregisterClassW(windowClassName.c_str(), GetModuleHandle(nullptr)); - isFullscreen_ = false; + displayMode_ = bitset::clear(displayMode_, DisplayMode::Fullscreen); } /** diff --git a/extras/videoDrivers/WinAPI/WinAPI.h b/extras/videoDrivers/WinAPI/WinAPI.h index 408e4097e4..e9e9a7eeab 100644 --- a/extras/videoDrivers/WinAPI/WinAPI.h +++ b/extras/videoDrivers/WinAPI/WinAPI.h @@ -30,10 +30,10 @@ class VideoWinAPI final : public VideoDriver bool Initialize() override; /// Erstellt das Fenster mit entsprechenden Werten. - bool CreateScreen(const std::string& title, const VideoMode& newSize, bool fullscreen) override; + bool CreateScreen(const std::string& title, const VideoMode& newSize, DisplayMode displayMode) override; /// Erstellt oder verändert das Fenster mit entsprechenden Werten. - bool ResizeScreen(const VideoMode& newSize, bool fullscreen) override; + bool ResizeScreen(const VideoMode& newSize, DisplayMode displayMode) override; /// Schliesst das Fenster. void DestroyScreen() override; diff --git a/libs/driver/include/driver/VideoDriver.h b/libs/driver/include/driver/VideoDriver.h index 9d2860219d..8bceba72b5 100644 --- a/libs/driver/include/driver/VideoDriver.h +++ b/libs/driver/include/driver/VideoDriver.h @@ -29,7 +29,7 @@ class VideoDriver : public IVideoDriver VideoMode GetWindowSize() const override final { return windowSize_; } Extent GetRenderSize() const override final { return renderSize_; } - bool IsFullscreen() const override final { return isFullscreen_; } + DisplayMode GetDisplayMode() const override final { return displayMode_; } /// prüft auf Initialisierung. bool IsInitialized() const override final { return initialized; } @@ -43,7 +43,7 @@ class VideoDriver : public IVideoDriver bool initialized; /// Initialisierungsstatus. MouseCoords mouse_xy; /// Status der Maus. std::array keyboard; /// Status der Tastatur; - bool isFullscreen_; /// Vollbild an/aus? + DisplayMode displayMode_; /// Fullscreen on/off? private: // cached as possibly used often VideoMode windowSize_; diff --git a/libs/driver/include/driver/VideoInterface.h b/libs/driver/include/driver/VideoInterface.h index 04cf639bb0..c3e0f31c26 100644 --- a/libs/driver/include/driver/VideoInterface.h +++ b/libs/driver/include/driver/VideoInterface.h @@ -8,12 +8,20 @@ #include "Point.h" #include "VideoMode.h" #include "exportImport.h" +#include "s25util/enumUtils.h" #include #include /// Function type for loading OpenGL methods using OpenGL_Loader_Proc = void* (*)(const char*); +enum class DisplayMode : unsigned +{ + None, + Fullscreen = 1 << 0 +}; +MAKE_BITSET_STRONG(DisplayMode); + class BOOST_SYMBOL_VISIBLE IVideoDriver { public: @@ -25,9 +33,9 @@ class BOOST_SYMBOL_VISIBLE IVideoDriver virtual bool Initialize() = 0; /// Erstellt das Fenster mit entsprechenden Werten. - virtual bool CreateScreen(const std::string& title, const VideoMode& newSize, bool fullscreen) = 0; + virtual bool CreateScreen(const std::string& title, const VideoMode& newSize, DisplayMode displayMode) = 0; - virtual bool ResizeScreen(const VideoMode& newSize, bool fullscreen) = 0; + virtual bool ResizeScreen(const VideoMode& newSize, DisplayMode displayMode) = 0; /// Schliesst das Fenster. virtual void DestroyScreen() = 0; @@ -61,7 +69,7 @@ class BOOST_SYMBOL_VISIBLE IVideoDriver virtual VideoMode GetWindowSize() const = 0; /// Get the size of the render region in pixels virtual Extent GetRenderSize() const = 0; - virtual bool IsFullscreen() const = 0; + virtual DisplayMode GetDisplayMode() const = 0; /// Get state of the modifier keys virtual KeyEvent GetModKeyState() const = 0; diff --git a/libs/driver/src/VideoDriver.cpp b/libs/driver/src/VideoDriver.cpp index fc1c379911..b924a70a67 100644 --- a/libs/driver/src/VideoDriver.cpp +++ b/libs/driver/src/VideoDriver.cpp @@ -17,7 +17,7 @@ IVideoDriver::~IVideoDriver() = default; * @param[in] CallBack DriverCallback für Rückmeldungen. */ VideoDriver::VideoDriver(VideoDriverLoaderInterface* CallBack) - : CallBack(CallBack), initialized(false), isFullscreen_(false), renderSize_(0, 0) + : CallBack(CallBack), initialized(false), displayMode_(DisplayMode::None), renderSize_(0, 0) { std::fill(keyboard.begin(), keyboard.end(), false); } diff --git a/libs/s25main/GameManager.cpp b/libs/s25main/GameManager.cpp index 6d3cce3569..d32f437280 100644 --- a/libs/s25main/GameManager.cpp +++ b/libs/s25main/GameManager.cpp @@ -48,9 +48,10 @@ bool GameManager::Start() } // Fenster erstellen - const auto screenSize = - settings_.video.fullscreen ? settings_.video.fullscreenSize : settings_.video.windowedSize; //-V807 - if(!videoDriver_.CreateScreen(screenSize, settings_.video.fullscreen)) + const auto screenSize = bitset::isSet(settings_.video.displayMode, DisplayMode::Fullscreen) ? + settings_.video.fullscreenSize : + settings_.video.windowedSize; //-V807 + if(!videoDriver_.CreateScreen(screenSize, settings_.video.displayMode)) return false; videoDriver_.setTargetFramerate(settings_.video.framerate); videoDriver_.SetMouseWarping(settings_.global.smartCursor); diff --git a/libs/s25main/Settings.cpp b/libs/s25main/Settings.cpp index 059f778b35..19edf0bc10 100644 --- a/libs/s25main/Settings.cpp +++ b/libs/s25main/Settings.cpp @@ -84,11 +84,11 @@ void Settings::LoadDefaults() { video.fullscreenSize = VIDEODRIVER.GetWindowSize(); video.windowedSize = VIDEODRIVER.IsFullscreen() ? VideoMode(800, 600) : video.fullscreenSize; - video.fullscreen = VIDEODRIVER.IsFullscreen(); + video.displayMode = VIDEODRIVER.GetDisplayMode(); } else { video.windowedSize = video.fullscreenSize = VideoMode(800, 600); - video.fullscreen = false; + video.displayMode = DisplayMode::None; } video.framerate = 0; // Special value for HW vsync video.vbo = true; @@ -223,7 +223,8 @@ void Settings::Load() video.windowedSize.height = iniVideo->getIntValue("windowed_height"); video.fullscreenSize.width = iniVideo->getIntValue("fullscreen_width"); video.fullscreenSize.height = iniVideo->getIntValue("fullscreen_height"); - video.fullscreen = iniVideo->getBoolValue("fullscreen"); + video.displayMode = + bitset::set(video.displayMode, DisplayMode::Fullscreen, iniVideo->getBoolValue("fullscreen")); video.framerate = iniVideo->getValue("framerate", 0); video.vbo = iniVideo->getBoolValue("vbo"); video.shared_textures = iniVideo->getBoolValue("shared_textures"); @@ -405,7 +406,7 @@ void Settings::Save() iniVideo->setValue("fullscreen_height", video.fullscreenSize.height); iniVideo->setValue("windowed_width", video.windowedSize.width); iniVideo->setValue("windowed_height", video.windowedSize.height); - iniVideo->setValue("fullscreen", video.fullscreen); + iniVideo->setValue("fullscreen", bitset::isSet(video.displayMode, DisplayMode::Fullscreen)); iniVideo->setValue("framerate", video.framerate); iniVideo->setValue("vbo", video.vbo); iniVideo->setValue("shared_textures", video.shared_textures); diff --git a/libs/s25main/Settings.h b/libs/s25main/Settings.h index e702c34ed7..93b6cd9a62 100644 --- a/libs/s25main/Settings.h +++ b/libs/s25main/Settings.h @@ -5,6 +5,7 @@ #pragma once #include "DrawPoint.h" +#include "driver/VideoInterface.h" #include "driver/VideoMode.h" #include "s25util/ProxySettings.h" #include "s25util/Singleton.h" @@ -59,7 +60,7 @@ class Settings : public Singleton { VideoMode fullscreenSize, windowedSize; signed short framerate; // <0 for unlimited, 0 for HW Vsync - bool fullscreen; + DisplayMode displayMode; bool vbo; bool shared_textures; } video; diff --git a/libs/s25main/WindowManager.cpp b/libs/s25main/WindowManager.cpp index 2baa018031..bb5f905732 100644 --- a/libs/s25main/WindowManager.cpp +++ b/libs/s25main/WindowManager.cpp @@ -600,10 +600,11 @@ void WindowManager::Msg_KeyDown(const KeyEvent& ke) if(ke.alt && (ke.kt == KeyType::Return)) { // Switch Fullscreen/Windowed - const auto newScreenSize = - !SETTINGS.video.fullscreen ? SETTINGS.video.fullscreenSize : SETTINGS.video.windowedSize; //-V807 - VIDEODRIVER.ResizeScreen(newScreenSize, !SETTINGS.video.fullscreen); - SETTINGS.video.fullscreen = VIDEODRIVER.IsFullscreen(); + const auto newScreenSize = !bitset::isSet(SETTINGS.video.displayMode, DisplayMode::Fullscreen) ? + SETTINGS.video.fullscreenSize : + SETTINGS.video.windowedSize; //-V807 + VIDEODRIVER.ResizeScreen(newScreenSize, bitset::toggle(SETTINGS.video.displayMode, DisplayMode::Fullscreen)); + SETTINGS.video.displayMode = VIDEODRIVER.GetDisplayMode(); } else if(ke.kt == KeyType::Print) TakeScreenshot(); else @@ -632,7 +633,7 @@ void WindowManager::Msg_ScreenResize(const Extent& newSize) curRenderSize = sr.newSize; // Don't change fullscreen size (only in menu) - if(!SETTINGS.video.fullscreen) + if(!bitset::isSet(SETTINGS.video.displayMode, DisplayMode::Fullscreen)) SETTINGS.video.windowedSize = VIDEODRIVER.GetWindowSize(); // ist unser Desktop gültig? diff --git a/libs/s25main/desktops/dskBenchmark.cpp b/libs/s25main/desktops/dskBenchmark.cpp index a65982f72f..e32af17dc9 100644 --- a/libs/s25main/desktops/dskBenchmark.cpp +++ b/libs/s25main/desktops/dskBenchmark.cpp @@ -131,7 +131,7 @@ void dskBenchmark::Msg_PaintAfter() void dskBenchmark::SetActive(bool activate) { if(!IsActive() && activate) - VIDEODRIVER.ResizeScreen(VideoMode(1600, 900), false); + VIDEODRIVER.ResizeScreen(VideoMode(1600, 900), DisplayMode::None); dskMenuBase::SetActive(activate); } diff --git a/libs/s25main/desktops/dskOptions.cpp b/libs/s25main/desktops/dskOptions.cpp index 633c691ea4..d64fa52862 100644 --- a/libs/s25main/desktops/dskOptions.cpp +++ b/libs/s25main/desktops/dskOptions.cpp @@ -379,7 +379,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0)) } // "Vollbild" setzen - groupGrafik->GetCtrl(ID_grpFullscreen)->SetSelection(SETTINGS.video.fullscreen); //-V807 + groupGrafik->GetCtrl(ID_grpFullscreen) + ->SetSelection(bitset::isSet(SETTINGS.video.displayMode, DisplayMode::Fullscreen)); //-V807 // "Limit Framerate" füllen auto* cbFrameRate = groupGrafik->GetCtrl(ID_cbFramerate); @@ -502,7 +503,9 @@ void dskOptions::Msg_Group_OptionGroupChange(const unsigned /*group_id*/, const switch(ctrl_id) { case ID_grpIpv6: SETTINGS.server.ipv6 = enabled; break; - case ID_grpFullscreen: SETTINGS.video.fullscreen = enabled; break; + case ID_grpFullscreen: + SETTINGS.video.displayMode = bitset::set(SETTINGS.video.displayMode, DisplayMode::Fullscreen, enabled); + break; case ID_grpVBO: SETTINGS.video.vbo = enabled; break; case ID_grpOptTextures: SETTINGS.video.shared_textures = enabled; break; case ID_grpMusic: @@ -569,13 +572,12 @@ void dskOptions::Msg_ButtonClick(const unsigned ctrl_id) return; SETTINGS.Save(); - - if((SETTINGS.video.fullscreen && SETTINGS.video.fullscreenSize != VIDEODRIVER.GetWindowSize()) //-V807 - || SETTINGS.video.fullscreen != VIDEODRIVER.IsFullscreen()) + const auto fullscreen = bitset::isSet(SETTINGS.video.displayMode, DisplayMode::Fullscreen); + if((fullscreen && SETTINGS.video.fullscreenSize != VIDEODRIVER.GetWindowSize()) //-V807 + || fullscreen != VIDEODRIVER.IsFullscreen()) { - const auto screenSize = - SETTINGS.video.fullscreen ? SETTINGS.video.fullscreenSize : SETTINGS.video.windowedSize; - if(!VIDEODRIVER.ResizeScreen(screenSize, SETTINGS.video.fullscreen)) + const auto screenSize = fullscreen ? SETTINGS.video.fullscreenSize : SETTINGS.video.windowedSize; + if(!VIDEODRIVER.ResizeScreen(screenSize, SETTINGS.video.displayMode)) { WINDOWMANAGER.Show(std::make_unique( _("Sorry!"), _("You need to restart your game to change the screen resolution!"), this, diff --git a/libs/s25main/drivers/VideoDriverWrapper.cpp b/libs/s25main/drivers/VideoDriverWrapper.cpp index c58a0534ce..68576a4de6 100644 --- a/libs/s25main/drivers/VideoDriverWrapper.cpp +++ b/libs/s25main/drivers/VideoDriverWrapper.cpp @@ -92,7 +92,7 @@ void VideoDriverWrapper::UnloadDriver() * * @return Bei Erfolg @p true ansonsten @p false */ -bool VideoDriverWrapper::CreateScreen(const VideoMode size, const bool fullscreen) +bool VideoDriverWrapper::CreateScreen(const VideoMode size, const DisplayMode displayMode) { if(!videodriver) { @@ -100,7 +100,7 @@ bool VideoDriverWrapper::CreateScreen(const VideoMode size, const bool fullscree return false; } - if(!videodriver->CreateScreen(rttr::version::GetTitle(), size, fullscreen)) + if(!videodriver->CreateScreen(rttr::version::GetTitle(), size, displayMode)) { s25util::fatal_error("Could not create window!"); return false; @@ -130,11 +130,11 @@ bool VideoDriverWrapper::CreateScreen(const VideoMode size, const bool fullscree * * @param[in] screenWidth neue Breite des Fensters * @param[in] screenHeight neue Höhe des Fensters - * @param[in] fullscreen Vollbild oder nicht + * @param[in] displayMode Fullscreen on/off * * @return Bei Erfolg @p true ansonsten @p false */ -bool VideoDriverWrapper::ResizeScreen(const VideoMode size, const bool fullscreen) +bool VideoDriverWrapper::ResizeScreen(const VideoMode size, const DisplayMode displayMode) { if(!videodriver) { @@ -142,9 +142,9 @@ bool VideoDriverWrapper::ResizeScreen(const VideoMode size, const bool fullscree return false; } - const bool result = videodriver->ResizeScreen(size, fullscreen); + const bool result = videodriver->ResizeScreen(size, displayMode); #ifdef _WIN32 - if(!videodriver->IsFullscreen()) + if(!bitset::isSet(videodriver->GetDisplayMode(), DisplayMode::Fullscreen)) { // We cannot change the size of a maximized window. So restore it here WINDOWPLACEMENT wp; @@ -483,7 +483,12 @@ Extent VideoDriverWrapper::GetRenderSize() const return videodriver->GetRenderSize(); } +DisplayMode VideoDriverWrapper::GetDisplayMode() const +{ + return videodriver->GetDisplayMode(); +} + bool VideoDriverWrapper::IsFullscreen() const { - return videodriver->IsFullscreen(); + return bitset::isSet(videodriver->GetDisplayMode(), DisplayMode::Fullscreen); } diff --git a/libs/s25main/drivers/VideoDriverWrapper.h b/libs/s25main/drivers/VideoDriverWrapper.h index 80b5301457..6795e3ac39 100644 --- a/libs/s25main/drivers/VideoDriverWrapper.h +++ b/libs/s25main/drivers/VideoDriverWrapper.h @@ -7,6 +7,7 @@ #include "DriverWrapper.h" #include "Point.h" #include "driver/KeyEvent.h" +#include "driver/VideoInterface.h" #include "driver/VideoMode.h" #include "s25util/Singleton.h" #include @@ -35,9 +36,9 @@ class VideoDriverWrapper : public Singleton(3); - optiongroup->SetSelection((SETTINGS.video.fullscreen ? 1 : 2)); //-V807 + optiongroup->SetSelection(bitset::isSet(SETTINGS.video.displayMode, DisplayMode::Fullscreen) ? 1 : 2); //-V807 VIDEODRIVER.ListVideoModes(video_modes); // "Auflösung" @@ -63,12 +63,12 @@ iwSettings::~iwSettings() auto* SizeCombo = GetCtrl(0); SETTINGS.video.fullscreenSize = video_modes[SizeCombo->GetSelection().get()]; - if((SETTINGS.video.fullscreen && SETTINGS.video.fullscreenSize != VIDEODRIVER.GetWindowSize()) - || SETTINGS.video.fullscreen != VIDEODRIVER.IsFullscreen()) + const auto fullscreen = bitset::isSet(SETTINGS.video.displayMode, DisplayMode::Fullscreen); + if((fullscreen && SETTINGS.video.fullscreenSize != VIDEODRIVER.GetWindowSize()) + || fullscreen != VIDEODRIVER.IsFullscreen()) { - const auto screenSize = - SETTINGS.video.fullscreen ? SETTINGS.video.fullscreenSize : SETTINGS.video.windowedSize; - if(!VIDEODRIVER.ResizeScreen(screenSize, SETTINGS.video.fullscreen)) + const auto screenSize = fullscreen ? SETTINGS.video.fullscreenSize : SETTINGS.video.windowedSize; + if(!VIDEODRIVER.ResizeScreen(screenSize, SETTINGS.video.displayMode)) { WINDOWMANAGER.Show(std::make_unique( _("Sorry!"), _("You need to restart your game to change the screen resolution!"), this, @@ -85,7 +85,10 @@ void iwSettings::Msg_OptionGroupChange(const unsigned ctrl_id, const unsigned se { switch(ctrl_id) { - case 3: SETTINGS.video.fullscreen = (selection == 1); break; + case 3: + SETTINGS.video.displayMode = + bitset::set(SETTINGS.video.displayMode, DisplayMode::Fullscreen, selection == 1); + break; } } diff --git a/tests/mockupDrivers/MockupVideoDriver.cpp b/tests/mockupDrivers/MockupVideoDriver.cpp index 7b239109f3..a962e24cf9 100644 --- a/tests/mockupDrivers/MockupVideoDriver.cpp +++ b/tests/mockupDrivers/MockupVideoDriver.cpp @@ -29,16 +29,16 @@ bool MockupVideoDriver::Initialize() return true; } -bool MockupVideoDriver::CreateScreen(const std::string&, const VideoMode& newSize, bool fullscreen) +bool MockupVideoDriver::CreateScreen(const std::string&, const VideoMode& newSize, DisplayMode displayMode) { - ResizeScreen(newSize, fullscreen); + ResizeScreen(newSize, displayMode); return true; } -bool MockupVideoDriver::ResizeScreen(const VideoMode& newSize, bool fullscreen) +bool MockupVideoDriver::ResizeScreen(const VideoMode& newSize, DisplayMode displayMode) { SetNewSize(newSize, Extent(newSize.width, newSize.height)); - isFullscreen_ = fullscreen; + displayMode_ = displayMode; return true; } diff --git a/tests/mockupDrivers/MockupVideoDriver.h b/tests/mockupDrivers/MockupVideoDriver.h index 2f24ccaf47..df3cb4678d 100644 --- a/tests/mockupDrivers/MockupVideoDriver.h +++ b/tests/mockupDrivers/MockupVideoDriver.h @@ -13,8 +13,8 @@ class MockupVideoDriver : public VideoDriver ~MockupVideoDriver() override; const char* GetName() const override; bool Initialize() override; - bool CreateScreen(const std::string& title, const VideoMode& newSize, bool fullscreen) override; - bool ResizeScreen(const VideoMode& newSize, bool fullscreen) override; + bool CreateScreen(const std::string& title, const VideoMode& newSize, DisplayMode displayMode) override; + bool ResizeScreen(const VideoMode& newSize, DisplayMode displayMode) override; void DestroyScreen() override {} bool SwapBuffers() override { return true; } bool MessageLoop() override; diff --git a/tests/s25Main/UI/testAnimations.cpp b/tests/s25Main/UI/testAnimations.cpp index e460de15c5..fc26a0eb97 100644 --- a/tests/s25Main/UI/testAnimations.cpp +++ b/tests/s25Main/UI/testAnimations.cpp @@ -681,7 +681,7 @@ BOOST_AUTO_TEST_CASE(MoveAniScale) video->tickCount_ += 1; dsk->Msg_PaintBefore(); // Resize the screen and test that the final position got updated too - VIDEODRIVER.ResizeScreen(VideoMode(1024, 768), false); + VIDEODRIVER.ResizeScreen(VideoMode(1024, 768), DisplayMode::None); // Pass the animation video->tickCount_ += 1100; dsk->Msg_PaintBefore(); diff --git a/tests/s25Main/UI/testVideoDriver.cpp b/tests/s25Main/UI/testVideoDriver.cpp index a86a5b2a7e..47820aa23e 100644 --- a/tests/s25Main/UI/testVideoDriver.cpp +++ b/tests/s25Main/UI/testVideoDriver.cpp @@ -66,7 +66,7 @@ BOOST_FIXTURE_TEST_CASE(CreateAndDestroyTextures, uiHelper::Fixture) { rttr::test::LogAccessor logAcc; VIDEODRIVER.DestroyScreen(); - VIDEODRIVER.CreateScreen(VideoMode(800, 600), false); + VIDEODRIVER.CreateScreen(VideoMode(800, 600), DisplayMode::None); logAcc.clearLog(); } @@ -87,7 +87,7 @@ BOOST_FIXTURE_TEST_CASE(CreateAndDestroyTextures, uiHelper::Fixture) { rttr::test::LogAccessor logAcc; - VIDEODRIVER.CreateScreen(VideoMode(800, 600), false); + VIDEODRIVER.CreateScreen(VideoMode(800, 600), DisplayMode::None); logAcc.clearLog(); } glGenTextures = rttrOglMock2::glGenTextures; diff --git a/tests/s25Main/UI/uiHelper/uiHelper/uiHelpers.cpp b/tests/s25Main/UI/uiHelper/uiHelper/uiHelpers.cpp index f019bd2f9f..38d6b5b105 100644 --- a/tests/s25Main/UI/uiHelper/uiHelper/uiHelpers.cpp +++ b/tests/s25Main/UI/uiHelper/uiHelper/uiHelpers.cpp @@ -28,7 +28,7 @@ void initGUITests() rttr::test::LogAccessor logAcc; VIDEODRIVER.LoadDriver(new MockupVideoDriver(&WINDOWMANAGER)); RTTR_REQUIRE_LOG_CONTAINS("Mockup Video Driver", false); - VIDEODRIVER.CreateScreen(VideoMode(800, 600), false); + VIDEODRIVER.CreateScreen(VideoMode(800, 600), DisplayMode::None); BOOST_TEST_CHECKPOINT("Load dummy files"); LOADER.LoadDummyGUIFiles(); BOOST_TEST_CHECKPOINT("Switch to Desktop");