RString InputHandler::GetLocalizedInputString( const DeviceInput &di ) { switch( di.button ) { case KEY_HOME: return HOME.GetValue(); case KEY_END: return END.GetValue(); case KEY_UP: return UP.GetValue(); case KEY_DOWN: return DOWN.GetValue(); case KEY_SPACE: return SPACE.GetValue(); case KEY_LSHIFT: case KEY_RSHIFT: return SHIFT.GetValue(); case KEY_LCTRL: case KEY_RCTRL: return CTRL.GetValue(); case KEY_LALT: case KEY_RALT: return ALT.GetValue(); case KEY_INSERT: return INSERT.GetValue(); case KEY_DEL: return DEL.GetValue(); case KEY_PGUP: return PGUP.GetValue(); case KEY_PGDN: return PGDN.GetValue(); case KEY_BACKSLASH: return BACKSLASH.GetValue(); default: wchar_t c = DeviceButtonToChar( di.button, false ); if( c && c != L' ' ) // Don't show "Key " for space. return Capitalize( WStringToRString(wstring()+c) ); return DeviceButtonToString( di.button ); } }
void ScreenTextEntry::Input( const InputEventPlus &input ) { if( IsTransitioning() ) return; if( input.DeviceI == DeviceInput(DEVICE_KEYBOARD, KEY_BACK) ) { switch( input.type ) { case IET_FIRST_PRESS: case IET_REPEAT: BackspaceInAnswer(); default: break; } } else if( input.type == IET_FIRST_PRESS ) { wchar_t c = INPUTMAN->DeviceInputToChar(input.DeviceI,true); if( c >= L' ' ) { // todo: handle caps lock -aj TryAppendToAnswer( WStringToRString(wstring()+c) ); TextEnteredDirectly(); } } ScreenWithMenuElements::Input( input ); }
void ScreenTextEntry::UpdateAnswerText() { RString s; if( g_bPassword ) s = RString( m_sAnswer.size(), '*' ); else s = WStringToRString(m_sAnswer); bool bAnswerFull = (int) s.length() >= g_iMaxInputLength; if( g_pFormatAnswerForDisplay ) s = g_pFormatAnswerForDisplay( s ); // Handle caret drawing //m_iCaretLocation = s.length() if( m_bShowAnswerCaret && !bAnswerFull ) s += ANSWER_CARET; // was '_' else { s += ANSWER_BLANK; // was " " } FontCharAliases::ReplaceMarkers( s ); m_textAnswer.SetText( s ); }
void ScreenNetSelectBase::Input( const InputEventPlus &input ) { if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) return; if( input.type != IET_FIRST_PRESS && input.type != IET_REPEAT ) return; bool bHoldingCtrl = INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL)) || INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL)) || (!NSMAN->useSMserver); // If we are disconnected, assume no chatting. switch( input.DeviceI.button ) { case KEY_ENTER: case KEY_KP_ENTER: if (!bHoldingCtrl) { if ( m_sTextInput != "" ) NSMAN->SendChat( m_sTextInput ); m_sTextInput=""; UpdateTextInput(); return; } break; case KEY_BACK: if(!m_sTextInput.empty()) m_sTextInput = m_sTextInput.erase( m_sTextInput.size()-1 ); UpdateTextInput(); break; default: wchar_t c; c = INPUTMAN->DeviceInputToChar(input.DeviceI, true); if( (c >= ' ') && (!bHoldingCtrl) ) { m_sTextInput += WStringToRString(wstring()+c); UpdateTextInput(); } // Tricky: If both players are playing, allow the 2 button through to // the keymapper. (who? -aj) // What purpose does this serve? -aj if( c == '2' && GAMESTATE->IsPlayerEnabled( PLAYER_2 ) && GAMESTATE->IsPlayerEnabled( PLAYER_1 ) ) break; if( c >= ' ' ) return; break; } Screen::Input( input ); }
void ScreenTextEntry::End( bool bCancelled ) { if( bCancelled ) { if( g_pOnCancel ) g_pOnCancel(); Cancel( SM_GoToNextScreen ); //TweenOffScreen(); } else { RString sAnswer = WStringToRString(m_sAnswer); RString sError; if( g_pValidate != NULL ) { bool bValidAnswer = g_pValidate( sAnswer, sError ); if( !bValidAnswer ) { ScreenPrompt::Prompt( SM_None, sError ); return; // don't end this screen. } } if( g_pOnOK ) { RString ret = WStringToRString(m_sAnswer); FontCharAliases::ReplaceMarkers(ret); g_pOnOK( ret ); } StartTransitioningScreen( SM_GoToNextScreen ); SCREENMAN->PlayStartSound(); } s_bCancelledLast = bCancelled; s_sLastAnswer = bCancelled ? RString("") : WStringToRString(m_sAnswer); }
RString InputHandler::GetDeviceSpecificInputString( const DeviceInput &di ) { if( di.device == InputDevice_Invalid ) return RString(); if( di.device == DEVICE_KEYBOARD ) { wchar_t c = DeviceButtonToChar( di.button, false ); if( c && c != L' ' ) // Don't show "Key " for space. return InputDeviceToString( di.device ) + " " + Capitalize( WStringToRString(wstring()+c) ); } RString s = DeviceButtonToString( di.button ); if( di.device != DEVICE_KEYBOARD ) s = InputDeviceToString( di.device ) + " " + s; return s; }
RString ArchHooks_Win32::GetClipboard() { HGLOBAL hgl; LPTSTR lpstr; RString ret; // First make sure that the clipboard actually contains a string // (or something stringifiable) if(unlikely( !IsClipboardFormatAvailable( CF_TEXT ) )) return ""; // Yes. All this mess just to gain access to the string stored by the clipboard. // I'm having flashbacks to Berkeley sockets. if(unlikely( !OpenClipboard( NULL ) )) { LOG->Warn(werr_ssprintf( GetLastError(), "InputHandler_DirectInput: OpenClipboard() failed" )); return ""; } hgl = GetClipboardData( CF_TEXT ); if(unlikely( hgl == NULL )) { LOG->Warn(werr_ssprintf( GetLastError(), "InputHandler_DirectInput: GetClipboardData() failed" )); CloseClipboard(); return ""; } lpstr = (LPTSTR) GlobalLock( hgl ); if(unlikely( lpstr == NULL )) { LOG->Warn(werr_ssprintf( GetLastError(), "InputHandler_DirectInput: GlobalLock() failed" )); CloseClipboard(); return ""; } // And finally, we have a char (or wchar_t) array of the clipboard contents, // pointed to by sToPaste. // (Hopefully.) #ifdef UNICODE ret = WStringToRString( wstring()+*lpstr ); #else ret = RString( lpstr ); #endif // And now we clean up. GlobalUnlock( hgl ); CloseClipboard(); return ret; }
void ScreenTextEntry::TryAppendToAnswer( RString s ) { { wstring sNewAnswer = m_sAnswer+RStringToWstring(s); if( (int)sNewAnswer.length() > g_iMaxInputLength ) { SCREENMAN->PlayInvalidSound(); return; } } if( g_pValidateAppend && !g_pValidateAppend( WStringToRString(m_sAnswer), s ) ) { SCREENMAN->PlayInvalidSound(); return; } wstring sNewAnswer = m_sAnswer+RStringToWstring(s); m_sAnswer = sNewAnswer; m_sndType.Play(); UpdateAnswerText(); }
bool ScreenTextEntry::Input( const InputEventPlus &input ) { static bool bLCtrl = false, bRCtrl = false; if( IsTransitioning() ) return false; // bLCtrl and bRCtl are whether their respective Ctrl keys are held // We update them here. if( input.DeviceI == DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL) ) { switch( input.type ) { case IET_FIRST_PRESS: bLCtrl = true; break; case IET_RELEASE: bLCtrl = false; break; default: break; } } if( input.DeviceI == DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL) ) { switch( input.type ) { case IET_FIRST_PRESS: bRCtrl = true; break; case IET_RELEASE: bRCtrl = false; break; default: break; } } bool bHandled = false; if( input.DeviceI == DeviceInput(DEVICE_KEYBOARD, KEY_BACK) ) { switch( input.type ) { case IET_FIRST_PRESS: case IET_REPEAT: BackspaceInAnswer(); bHandled = true; default: break; } } else if( input.type == IET_FIRST_PRESS ) { wchar_t c = INPUTMAN->DeviceInputToChar(input.DeviceI,true); // Detect Ctrl+V if( ( c == L'v' || c == L'V' ) && ( bLCtrl || bRCtrl ) ) { TryAppendToAnswer( HOOKS->GetClipboard() ); TextEnteredDirectly(); // XXX: This doesn't seem appropriate but there's no TextPasted() bHandled = true; } else if( c >= L' ' ) { // todo: handle caps lock -aj TryAppendToAnswer( WStringToRString(wstring()+c) ); TextEnteredDirectly(); bHandled = true; } } return ScreenWithMenuElements::Input( input ) || bHandled; }
RString ConvertACPToUTF8( const RString &s ) { return WStringToRString( ConvertCodepageToWString(s, CP_ACP) ); }