From 659def447952bb4bb5e90d891ff57edb5586443d Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Wed, 23 Mar 2005 06:46:24 +0000 Subject: [PATCH] fix Pop message doesn't get sent if more than 1 prompt screen on the stack --- stepmania/src/EditCoursesMenu.cpp | 4 ++-- stepmania/src/Screen.cpp | 4 ++-- stepmania/src/ScreenEdit.cpp | 14 ++++++++------ stepmania/src/ScreenEditMenu.cpp | 2 +- stepmania/src/ScreenManager.cpp | 23 ++++++----------------- stepmania/src/ScreenManager.h | 15 +++++++-------- stepmania/src/ScreenNetSelectMusic.cpp | 6 +++--- stepmania/src/ScreenOptionsMaster.cpp | 4 ++-- stepmania/src/ScreenPlayerOptions.cpp | 6 ++++-- stepmania/src/ScreenPlayerOptions.h | 2 ++ stepmania/src/ScreenPrompt.cpp | 6 ++++-- stepmania/src/ScreenPrompt.h | 3 ++- stepmania/src/ScreenSongOptions.cpp | 4 ++-- stepmania/src/ScreenSongOptions.h | 2 ++ stepmania/src/ScreenSplash.cpp | 2 +- stepmania/src/ScreenTextEntry.cpp | 4 +++- stepmania/src/ScreenTextEntry.h | 2 ++ 17 files changed, 53 insertions(+), 50 deletions(-) diff --git a/stepmania/src/EditCoursesMenu.cpp b/stepmania/src/EditCoursesMenu.cpp index df54d06263..631a877e55 100644 --- a/stepmania/src/EditCoursesMenu.cpp +++ b/stepmania/src/EditCoursesMenu.cpp @@ -11,6 +11,8 @@ #include "ScreenMiniMenu.h" #include "ScreenManager.h" #include "PlayerState.h" +#include "ScreenPlayerOptions.h" // for SM_BackFromPlayerOptions +#include "ScreenSongOptions.h" // for SM_BackFromSongOptions // // Defines specific to EditCoursesMenu @@ -33,8 +35,6 @@ #define ROW_Y( i ) THEME->GetMetricF("EditCoursesMenu",ssprintf("Row%dY",i+1)) const ScreenMessage SM_BackFromCourseOptionsMenu = (ScreenMessage)(SM_User+1); -const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3); -const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4); enum CourseEntryMenuRow { diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index ab9c095077..c753524bd8 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -160,14 +160,14 @@ void Screen::HandleScreenMessage( const ScreenMessage SM ) break; case SM_GoToNextScreen: if( SCREENMAN->IsStackedScreen(this) ) - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( SM_None ); else SCREENMAN->SetNewScreen( NEXT_SCREEN ); break; case SM_GoToPrevScreen: SCREENMAN->DeletePreparedScreens(); if( SCREENMAN->IsStackedScreen(this) ) - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( SM_None ); else SCREENMAN->SetNewScreen( PREV_SCREEN ); break; diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 2f7d54f176..d066485a82 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -30,6 +30,8 @@ #include "ActorUtil.h" #include "ScreenPrompt.h" #include "CommonMetrics.h" +#include "ScreenPlayerOptions.h" // for SM_BackFromPlayerOptions +#include "ScreenSongOptions.h" // for SM_BackFromSongOptions // // Defines specific to ScreenEdit @@ -51,8 +53,6 @@ const ScreenMessage SM_BackFromStepsInformation = (ScreenMessage)(SM_User+3); const ScreenMessage SM_BackFromEditOptions = (ScreenMessage)(SM_User+4); const ScreenMessage SM_BackFromSongInformation = (ScreenMessage)(SM_User+5); const ScreenMessage SM_BackFromBGChange = (ScreenMessage)(SM_User+6); -const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+7); -const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+8); const ScreenMessage SM_BackFromInsertAttack = (ScreenMessage)(SM_User+9); const ScreenMessage SM_BackFromInsertAttackModifiers= (ScreenMessage)(SM_User+10); const ScreenMessage SM_BackFromPrefs = (ScreenMessage)(SM_User+11); @@ -1520,7 +1520,9 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) int iDurationChoice = ScreenMiniMenu::s_viLastAnswers[0]; g_fLastInsertAttackDurationSeconds = strtof( g_InsertAttack.rows[0].choices[iDurationChoice], NULL ); GAMESTATE->StoreSelectedOptions(); // save so that we don't lose the options chosen for edit and playback - SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertAttackModifiers ); + + // XXX: Fix me + //SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertAttackModifiers ); } break; case SM_BackFromInsertAttackModifiers: @@ -1755,7 +1757,7 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector &iAns case save_on_exit: s = "ScreenMemcardSaveEditsAfterExit"; break; default: ASSERT(0); } - SCREENMAN->AddNewScreenToTop( s, SM_None ); + SCREENMAN->AddNewScreenToTop( s ); } else { @@ -1785,10 +1787,10 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector &iAns PROMPT_YES_NO, ANSWER_NO ); break; case player_options: - SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromPlayerOptions ); + SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" ); break; case song_options: - SCREENMAN->AddNewScreenToTop( "ScreenSongOptions", SM_BackFromSongOptions ); + SCREENMAN->AddNewScreenToTop( "ScreenSongOptions" ); break; case edit_song_info: { diff --git a/stepmania/src/ScreenEditMenu.cpp b/stepmania/src/ScreenEditMenu.cpp index f23a2ca865..5f93f0a429 100644 --- a/stepmania/src/ScreenEditMenu.cpp +++ b/stepmania/src/ScreenEditMenu.cpp @@ -217,7 +217,7 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn ) ASSERT( pSteps ); if( HOME_EDIT_MODE ) { - SCREENMAN->AddNewScreenToTop( "ScreenEditMenuDeleteSteps", SM_None ); + SCREENMAN->AddNewScreenToTop( "ScreenEditMenuDeleteSteps" ); } else { diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index ca8eae8e2b..4867770c94 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -55,8 +55,6 @@ ScreenManager::ScreenManager() { m_pSharedBGA = new Actor; - m_MessageSendOnPop = SM_None; - m_bZeroNextUpdate = false; /* By the time this is constructed, THEME has already been set up and set to @@ -463,7 +461,7 @@ retry: SetFromNewScreen( pNewScreen, false ); } -void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage messageSendOnPop ) +void ScreenManager::AddNewScreenToTop( const CString &sScreenName ) { m_bZeroNextUpdate = true; @@ -474,29 +472,26 @@ void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage Screen* pNewScreen = MakeNewScreen(sScreenName); SetFromNewScreen( pNewScreen, true ); - m_MessageSendOnPop = messageSendOnPop; } #include "ScreenPrompt.h" #include "ScreenTextEntry.h" #include "ScreenMiniMenu.h" -void ScreenManager::Prompt( ScreenMessage SM_SendWhenDone, const CString &sText, PromptType type, PromptAnswer defaultAnswer, void(*OnYes)(void*), void(*OnNo)(void*), void* pCallbackData ) +void ScreenManager::Prompt( ScreenMessage smSendOnPop, const CString &sText, PromptType type, PromptAnswer defaultAnswer, void(*OnYes)(void*), void(*OnNo)(void*), void* pCallbackData ) { if( m_ScreenStack.size() ) m_ScreenStack.back()->HandleScreenMessage( SM_LoseFocus ); // add the new state onto the back of the array - Screen *pNewScreen = new ScreenPrompt( sText, type, defaultAnswer, OnYes, OnNo, pCallbackData); + Screen *pNewScreen = new ScreenPrompt( smSendOnPop, sText, type, defaultAnswer, OnYes, OnNo, pCallbackData); pNewScreen->Init(); this->ZeroNextUpdate(); SetFromNewScreen( pNewScreen, true ); - - m_MessageSendOnPop = SM_SendWhenDone; } void ScreenManager::TextEntry( - ScreenMessage SM_SendWhenDone, + ScreenMessage smSendOnPop, CString sQuestion, CString sInitialAnswer, int iMaxInputLength, @@ -512,6 +507,7 @@ void ScreenManager::TextEntry( // add the new state onto the back of the array Screen *pNewScreen = new ScreenTextEntry( "ScreenTextEntry", + smSendOnPop, sQuestion, sInitialAnswer, iMaxInputLength, @@ -522,8 +518,6 @@ void ScreenManager::TextEntry( pNewScreen->Init(); this->ZeroNextUpdate(); SetFromNewScreen( pNewScreen, true ); - - m_MessageSendOnPop = SM_SendWhenDone; } void ScreenManager::MiniMenu( Menu* pDef, ScreenMessage SM_SendOnOK, ScreenMessage SM_SendOnCancel ) @@ -549,14 +543,9 @@ void ScreenManager::PopTopScreen( ScreenMessage SM ) /* Post to the new top. This must be done now; otherwise, we'll have a single * frame between popping and these messages, which can result in a frame where eg. - * input is accepted where it shouldn't be. Watch out; sending m_MessageSendOnPop - * might push another screen (eg. editor menu -> PlayerOptions), which will set - * a new m_MessageSendOnPop. */ - ScreenMessage MessageToSend = m_MessageSendOnPop; - m_MessageSendOnPop = SM_None; + * input is accepted where it shouldn't be. */ SendMessageToTopScreen( SM ); SendMessageToTopScreen( SM_GainFocus ); - SendMessageToTopScreen( MessageToSend ); } void ScreenManager::PostMessageToTopScreen( ScreenMessage SM, float fDelay ) diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index f5556884ab..c29d599219 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -55,10 +55,10 @@ public: void DeletePreparedScreens(); void SetNewScreen( const CString &sName ); - void AddNewScreenToTop( const CString &sName, ScreenMessage messageSendOnPop ); - void Prompt( ScreenMessage SM_SendWhenDone, const CString &sText, PromptType type = PROMPT_OK, PromptAnswer defaultAnswer = ANSWER_NO, void(*OnYes)(void*) = NULL, void(*OnNo)(void*) = NULL, void* pCallbackData = NULL ); + void AddNewScreenToTop( const CString &sName ); + void Prompt( ScreenMessage smSendOnPop, const CString &sText, PromptType type = PROMPT_OK, PromptAnswer defaultAnswer = ANSWER_NO, void(*OnYes)(void*) = NULL, void(*OnNo)(void*) = NULL, void* pCallbackData = NULL ); void TextEntry( - ScreenMessage SM_SendWhenDone, + ScreenMessage smSendOnPop, CString sQuestion, CString sInitialAnswer, int iMaxInputLength, @@ -67,12 +67,12 @@ public: void(*OnCanel)() = NULL, bool bPassword = false ); - void Password( ScreenMessage SM_SendWhenDone, const CString &sQuestion, void(*OnOK)(CString sPassword) = NULL, void(*OnCanel)() = NULL ) + void Password( ScreenMessage smSendOnPop, const CString &sQuestion, void(*OnOK)(CString sPassword) = NULL, void(*OnCanel)() = NULL ) { - TextEntry( SM_SendWhenDone, sQuestion, "", 255, NULL, OnOK, OnCanel, true ); + TextEntry( smSendOnPop, sQuestion, "", 255, NULL, OnOK, OnCanel, true ); } - void MiniMenu( Menu* pDef, ScreenMessage SM_SendOnOK, ScreenMessage SM_SendOnCancel = SM_None ); - void PopTopScreen( ScreenMessage SM = SM_None ); + void MiniMenu( Menu* pDef, ScreenMessage smSendOnOK, ScreenMessage smSendOnCancel = SM_None ); + void PopTopScreen( ScreenMessage SM ); void SystemMessage( const CString &sMessage ); void SystemMessageNoAnimate( const CString &sMessage ); @@ -108,7 +108,6 @@ private: CString m_sLastLoadedBackgroundPath; CString m_sDelayedScreen; CString m_sSystemMessage; - ScreenMessage m_MessageSendOnPop; vector m_vPreparedScreens; vector m_vScreensToDelete; diff --git a/stepmania/src/ScreenNetSelectMusic.cpp b/stepmania/src/ScreenNetSelectMusic.cpp index 73be896501..1b810e9a01 100644 --- a/stepmania/src/ScreenNetSelectMusic.cpp +++ b/stepmania/src/ScreenNetSelectMusic.cpp @@ -20,10 +20,10 @@ #include "MusicWheel.h" #include "InputMapper.h" #include "RageLog.h" +#include "ScreenPlayerOptions.h" // for SM_BackFromPlayerOptions const ScreenMessage SM_NoSongs = ScreenMessage(SM_User+3); const ScreenMessage SM_ChangeSong = ScreenMessage(SM_User+5); -const ScreenMessage SM_BackFromOpts = ScreenMessage(SM_User+6); const ScreenMessage SM_SMOnlinePack = ScreenMessage(SM_User+8); //Unused, but should be known const ScreenMessage SM_SetWheelSong = ScreenMessage(SM_User+19); const ScreenMessage SM_RefreshWheelLocation = ScreenMessage(SM_User+20); @@ -257,7 +257,7 @@ void ScreenNetSelectMusic::HandleScreenMessage( const ScreenMessage SM ) m_MusicWheel.Select(); m_bAllowInput = true; break; - case SM_BackFromOpts: + case SM_BackFromPlayerOptions: //XXX: HACK: This will causes ScreenSelectOptions to go back here. NSMAN->ReportNSSOnOff(1); GAMESTATE->m_bEditing = false; @@ -328,7 +328,7 @@ void ScreenNetSelectMusic::MenuUp( PlayerNumber pn, const InputEventType type ) { NSMAN->ReportNSSOnOff(3); GAMESTATE->m_bEditing = true; - SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromOpts ); + SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" ); } void ScreenNetSelectMusic::MenuDown( PlayerNumber pn, const InputEventType type ) diff --git a/stepmania/src/ScreenOptionsMaster.cpp b/stepmania/src/ScreenOptionsMaster.cpp index 76db20d05a..e56078df50 100644 --- a/stepmania/src/ScreenOptionsMaster.cpp +++ b/stepmania/src/ScreenOptionsMaster.cpp @@ -145,7 +145,7 @@ void ScreenOptionsMaster::BeginFadingOut() void ScreenOptionsMaster::GoToNextScreen() { if( GAMESTATE->m_bEditing ) - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( SM_None ); else if( m_sExportedNextScreen != "" ) SCREENMAN->SetNewScreen( m_sExportedNextScreen ); else if( NEXT_SCREEN != "" ) @@ -157,7 +157,7 @@ void ScreenOptionsMaster::GoToPrevScreen() /* XXX: A better way to handle this would be to check if we're a pushed screen. */ if( GAMESTATE->m_bEditing ) { - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( SM_None ); // XXX: handle different destinations based on play mode? } else diff --git a/stepmania/src/ScreenPlayerOptions.cpp b/stepmania/src/ScreenPlayerOptions.cpp index ad43382113..4652df8463 100644 --- a/stepmania/src/ScreenPlayerOptions.cpp +++ b/stepmania/src/ScreenPlayerOptions.cpp @@ -79,7 +79,7 @@ void ScreenPlayerOptions::GoToPrevScreen() { if( GAMESTATE->m_bEditing ) { - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( SM_BackFromPlayerOptions ); } else { @@ -91,7 +91,9 @@ void ScreenPlayerOptions::GoToPrevScreen() void ScreenPlayerOptions::GoToNextScreen() { if( GAMESTATE->m_bEditing ) - SCREENMAN->PopTopScreen(); + { + SCREENMAN->PopTopScreen( SM_BackFromPlayerOptions ); + } else { GAMESTATE->AdjustFailType(); diff --git a/stepmania/src/ScreenPlayerOptions.h b/stepmania/src/ScreenPlayerOptions.h index cc8f0dd62a..c16e926920 100644 --- a/stepmania/src/ScreenPlayerOptions.h +++ b/stepmania/src/ScreenPlayerOptions.h @@ -3,6 +3,8 @@ #include "ScreenOptionsMaster.h" +const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3); + class ScreenPlayerOptions : public ScreenOptionsMaster { public: diff --git a/stepmania/src/ScreenPrompt.cpp b/stepmania/src/ScreenPrompt.cpp index fcb8bb22cd..b0c6fc01ef 100644 --- a/stepmania/src/ScreenPrompt.cpp +++ b/stepmania/src/ScreenPrompt.cpp @@ -17,6 +17,7 @@ bool ScreenPrompt::s_bCancelledLast = false; //REGISTER_SCREEN_CLASS( ScreenPrompt ); ScreenPrompt::ScreenPrompt( + ScreenMessage smSendOnPop, CString sText, PromptType type, PromptAnswer defaultAnswer, @@ -28,13 +29,14 @@ ScreenPrompt::ScreenPrompt( { m_bIsTransparent = true; // draw screens below us + m_smSendOnPop = smSendOnPop; + m_sText = sText; m_PromptType = type; m_Answer = defaultAnswer; CLAMP( (int&)m_Answer, 0, m_PromptType ); m_pOnYes = OnYes; m_pOnNo = OnNo; m_pCallbackData = pCallbackData; - m_sText = sText; } void ScreenPrompt::Init() @@ -128,7 +130,7 @@ void ScreenPrompt::HandleScreenMessage( const ScreenMessage SM ) case SM_DoneOpeningWipingLeft: break; case SM_DoneOpeningWipingRight: - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( m_smSendOnPop ); break; } } diff --git a/stepmania/src/ScreenPrompt.h b/stepmania/src/ScreenPrompt.h index 47bfef613d..878defe75f 100644 --- a/stepmania/src/ScreenPrompt.h +++ b/stepmania/src/ScreenPrompt.h @@ -18,6 +18,7 @@ public: ScreenPrompt( CString sName ); virtual void Init(); ScreenPrompt( + ScreenMessage smSendOnPop, CString sText, PromptType type = PROMPT_OK, PromptAnswer defaultAnswer = ANSWER_NO, @@ -67,7 +68,7 @@ protected: BitmapText m_textAnswer[NUM_PROMPT_ANSWERS]; PromptType m_PromptType; PromptAnswer m_Answer; - ScreenMessage m_SMSendWhenDone; // don't send on ANSWER_CANCEL + ScreenMessage m_smSendOnPop; // don't send on ANSWER_CANCEL void(*m_pOnYes)(void*); void(*m_pOnNo)(void*); void* m_pCallbackData; diff --git a/stepmania/src/ScreenSongOptions.cpp b/stepmania/src/ScreenSongOptions.cpp index 4db8b3e072..0baf7293c1 100644 --- a/stepmania/src/ScreenSongOptions.cpp +++ b/stepmania/src/ScreenSongOptions.cpp @@ -40,7 +40,7 @@ void ScreenSongOptions::GoToPrevScreen() { if( GAMESTATE->m_bEditing ) { - SCREENMAN->PopTopScreen( SM_None ); + SCREENMAN->PopTopScreen( SM_BackFromSongOptions ); } else { @@ -52,7 +52,7 @@ void ScreenSongOptions::GoToPrevScreen() void ScreenSongOptions::GoToNextScreen() { if( GAMESTATE->m_bEditing ) - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( SM_BackFromSongOptions ); else SCREENMAN->SetNewScreen( NEXT_SCREEN ); } diff --git a/stepmania/src/ScreenSongOptions.h b/stepmania/src/ScreenSongOptions.h index edf7223f77..e0c98344df 100644 --- a/stepmania/src/ScreenSongOptions.h +++ b/stepmania/src/ScreenSongOptions.h @@ -3,6 +3,8 @@ #include "ScreenOptionsMaster.h" +const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4); + class ScreenSongOptions : public ScreenOptionsMaster { public: diff --git a/stepmania/src/ScreenSplash.cpp b/stepmania/src/ScreenSplash.cpp index c803aa50af..4ec7c74a15 100644 --- a/stepmania/src/ScreenSplash.cpp +++ b/stepmania/src/ScreenSplash.cpp @@ -45,7 +45,7 @@ void ScreenSplash::HandleScreenMessage( const ScreenMessage SM ) break; case SM_GoToNextScreen: if( SCREENMAN->IsStackedScreen(SCREENMAN->GetTopScreen()) ) - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( SM_None ); else SCREENMAN->SetNewScreen( NEXT_SCREEN ); break; diff --git a/stepmania/src/ScreenTextEntry.cpp b/stepmania/src/ScreenTextEntry.cpp index 9bab740be7..e650961a33 100644 --- a/stepmania/src/ScreenTextEntry.cpp +++ b/stepmania/src/ScreenTextEntry.cpp @@ -48,6 +48,7 @@ bool ScreenTextEntry::s_bCancelledLast = false; ScreenTextEntry::ScreenTextEntry( CString sClassName, + ScreenMessage smSendOnPop, CString sQuestion, CString sInitialAnswer, int iMaxInputLength, @@ -59,6 +60,7 @@ ScreenTextEntry::ScreenTextEntry( { m_bIsTransparent = true; // draw screens below us + m_smSendOnPop = smSendOnPop; m_sQuestion = sQuestion; m_sAnswer = CStringToWstring( sInitialAnswer ); m_iMaxInputLength = iMaxInputLength; @@ -200,7 +202,7 @@ void ScreenTextEntry::HandleScreenMessage( const ScreenMessage SM ) case SM_DoneOpeningWipingLeft: break; case SM_DoneOpeningWipingRight: - SCREENMAN->PopTopScreen(); + SCREENMAN->PopTopScreen( m_smSendOnPop ); break; } } diff --git a/stepmania/src/ScreenTextEntry.h b/stepmania/src/ScreenTextEntry.h index 8d01dcd629..3c2b6100bc 100644 --- a/stepmania/src/ScreenTextEntry.h +++ b/stepmania/src/ScreenTextEntry.h @@ -29,6 +29,7 @@ class ScreenTextEntry : public Screen public: ScreenTextEntry( CString sName, + ScreenMessage smSendOnPop, CString sQuestion, CString sInitialAnswer, int iMaxInputLength, @@ -66,6 +67,7 @@ protected: void UpdateKeyboardText(); void UpdateAnswerText(); + ScreenMessage m_smSendOnPop; CString m_sQuestion; int m_iMaxInputLength; bool m_bPassword;