From ee061be26a58588a665622db0d5d53e399618dab Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sun, 11 Feb 2007 01:52:41 +0000 Subject: [PATCH] I'm not sure why this ClearSubscribers was here; it's causing metrics to not be loaded after a resolution change, because the reload is optimized out by SwitchThemeAndLanguage. (We may have loaded ThemeMetrics on demand in the past.) The reload needs to always happen, even though the theme hasn't changed, since the theme load is affected by the resolution; eg. upvalues in Lua scripts may have been computed based on SCREEN_WIDTH. --- stepmania/src/GameLoop.cpp | 10 ++++------ stepmania/src/GameLoop.h | 2 +- stepmania/src/ScreenOptionsMaster.cpp | 5 ++++- stepmania/src/ThemeManager.cpp | 7 +++---- stepmania/src/ThemeManager.h | 3 +-- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/stepmania/src/GameLoop.cpp b/stepmania/src/GameLoop.cpp index 608f2b128f..2c6da80599 100644 --- a/stepmania/src/GameLoop.cpp +++ b/stepmania/src/GameLoop.cpp @@ -115,10 +115,12 @@ static void CheckFocus() /* On the next update, change themes, and load sNewScreen. */ static RString g_sNewTheme; static RString g_sNewScreen; -void GameLoop::ChangeTheme( const RString &sNewTheme, const RString &sNewScreen ) +static bool g_bForceThemeReload; +void GameLoop::ChangeTheme( const RString &sNewTheme, const RString &sNewScreen, bool bForced ) { g_sNewTheme = sNewTheme; g_sNewScreen = sNewScreen; + g_bForceThemeReload = bForced; } #include "StepMania.h" // XXX @@ -129,14 +131,10 @@ namespace SAFE_DELETE( SCREENMAN ); TEXTUREMAN->DoDelayedDelete(); - /* Clear theme metrics, so ThemeMetrics are cleared. */ - THEME->ClearSubscribers(); - /* In case the previous theme overloaded class bindings, reinitialize them. */ LUA->RegisterTypes(); - if( !THEME->SwitchThemeAndLanguage( g_sNewTheme, THEME->GetCurLanguage(), PREFSMAN->m_bPseudoLocalize ) ) - THEME->ReloadSubscribers(); + THEME->SwitchThemeAndLanguage( g_sNewTheme, THEME->GetCurLanguage(), PREFSMAN->m_bPseudoLocalize, g_bForceThemeReload ); PREFSMAN->m_sTheme.Set( g_sNewTheme ); /* Apply the new window title, icon and aspect ratio. */ diff --git a/stepmania/src/GameLoop.h b/stepmania/src/GameLoop.h index 71a70b9497..a92e85a178 100644 --- a/stepmania/src/GameLoop.h +++ b/stepmania/src/GameLoop.h @@ -7,7 +7,7 @@ namespace GameLoop { void RunGameLoop(); void SetUpdateRate( float fUpdateRate ); - void ChangeTheme( const RString &sNewTheme, const RString &sNewScreen ); + void ChangeTheme( const RString &sNewTheme, const RString &sNewScreen, bool bForced = false ); void StartConcurrentRendering(); void FinishConcurrentRendering(); }; diff --git a/stepmania/src/ScreenOptionsMaster.cpp b/stepmania/src/ScreenOptionsMaster.cpp index 85b4c974aa..1610909bac 100644 --- a/stepmania/src/ScreenOptionsMaster.cpp +++ b/stepmania/src/ScreenOptionsMaster.cpp @@ -123,8 +123,11 @@ void ScreenOptionsMaster::HandleScreenMessage( const ScreenMessage SM ) (m_iChangeMask & OPT_APPLY_GRAPHICS) || (m_iChangeMask & OPT_APPLY_ASPECT_RATIO) ) { + /* If the resolution or aspect ratio changes, always reload the theme. Otherwise, + * only reload it if it changed. */ RString sNewTheme = PREFSMAN->m_sTheme.Get(); - GameLoop::ChangeTheme( sNewTheme, this->GetNextScreen() ); + bool bForceThemeReload = !!(m_iChangeMask & OPT_APPLY_ASPECT_RATIO) || !!(m_iChangeMask & OPT_APPLY_GRAPHICS); + GameLoop::ChangeTheme( sNewTheme, this->GetNextScreen(), bForceThemeReload ); StepMania::ApplyGraphicOptions(); } diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 77aa2efe28..a47cad1154 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -345,7 +345,7 @@ RString ThemeManager::GetDefaultLanguage() return sLangCode; } -bool ThemeManager::SwitchThemeAndLanguage( const RString &sThemeName_, const RString &sLanguage_, bool bPseudoLocalize ) +void ThemeManager::SwitchThemeAndLanguage( const RString &sThemeName_, const RString &sLanguage_, bool bPseudoLocalize, bool bForceThemeReload ) { RString sThemeName = sThemeName_; RString sLanguage = sLanguage_; @@ -366,8 +366,8 @@ bool ThemeManager::SwitchThemeAndLanguage( const RString &sThemeName_, const RSt sThemeName.c_str(), sLanguage.c_str() ); bool bNothingChanging = sThemeName == m_sCurThemeName && sLanguage == m_sCurLanguage && m_bPseudoLocalize == bPseudoLocalize; - if( bNothingChanging ) - return false; + if( bNothingChanging && !bForceThemeReload ) + return; m_bPseudoLocalize = bPseudoLocalize; @@ -397,7 +397,6 @@ bool ThemeManager::SwitchThemeAndLanguage( const RString &sThemeName_, const RSt LocalizedString::RegisterLocalizer( LocalizedStringImplThemeMetric::Create ); ReloadSubscribers(); - return true; } void ThemeManager::ReloadSubscribers() diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index 55523562ab..a927d86e76 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -41,8 +41,7 @@ public: RString GetThemeDisplayName( const RString &sThemeName ); void GetLanguages( vector& AddTo ); bool DoesLanguageExist( const RString &sLanguage ); - // Return false if nothing changed. - bool SwitchThemeAndLanguage( const RString &sThemeName, const RString &sLanguage, bool bPseudoLocalize ); + void SwitchThemeAndLanguage( const RString &sThemeName, const RString &sLanguage, bool bPseudoLocalize, bool bForceThemeReload = false ); void UpdateLuaGlobals(); RString GetCurThemeName() const { return m_sCurThemeName; }; bool IsThemeLoaded() const { return !m_sCurThemeName.empty(); };