diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index 567d5c01a..674701c92 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -1978,7 +1978,19 @@ void IrrDriver::handleWindowResize() { bool dialog_exists = GUIEngine::ModalDialog::isADialogActive() || GUIEngine::ScreenKeyboard::isActive(); - if (m_actual_screen_size != m_video_driver->getCurrentRenderTargetSize()) + + // This will allow main menu auto resize if missed a resize event + core::dimension2du current_screen_size = + m_video_driver->getCurrentRenderTargetSize(); + GUIEngine::Screen* screen = GUIEngine::getCurrentScreen(); + if (screen && screen->isResizable()) + { + current_screen_size.Width = screen->getWidth(); + current_screen_size.Height = screen->getHeight(); + } + + if (m_actual_screen_size != m_video_driver->getCurrentRenderTargetSize() || + current_screen_size != m_video_driver->getCurrentRenderTargetSize()) { // Don't update when dialog is opened if (dialog_exists) diff --git a/src/guiengine/abstract_state_manager.cpp b/src/guiengine/abstract_state_manager.cpp index a491f1abd..6a35a3186 100644 --- a/src/guiengine/abstract_state_manager.cpp +++ b/src/guiengine/abstract_state_manager.cpp @@ -331,14 +331,11 @@ void AbstractStateManager::onResize() return; } - const std::string& last_menu = m_menu_stack.back().first; // For some window manager it sends resize event when STK is not focus // even if the screen is not resizable, prevent it from resizing if wrong // screen - // Hardcoded list of menu allowed to be resized for now - if (last_menu != "main_menu.stkgui" && - last_menu != "options_general.stkgui" && - last_menu != "options_video.stkgui") + if (!m_menu_stack.back().second || + !m_menu_stack.back().second->isResizable()) return; std::vector > screen_function; diff --git a/src/guiengine/engine.cpp b/src/guiengine/engine.cpp index ecb1c4676..297ecc37b 100644 --- a/src/guiengine/engine.cpp +++ b/src/guiengine/engine.cpp @@ -1491,6 +1491,11 @@ namespace GUIEngine //pause the timer during loading story_mode_timer->pauseTimer(true); } + else + { + // The screen size may change when loading + irr_driver->handleWindowResize(); + } #endif } // renderLoading diff --git a/src/guiengine/screen.cpp b/src/guiengine/screen.cpp index e9de90c4f..41c1c33a5 100644 --- a/src/guiengine/screen.cpp +++ b/src/guiengine/screen.cpp @@ -59,6 +59,9 @@ Screen::Screen(const char* file, bool pause_race) m_loaded = false; m_pause_race = pause_race; m_update_in_background = false; + m_width = irr_driver->getActualScreenSize().Width; + m_height = irr_driver->getActualScreenSize().Height; + m_resizable = false; } // Screen // ----------------------------------------------------------------------------- @@ -236,19 +239,3 @@ void Screen::manualRemoveWidget(Widget* w) #pragma mark Getters #endif -// ----------------------------------------------------------------------------- -/** \brief Implementing method from AbstractTopLevelContainer */ -int Screen::getWidth() -{ - return irr_driver->getActualScreenSize().Width; -} - -// ----------------------------------------------------------------------------- -/** \brief Implementing method from AbstractTopLevelContainer */ -int Screen::getHeight() -{ - return irr_driver->getActualScreenSize().Height; -} - -// ----------------------------------------------------------------------------- - diff --git a/src/guiengine/screen.hpp b/src/guiengine/screen.hpp index 36db2aa28..1e79d4232 100644 --- a/src/guiengine/screen.hpp +++ b/src/guiengine/screen.hpp @@ -95,36 +95,40 @@ namespace GUIEngine */ class Screen : public AbstractTopLevelContainer { +protected: + /** True if this screen is resizable + */ + bool m_resizable; + + bool m_throttle_FPS; private: /** True if the race (if it is running) should be paused when this * screen is shown. The RaceResultGUI uses this to leave the race * running while it is being shown. */ bool m_pause_race; - friend class Skin; - bool m_loaded; - std::string m_filename; - /** Will be called to determine if the 3D scene must be rendered when * at this screen. */ bool m_render_3d; - /** to catch errors as early as possible, for debugging purposes only */ - unsigned int m_magic_number; - /** When set to true it updates the screen even if modal dialog is * opened */ bool m_update_in_background; + /** to catch errors as early as possible, for debugging purposes only */ + unsigned int m_magic_number; + + unsigned m_width, m_height; + + friend class Skin; + + std::string m_filename; /** For runtime screen reloading without template */ std::function m_screen_func; - protected: - bool m_throttle_FPS; - public: LEAK_CHECK() @@ -299,10 +303,11 @@ namespace GUIEngine */ virtual MusicInformation* getInGameMenuMusic() const { return NULL; } - virtual int getWidth(); + virtual int getWidth() { return m_width; } - virtual int getHeight(); + virtual int getHeight() { return m_height; } + virtual bool isResizable() const { return m_resizable; } /** * \brief Override this if you need to be notified of player actions * in subclasses. diff --git a/src/main.cpp b/src/main.cpp index ef4fc2865..27d72759a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2154,8 +2154,6 @@ int main(int argc, char *argv[]) #ifndef SERVER_ONLY if (!GUIEngine::isNoGraphics()) { - // The screen size may change after loading - irr_driver->handleWindowResize(); // Some Android devices have only 320x240 and height >= 480 is bare // minimum to make the GUI working as expected. if (irr_driver->getActualScreenSize().Height < 480) diff --git a/src/states_screens/main_menu_screen.cpp b/src/states_screens/main_menu_screen.cpp index d6d87d313..0fde5ff16 100644 --- a/src/states_screens/main_menu_screen.cpp +++ b/src/states_screens/main_menu_screen.cpp @@ -74,6 +74,7 @@ using namespace Online; MainMenuScreen::MainMenuScreen() : Screen("main_menu.stkgui") { + m_resizable = true; } // MainMenuScreen // ---------------------------------------------------------------------------- diff --git a/src/states_screens/options/options_screen_general.cpp b/src/states_screens/options/options_screen_general.cpp index 966124017..3a64f9899 100644 --- a/src/states_screens/options/options_screen_general.cpp +++ b/src/states_screens/options/options_screen_general.cpp @@ -64,6 +64,7 @@ using namespace Online; OptionsScreenGeneral::OptionsScreenGeneral() : Screen("options_general.stkgui") { + m_resizable = true; m_inited = false; } // OptionsScreenVideo diff --git a/src/states_screens/options/options_screen_video.cpp b/src/states_screens/options/options_screen_video.cpp index b87b71e92..3ecd57252 100644 --- a/src/states_screens/options/options_screen_video.cpp +++ b/src/states_screens/options/options_screen_video.cpp @@ -163,6 +163,7 @@ OptionsScreenVideo::OptionsScreenVideo() : Screen("options_video.stkgui"), m_prev_adv_pipline(false), m_prev_img_quality(-1) { + m_resizable = true; m_inited = false; initPresets(); } // OptionsScreenVideo