/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( void ) { SDL_Event e; fakeAscii_t key = A_NULL; const char *character = NULL; static fakeAscii_t lastKeyDown = A_NULL; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_KEYDOWN: character = IN_TranslateSDLToJKKey( &e.key.keysym, &key, qtrue ); if( key != A_NULL ) Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); if( character ) Sys_QueEvent( 0, SE_CHAR, *character, qfalse, 0, NULL ); lastKeyDown = key; break; case SDL_KEYUP: IN_TranslateSDLToJKKey( &e.key.keysym, &key, qfalse ); if( key != A_NULL ) Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); lastKeyDown = A_NULL; break; case SDL_TEXTINPUT: if( lastKeyDown != A_CONSOLE ) { char *c = e.text.text; // Quick and dirty UTF-8 to UTF-32 conversion while( *c ) { int utf32 = 0; 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 ) { if( IN_IsConsoleKey( A_NULL, utf32 ) ) { Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL ); } else Sys_QueEvent( 0, SE_CHAR, utf32, 0, 0, NULL ); } } } break; case SDL_MOUSEMOTION: if( mouseActive ) Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned short b; switch( e.button.button ) { case SDL_BUTTON_LEFT: b = A_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = A_MOUSE3; break; case SDL_BUTTON_RIGHT: b = A_MOUSE2; break; case SDL_BUTTON_X1: b = A_MOUSE4; break; case SDL_BUTTON_X2: b = A_MOUSE5; break; default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break; } Sys_QueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_MOUSEWHEEL: if( e.wheel.y > 0 ) Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); else Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_WINDOWEVENT: switch( e.window.event ) { case SDL_WINDOWEVENT_RESIZED: { char width[32], height[32]; if (!Cvar_VariableIntegerValue("r_restartOnResize")) break; Com_sprintf( width, sizeof( width ), "%d", e.window.data1 ); Com_sprintf( height, sizeof( height ), "%d", e.window.data2 ); Cvar_Set( "r_customwidth", width ); Cvar_Set( "r_customheight", height ); Cvar_Set( "r_mode", "-1" ); // Wait until user stops dragging for 1 second, so // we aren't constantly recreating the GL context while // he tries to drag... vidRestartTime = Sys_Milliseconds( ) + Cvar_VariableIntegerValue("r_resizeDelay"); } break; case SDL_WINDOWEVENT_MINIMIZED: Cvar_SetValue( "com_minimized", 1 ); break; case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue( "com_minimized", 0 ); break; case SDL_WINDOWEVENT_FOCUS_LOST: Cvar_SetValue( "com_unfocused", 1 ); break; case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; } break; default: break; } } }
static void IN_ProcessEvents( void ) { SDL_Event e; fakeAscii_t key = A_NULL; static fakeAscii_t lastKeyDown = A_NULL; if(!SDL_WasInit(SDL_INIT_VIDEO)) return; while(SDL_PollEvent(&e)) { switch(e.type) { case SDL_KEYDOWN: if( e.key.keysym.sym == SDLK_BACKSPACE ) Sys_QueEvent( 0, SE_CHAR, e.key.keysym.sym, qtrue, 0, NULL ); else if( ( key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue ) ) ) Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); lastKeyDown = key; break; case SDL_KEYUP: if( ( key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse ) ) ) Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); lastKeyDown = A_NULL; break; case SDL_TEXTINPUT: if(lastKeyDown != A_CONSOLE) { char *c = e.text.text; // Quick and dirty UTF-8 to UTF-32 conversion while(*c) { uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); if(utf32 != 0) { if(IN_IsConsoleKey(A_NULL, utf32)) { Sys_QueEvent(0, SE_KEY, A_CONSOLE, qtrue, 0, NULL); Sys_QueEvent(0, SE_KEY, A_CONSOLE, qfalse, 0, NULL); } else { uint8_t encoded = ConvertUTF32ToExpectedCharset(utf32); Sys_QueEvent(0, SE_CHAR, encoded, 0, 0, NULL); } } } } break; case SDL_MOUSEMOTION: if(mouseActive) Sys_QueEvent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned short b; switch(e.button.button) { case SDL_BUTTON_LEFT: b = A_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = A_MOUSE3; break; case SDL_BUTTON_RIGHT: b = A_MOUSE2; break; case SDL_BUTTON_X1: b = A_MOUSE4; break; case SDL_BUTTON_X2: b = A_MOUSE5; break; default: b = A_AUX0 + (e.button.button - 6) % 32; break; } Sys_QueEvent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL); break; } case SDL_MOUSEWHEEL: if(e.wheel.y > 0) { Sys_QueEvent(0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL); Sys_QueEvent(0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL); } else { Sys_QueEvent(0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL); Sys_QueEvent(0, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL); } break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_WINDOWEVENT: switch(e.window.event) { case SDL_WINDOWEVENT_RESIZED: { char width[32], height[32]; if (!Cvar_VariableIntegerValue("r_restartOnResize")) break; Com_sprintf(width, sizeof(width), "%d", e.window.data1); Com_sprintf(height, sizeof(height), "%d", e.window.data2); Cvar_Set("r_customwidth", width); Cvar_Set("r_customheight", height); Cvar_Set("r_mode", "-1"); // Wait until user stops dragging for 1 second, so // we aren't constantly recreating the GL context while // he tries to drag... vidRestartTime = Sys_Milliseconds() + Cvar_VariableIntegerValue("r_resizeDelay"); } break; case SDL_WINDOWEVENT_MINIMIZED: Cvar_SetValue("com_minimized", 1); break; case SDL_WINDOWEVENT_RESTORED: case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue("com_minimized", 0); break; case SDL_WINDOWEVENT_FOCUS_LOST: { Cvar_SetValue("com_unfocused", 1); SNDDMA_Activate(qfalse); break; } case SDL_WINDOWEVENT_FOCUS_GAINED: { Cvar_SetValue("com_unfocused", 0); SNDDMA_Activate(qtrue); break; } } break; case SDL_APP_DIDENTERBACKGROUND: { #ifdef __ANDROID__ LOGI("SDL_APP_DIDENTERBACKGROUND"); #endif Cvar_SetValue("com_minimized", 1); Cvar_SetValue("com_unfocused", 1); SNDDMA_Activate(qfalse); break; } case SDL_APP_DIDENTERFOREGROUND: { #ifdef __ANDROID__ LOGI("SDL_APP_DIDENTERFOREGROUND"); #endif Cvar_SetValue("com_minimized", 0); Cvar_SetValue("com_unfocused", 0); SNDDMA_Activate(qtrue); break; } default: break; } } }
static void IN_ProcessEvents( void ) { SDL_Event e; fakeAscii_t key = A_NULL; static fakeAscii_t lastKeyDown = A_NULL; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_KEYDOWN: key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue ); if ( key != A_NULL ) Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); if ( key == A_BACKSPACE ) Sys_QueEvent( 0, SE_CHAR, CTRL('h'), qfalse, 0, NULL); else if ( kg.keys[A_CTRL].down && key >= 'a' && key <= 'z' ) Sys_QueEvent( 0, SE_CHAR, CTRL(key), qfalse, 0, NULL ); lastKeyDown = key; break; case SDL_KEYUP: key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse ); if( key != A_NULL ) Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); lastKeyDown = A_NULL; break; case SDL_TEXTINPUT: if( lastKeyDown != A_CONSOLE ) { char *c = e.text.text; // Quick and dirty UTF-8 to UTF-32 conversion while( *c ) { uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); if( utf32 != 0 ) { if( IN_IsConsoleKey( A_NULL, utf32 ) ) { Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL ); } else { uint8_t encoded = ConvertUTF32ToExpectedCharset( utf32 ); Sys_QueEvent( 0, SE_CHAR, encoded, 0, 0, NULL ); } } } } break; case SDL_MOUSEMOTION: if ( mouseActive ) { if ( !e.motion.xrel && !e.motion.yrel ) break; Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned short b; switch( e.button.button ) { case SDL_BUTTON_LEFT: b = A_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = A_MOUSE3; break; case SDL_BUTTON_RIGHT: b = A_MOUSE2; break; case SDL_BUTTON_X1: b = A_MOUSE4; break; case SDL_BUTTON_X2: b = A_MOUSE5; break; default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break; } Sys_QueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_MOUSEWHEEL: if( e.wheel.y > 0 ) { Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); } else { Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL ); } break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_WINDOWEVENT: switch( e.window.event ) { case SDL_WINDOWEVENT_MINIMIZED: Cvar_SetValue( "com_minimized", 1 ); break; case SDL_WINDOWEVENT_RESTORED: case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue( "com_minimized", 0 ); break; case SDL_WINDOWEVENT_FOCUS_LOST: { Cvar_SetValue( "com_unfocused", 1 ); SNDDMA_Activate( qfalse ); break; } case SDL_WINDOWEVENT_FOCUS_GAINED: { Cvar_SetValue( "com_unfocused", 0 ); SNDDMA_Activate( qtrue ); break; } } break; default: break; } } }
/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( void ) { SDL_Event e; fakeAscii_t key = A_NULL; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_KEYDOWN: if (e.key.keysym.scancode == SDL_SCANCODE_GRAVE) { Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL ); } else { key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue ); if ( key != A_NULL ) { fakeAscii_t upperKey = key; if (e.key.keysym.sym >= A_LOW_A && e.key.keysym.sym <= A_LOW_Z) { upperKey = (fakeAscii_t)(A_CAP_A + (e.key.keysym.sym - A_LOW_A)); } else if (e.key.keysym.sym >= A_LOW_AGRAVE && e.key.keysym.sym <= A_LOW_THORN && e.key.keysym.sym != A_DIVIDE) { upperKey = (fakeAscii_t)(A_CAP_AGRAVE + (e.key.keysym.sym - A_LOW_AGRAVE)); } Sys_QueEvent( 0, SE_KEY, upperKey, qtrue, 0, NULL ); } if ( key == A_BACKSPACE ) Sys_QueEvent( 0, SE_CHAR, CTRL('h'), qfalse, 0, NULL); else if ( kg.keys[A_CTRL].down && key >= 'a' && key <= 'z' ) Sys_QueEvent( 0, SE_CHAR, CTRL(key), qfalse, 0, NULL ); } break; case SDL_KEYUP: if (e.key.keysym.scancode == SDL_SCANCODE_GRAVE) { Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL ); } else { key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse ); if( key != A_NULL ) { fakeAscii_t upperKey = key; if (e.key.keysym.sym >= A_LOW_A && e.key.keysym.sym <= A_LOW_Z) { upperKey = (fakeAscii_t)(A_CAP_A + (e.key.keysym.sym - A_LOW_A)); } else if (e.key.keysym.sym >= A_LOW_AGRAVE && e.key.keysym.sym <= A_LOW_THORN && e.key.keysym.sym != A_DIVIDE) { upperKey = (fakeAscii_t)(A_CAP_AGRAVE + (e.key.keysym.sym - A_LOW_AGRAVE)); } Sys_QueEvent( 0, SE_KEY, upperKey, qfalse, 0, NULL ); } } if ( ( e.key.keysym.scancode == SDL_SCANCODE_LGUI || e.key.keysym.scancode == SDL_SCANCODE_RGUI ) && Cvar_VariableIntegerValue("r_fullscreen")) { SDL_MinimizeWindow(SDL_window); } break; case SDL_TEXTINPUT: { char *c = e.text.text; // Quick and dirty UTF-8 to UTF-32 conversion while( *c ) { int utf32 = 0; 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 ) << 12; 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 ) { Sys_QueEvent( 0, SE_CHAR, utf32, 0, 0, NULL ); } } break; } case SDL_MOUSEMOTION: if( mouseActive ) Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned short b; switch( e.button.button ) { case SDL_BUTTON_LEFT: b = A_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = A_MOUSE3; break; case SDL_BUTTON_RIGHT: b = A_MOUSE2; break; case SDL_BUTTON_X1: b = A_MOUSE4; break; case SDL_BUTTON_X2: b = A_MOUSE5; break; default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break; } Sys_QueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_MOUSEWHEEL: if( e.wheel.y > 0 ) { Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); } else { Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL ); } break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_WINDOWEVENT: switch( e.window.event ) { case SDL_WINDOWEVENT_MINIMIZED: Cvar_SetValue( "com_minimized", 1 ); break; case SDL_WINDOWEVENT_RESTORED: case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue( "com_minimized", 0 ); break; case SDL_WINDOWEVENT_FOCUS_LOST: Cvar_SetValue( "com_unfocused", 1 ); S_MuteAllSounds(true); break; case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); S_MuteAllSounds(false); break; } default: break; } } }