Beispiel #1
0
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);
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}
Beispiel #10
0
RString ConvertACPToUTF8( const RString &s )
{
	return WStringToRString( ConvertCodepageToWString(s, CP_ACP) );
}