From 38b5955b52ce64d190637fa5ee9794e333f5425d Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 28 Feb 2005 05:33:24 +0000 Subject: [PATCH] allow overlay layers to grab focus --- stepmania/src/ScreenManager.cpp | 33 +++++++++++++++++++++++++++++---- stepmania/src/ScreenManager.h | 8 +++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index b2cf7fc402..5b40cbe666 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -54,6 +54,7 @@ void ScreenManager::Register( const CString& sClassName, CreateScreenFn pfn ) ScreenManager::ScreenManager() { m_pSharedBGA = new Actor; + m_pInputFocus = NULL; m_MessageSendOnPop = SM_None; @@ -239,8 +240,12 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type // DeviceI.device, DeviceI.button, GameI.controller, GameI.button, MenuI.player, MenuI.button, StyleI.player, StyleI.col ); // pass input only to topmost state - if( !m_ScreenStack.empty() ) - m_ScreenStack.back()->Input( DeviceI, type, GameI, MenuI, StyleI ); + Screen *pInputFocus = m_pInputFocus; + if( pInputFocus == NULL && !m_ScreenStack.empty() ) + pInputFocus = m_ScreenStack.back(); + + if( pInputFocus != NULL ) + pInputFocus->Input( DeviceI, type, GameI, MenuI, StyleI ); } /* Just create a new screen; don't do any associated cleanup. */ @@ -551,11 +556,31 @@ void ScreenManager::SystemMessageNoAnimate( const CString &sMessage ) MESSAGEMAN->Broadcast( "SystemMessageNoAnimate" ); } -CString ScreenManager::GetCurrentSystemMessage() const +bool ScreenManager::GrabInputFocus( const Screen *pScreen ) { - return m_sSystemMessage; + if( m_pInputFocus != NULL ) + return false; + + /* Sanity check: make sure that the screen is in m_OverlayScreens. */ + for( unsigned i = 0; i < m_OverlayScreens.size(); ++i ) + { + if( m_OverlayScreens[i] == pScreen ) + { + m_pInputFocus = m_OverlayScreens[i]; + return true; + } + } + + FAIL_M( "GrabInputFocus: unknown screen" ); } +void ScreenManager::ReleaseInputFocus( const Screen *pScreen ) +{ + ASSERT( m_pInputFocus == pScreen ); + m_pInputFocus = NULL; +} + + void ScreenManager::RefreshCreditsMessages() { MESSAGEMAN->Broadcast( "RefreshCreditText" ); diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index 8dbcca77c1..c38427e9d5 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -53,7 +53,12 @@ public: void RefreshCreditsMessages(); void ThemeChanged(); - CString GetCurrentSystemMessage() const; + CString GetCurrentSystemMessage() const { return m_sSystemMessage; } + + /* Overlay screens can grab input focus. Only one screen may grab at a time; + * if another screen has already taken focus, this returns false. */ + bool GrabInputFocus( const Screen *pScreen ); + void ReleaseInputFocus( const Screen *pScreen ); Screen *GetTopScreen(); @@ -66,6 +71,7 @@ public: private: vector m_ScreenStack; // bottommost to topmost vector m_OverlayScreens; + Screen *m_pInputFocus; // NULL = top of m_ScreenStack CString m_sLastLoadedBackgroundPath; CString m_sDelayedScreen;