From edd219ca213a309a318b15831eb773029ee602cc Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Sat, 19 Jan 2013 21:35:09 +0000 Subject: Convert SDL text input to UTF-32 --- src/sdl/sdl_input.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) (limited to 'src/sdl') diff --git a/src/sdl/sdl_input.c b/src/sdl/sdl_input.c index 95d5a350..c1c86484 100644 --- a/src/sdl/sdl_input.c +++ b/src/sdl/sdl_input.c @@ -778,17 +778,43 @@ static void IN_ProcessEvents( void ) case SDL_TEXTINPUT: { - int i; - int numChars = strlen( e.text.text ); + char *c = e.text.text; - for( i = 0; i < numChars; i++ ) + // Quick and dirty UTF-8 to UTF-32 conversion + while( *c ) { - char c = e.text.text[ i ]; + int utf32 = 0; - if( !IN_IsConsoleKey( 0, c ) ) - Com_QueueEvent( 0, SE_CHAR, c, 0, 0, NULL ); - } - } + if( ( *c & 0x80 ) == 0 ) + utf32 = *c++; + else if( ( *c & 0xE0 ) == 0xC0 ) // 110x xxxx + { + utf32 |= ( *c++ & 0x1F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else if( ( *c & 0xF0 ) == 0xE0 ) // 1110 xxxx + { + utf32 |= ( *c++ & 0x0F ) << 12; + utf32 |= ( *c++ & 0x3F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else if( ( *c & 0xF8 ) == 0xF0 ) // 1111 0xxx + { + utf32 |= ( *c++ & 0x07 ) << 18; + utf32 |= ( *c++ & 0x3F ) << 6; + utf32 |= ( *c++ & 0x3F ) << 6; + utf32 |= ( *c++ & 0x3F ); + } + else + { + Com_DPrintf( "Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c ); + c++; + } + + if( utf32 != 0 ) + Com_QueueEvent( 0, SE_CHAR, utf32, 0, 0, NULL ); + } + } break; case SDL_MOUSEMOTION: -- cgit