focus fixes
This commit is contained in:
@@ -11,6 +11,25 @@
|
|||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SM_GainFocus/SM_LoseFocus: These are sent to screens when they become the
|
||||||
|
* topmost screen, or stop being the topmost screen.
|
||||||
|
*
|
||||||
|
* A few subtleties:
|
||||||
|
*
|
||||||
|
* With delayed screens (eg. ScreenGameplay being pre-loaded by ScreenStage), SM_GainFocus
|
||||||
|
* isn't sent until the loaded screen actually is activated (put on the stack).
|
||||||
|
*
|
||||||
|
* With normal screen loads, the new screen is loaded before the old screen is destroyed.
|
||||||
|
* This means that the old dtor is called *after* the new ctor. If some global properties
|
||||||
|
* (eg. GAMESTATE) are being unset by the old screen's destructor, and set by the new
|
||||||
|
* screen's constructor, they'll happen in the wrong order. Use SM_GainFocus and
|
||||||
|
* SM_LoseFocus, instead.
|
||||||
|
*
|
||||||
|
* SM_LoseFocus is always sent after SM_GainFocus, and vice-versa: you can't gain focus
|
||||||
|
* if you already have it, and you can't lose focus if you don't have it.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "ScreenManager.h"
|
#include "ScreenManager.h"
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
#include "GameConstantsAndTypes.h"
|
#include "GameConstantsAndTypes.h"
|
||||||
@@ -423,8 +442,7 @@ void ScreenManager::Update( float fDeltaTime )
|
|||||||
if(m_DelayedScreen.size() != 0)
|
if(m_DelayedScreen.size() != 0)
|
||||||
{
|
{
|
||||||
/* We have a screen to display. Delete the current screens and load it. */
|
/* We have a screen to display. Delete the current screens and load it. */
|
||||||
m_ScreensToDelete.insert(m_ScreensToDelete.end(), m_ScreenStack.begin(), m_ScreenStack.end());
|
ClearScreenStack();
|
||||||
m_ScreenStack.clear();
|
|
||||||
EmptyDeleteQueue();
|
EmptyDeleteQueue();
|
||||||
|
|
||||||
/* This is the purpose of delayed screen loads: clear out the texture cache
|
/* This is the purpose of delayed screen loads: clear out the texture cache
|
||||||
@@ -511,6 +529,19 @@ void ScreenManager::DeletePreppedScreen()
|
|||||||
TEXTUREMAN->DeleteCachedTextures();
|
TEXTUREMAN->DeleteCachedTextures();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remove all screens from the stack, sending a SM_LoseFocus message to the top.
|
||||||
|
* (There's no need to send them to any lower screens; they don't have focus anyway,
|
||||||
|
* and received the message when they actually lost it. */
|
||||||
|
void ScreenManager::ClearScreenStack()
|
||||||
|
{
|
||||||
|
if( m_ScreenStack.size() )
|
||||||
|
m_ScreenStack.back()->HandleScreenMessage( SM_LoseFocus );
|
||||||
|
|
||||||
|
// move current screen(s) to ScreenToDelete
|
||||||
|
m_ScreensToDelete.insert(m_ScreensToDelete.end(), m_ScreenStack.begin(), m_ScreenStack.end());
|
||||||
|
m_ScreenStack.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/* Add a screen to m_ScreenStack. If Stack is true, it's added to the stack; otherwise any
|
/* Add a screen to m_ScreenStack. If Stack is true, it's added to the stack; otherwise any
|
||||||
* current screens are removed. This is the only function that adds to m_ScreenStack. */
|
* current screens are removed. This is the only function that adds to m_ScreenStack. */
|
||||||
void ScreenManager::SetFromNewScreen( Screen *pNewScreen, bool Stack )
|
void ScreenManager::SetFromNewScreen( Screen *pNewScreen, bool Stack )
|
||||||
@@ -519,11 +550,7 @@ void ScreenManager::SetFromNewScreen( Screen *pNewScreen, bool Stack )
|
|||||||
THEME->ReloadMetricsIfNecessary();
|
THEME->ReloadMetricsIfNecessary();
|
||||||
|
|
||||||
if( !Stack )
|
if( !Stack )
|
||||||
{
|
ClearScreenStack();
|
||||||
// move current screen(s) to ScreenToDelete
|
|
||||||
m_ScreensToDelete.insert(m_ScreensToDelete.end(), m_ScreenStack.begin(), m_ScreenStack.end());
|
|
||||||
m_ScreenStack.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ScreenStack.push_back( pNewScreen );
|
m_ScreenStack.push_back( pNewScreen );
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ private:
|
|||||||
Screen* MakeNewScreen( CString sClassName );
|
Screen* MakeNewScreen( CString sClassName );
|
||||||
void SetFromNewScreen( Screen *pNewScreen, bool Stack );
|
void SetFromNewScreen( Screen *pNewScreen, bool Stack );
|
||||||
CString m_DelayedScreen;
|
CString m_DelayedScreen;
|
||||||
|
void ClearScreenStack();
|
||||||
|
|
||||||
// Keep these sounds always loaded, because they could be
|
// Keep these sounds always loaded, because they could be
|
||||||
// played at any time. We want to eliminate SOUND->PlayOnce
|
// played at any time. We want to eliminate SOUND->PlayOnce
|
||||||
|
|||||||
Reference in New Issue
Block a user