static void IN_ProcessEvents(void) { SDL_Event e; keyNum_t key = 0; static keyNum_t lastKeyDown = 0; if (!SDL_WasInit(SDL_INIT_VIDEO)) { return; } while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_KEYDOWN: if (e.key.repeat && Key_GetCatcher() == 0) { break; } if ((key = IN_TranslateSDLToQ3Key(&e.key.keysym, qtrue))) { Com_QueueEvent(0, SE_KEY, key, qtrue, 0, NULL); if (key == K_BACKSPACE) { // This was added to keep mod comp, mods do not check K_BACKSPACE but instead use char 8 which is backspace in ascii // 8 == CTRL('h') == BS aka Backspace from ascii table Com_QueueEvent(0, SE_CHAR, CTRL('h'), 0, 0, NULL); } else if (keys[K_CTRL].down && key >= 'a' && key <= 'z') { Com_QueueEvent(0, SE_CHAR, CTRL(key), 0, 0, NULL); } } lastKeyDown = key; break; case SDL_KEYUP: if ((key = IN_TranslateSDLToQ3Key(&e.key.keysym, qfalse))) { Com_QueueEvent(0, SE_KEY, key, qfalse, 0, NULL); } lastKeyDown = 0; break; case SDL_TEXTINPUT: if (lastKeyDown != K_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) << 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) { if (IN_IsConsoleKey(0, utf32)) { Com_QueueEvent(0, SE_KEY, K_CONSOLE, qtrue, 0, NULL); Com_QueueEvent(0, SE_KEY, K_CONSOLE, qfalse, 0, NULL); } else { Com_QueueEvent(0, SE_CHAR, utf32, 0, 0, NULL); } } } } break; case SDL_MOUSEMOTION: if (mouseActive) { if (!e.motion.xrel && !e.motion.yrel) { break; } Com_QueueEvent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { int b; switch (e.button.button) { case SDL_BUTTON_LEFT: b = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = K_MOUSE3; break; case SDL_BUTTON_RIGHT: b = K_MOUSE2; break; case SDL_BUTTON_X1: b = K_MOUSE4; break; case SDL_BUTTON_X2: b = K_MOUSE5; break; default: b = K_AUX1 + (e.button.button - SDL_BUTTON_X2 + 1) % 16; break; } Com_QueueEvent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL); } break; case SDL_MOUSEWHEEL: if (e.wheel.y > 0) { Com_QueueEvent(0, SE_KEY, K_MWHEELUP, qtrue, 0, NULL); Com_QueueEvent(0, SE_KEY, K_MWHEELUP, qfalse, 0, NULL); } else if (e.wheel.y < 0) { Com_QueueEvent(0, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL); Com_QueueEvent(0, SE_KEY, K_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: IN_WindowResize(&e); 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: // disabled for now (causes issues with vid_restart //IN_WindowFocusLost(); case SDL_WINDOWEVENT_LEAVE: Key_ClearStates(); Cvar_SetValue("com_unfocused", 1); break; case SDL_WINDOWEVENT_ENTER: case SDL_WINDOWEVENT_FOCUS_GAINED: { Cvar_SetValue("com_unfocused", 0); if (com_minimized->integer) { SDL_RestoreWindow(mainScreen); } #ifdef DISABLE_DINGY IN_EnableDingFilter(); #endif } break; } break; default: break; } } }
/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( void ) { SDL_Event e; const char *character = NULL; keyNum_t key = 0; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; if( Key_GetCatcher( ) == 0 && keyRepeatEnabled ) { SDL_EnableKeyRepeat( 0, 0 ); keyRepeatEnabled = qfalse; } else if( !keyRepeatEnabled ) { SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); keyRepeatEnabled = qtrue; } while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_KEYDOWN: character = IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qtrue ); if( key ) Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); if( character ) Com_QueueEvent( 0, SE_CHAR, *character, 0, 0, NULL ); break; case SDL_KEYUP: IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qfalse ); if( key ) Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); break; case SDL_MOUSEMOTION: if( mouseActive ) Com_QueueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { int b; switch( e.button.button ) { case SDL_BUTTON_LEFT: b = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = K_MOUSE3; break; case SDL_BUTTON_RIGHT: b = K_MOUSE2; break; case SDL_BUTTON_WHEELUP: b = K_MWHEELUP; break; case SDL_BUTTON_WHEELDOWN: b = K_MWHEELDOWN; break; case SDL_BUTTON_X1: b = K_MOUSE4; break; case SDL_BUTTON_X2: b = K_MOUSE5; break; default: b = K_AUX1 + ( e.button.button - SDL_BUTTON_X2 + 1 ) % 16; break; } Com_QueueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_VIDEORESIZE: { char width[32], height[32]; Com_sprintf( width, sizeof(width), "%d", e.resize.w ); Com_sprintf( height, sizeof(height), "%d", e.resize.h ); 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() + 1000; } break; case SDL_ACTIVEEVENT: if (e.active.state & SDL_APPINPUTFOCUS) { Cvar_SetValue( "com_unfocused", !e.active.gain); } if (e.active.state & SDL_APPACTIVE) { Cvar_SetValue( "com_minimized", !e.active.gain); } break; default: break; } } }
static void IN_ProcessEvents( void ) { SDL_Event e; const char *character = NULL; keyNum_t key = 0; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; if( Key_GetCatcher( ) == 0 && keyRepeatEnabled ) { SDL_EnableKeyRepeat( 0, 0 ); keyRepeatEnabled = qfalse; } else if( !keyRepeatEnabled ) { SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); keyRepeatEnabled = qtrue; } while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_KEYDOWN: character = IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qtrue ); if( key ) Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); if( character ) Com_QueueEvent( 0, SE_CHAR, *character, 0, 0, NULL ); break; case SDL_KEYUP: IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qfalse ); if( key ) Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); break; case SDL_MOUSEMOTION: #ifdef __ANDROID__ Com_Printf("SDL_MOUSEMOTION received, it sohuld never appear on Android\n"); #endif if( mouseActive ) Com_QueueEvent( 0, SE_MOUSE, e.motion.x, e.motion.y, 0, NULL ); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned char b; #ifdef __ANDROID__ Com_Printf("SDL_MOUSEBUTTON received, it sohuld never appear on Android\n"); #endif switch( e.button.button ) { case 1: b = K_MOUSE1; break; case 2: b = K_MOUSE3; break; case 3: b = K_MOUSE2; break; case 4: b = K_MWHEELUP; break; case 5: b = K_MWHEELDOWN; break; case 6: b = K_MOUSE4; break; case 7: b = K_MOUSE5; break; default: b = K_AUX1 + ( e.button.button - 8 ) % 16; break; } Com_QueueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_JOYAXISMOTION: // Android accelerometer and on-screen joystick { if( e.jaxis.which == JOY_SDL_TOUCHSCREEN && e.jaxis.axis < 2 ) // joy 0 axes 0-1 = screen joystick Com_QueueEvent( 0, SE_JOYSTICK_AXIS, e.jaxis.axis + JOY_AXIS_SCREENJOY_X, e.jaxis.value, 0, NULL ); if( e.jaxis.which == JOY_SDL_GYROSCOPE && e.jaxis.axis >= 2 && e.jaxis.axis <= 4 ) // joy 1 axes 2-4 = gyroscope Com_QueueEvent( 0, SE_GYROSCOPE, e.jaxis.axis - 2, e.jaxis.value, 0, NULL ); if( e.jaxis.which == JOY_SDL_GYROSCOPE && e.jaxis.axis >= 5 && e.jaxis.axis <= 7 ) // joy 1 axes 5-7 = accelerometer Com_QueueEvent( 0, SE_ACCELEROMETER, e.jaxis.axis - 5, e.jaxis.value, 0, NULL ); if( e.jaxis.which == JOY_SDL_GAMEPAD && e.jaxis.axis < 6 ) // joy 2-5 = gamepad { Com_QueueEvent( 0, SE_JOYSTICK_AXIS, e.jaxis.axis + JOY_AXIS_GAMEPADLEFT_X, e.jaxis.value, 0, NULL ); if ( !hideScreenKeys && e.jaxis.axis == JOY_AXIS_GAMEPADRIGHT_X - JOY_AXIS_GAMEPADLEFT_X && abs(e.jaxis.value) > 20000 ) { hideScreenKeys = qtrue; #ifdef __ANDROID__ SDL_Rect rect; rect.x = rect.y = rect.w = rect.h = 0; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, &rect); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_4, &rect); // Do not hide text input, we don't have gamepad key to invoke it rect.w = rect.h = cls.glconfig.vidHeight / 10; rect.x = rect.y = 0; SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT, &rect); #endif } } } break; case SDL_JOYBUTTONDOWN: // Android multitouch case SDL_JOYBUTTONUP: { if( e.jbutton.which == JOY_SDL_TOUCHSCREEN && e.jbutton.button < MAX_POINTERS ) { touchPointers[e.jbutton.button].pressed = (e.jbutton.state == SDL_PRESSED); IN_ProcessTouchPoints(); } } break; case SDL_JOYBALLMOTION: // Android multitouch { if( e.jaxis.which == JOY_SDL_TOUCHSCREEN && e.jball.ball < MAX_POINTERS ) { int i; touchPointers[e.jball.ball].x = e.jball.xrel; touchPointers[e.jball.ball].y = e.jball.yrel; if( e.jball.ball == filteredTouch[0].idx ) Com_QueueEvent( 0, SE_MOUSE, touchPointers[e.jball.ball].x, touchPointers[e.jball.ball].y, 0, NULL ); if( e.jball.ball == filteredTouch[1].idx ) Com_QueueEvent( 0, SE_MOUSE2, touchPointers[e.jball.ball].x, touchPointers[e.jball.ball].y, 0, NULL ); } } break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_VIDEORESIZE: { char width[32], height[32]; Com_sprintf( width, sizeof(width), "%d", e.resize.w ); Com_sprintf( height, sizeof(height), "%d", e.resize.h ); 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() + 1000; #ifdef __ANDROID__ vidRestartTime = Sys_Milliseconds(); #endif } break; case SDL_ACTIVEEVENT: if (e.active.state & SDL_APPINPUTFOCUS) { Cvar_SetValue( "com_unfocused", !e.active.gain); } if (e.active.state & SDL_APPACTIVE) { Cvar_SetValue( "com_minimized", !e.active.gain); } break; default: break; } } if( deferredTouch > 0 ) { deferredTouch --; if( !deferredTouch ) Com_QueueEvent( 0, SE_KEY, K_MOUSE1, qtrue, 0, NULL ); } }
/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( bool dropInput ) { SDL_Event e; keyNum_t key = (keyNum_t) 0; static keyNum_t lastKeyDown = (keyNum_t) 0; if ( !SDL_WasInit( SDL_INIT_VIDEO ) ) { return; } while ( SDL_PollEvent( &e ) ) { switch ( e.type ) { case SDL_KEYDOWN: if ( !dropInput && ( !e.key.repeat || cls.keyCatchers ) ) { key = IN_TranslateSDLToQ3Key( &e.key.keysym, true ); if ( key ) { Com_QueueEvent( 0, sysEventType_t::SE_KEY, key, true, 0, nullptr ); } lastKeyDown = key; } break; case SDL_KEYUP: if ( !dropInput ) { key = IN_TranslateSDLToQ3Key( &e.key.keysym, false ); if ( key ) { Com_QueueEvent( 0, sysEventType_t::SE_KEY, key, false, 0, nullptr ); } lastKeyDown = (keyNum_t) 0; } break; case SDL_TEXTINPUT: if ( lastKeyDown != K_CONSOLE ) { char *c = e.text.text; while ( *c ) { int width = Q_UTF8_Width( c ); int sc = Q_UTF8_Store( c ); Com_QueueEvent( 0, sysEventType_t::SE_CHAR, sc, 0, 0, nullptr ); c += width; } } break; case SDL_MOUSEMOTION: if ( !dropInput ) { if ( mouse_mode != MouseMode::Deltas ) { Com_QueueEvent( 0, sysEventType_t::SE_MOUSE_POS, e.motion.x, e.motion.y, 0, nullptr ); } else { Com_QueueEvent( 0, sysEventType_t::SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, nullptr ); #if defined( __linux__ ) || defined( __BSD__ ) if ( !in_nograb->integer ) { // work around X window managers and edge-based workspace flipping // - without this, we get LeaveNotify, no mouse button events, EnterNotify; // we would likely miss some button presses and releases. IN_CenterMouse(); } #endif } } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if ( !dropInput ) { unsigned char b; switch ( e.button.button ) { case SDL_BUTTON_LEFT: b = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = K_MOUSE3; break; case SDL_BUTTON_RIGHT: b = K_MOUSE2; break; case SDL_BUTTON_X1: b = K_MOUSE4; break; case SDL_BUTTON_X2: b = K_MOUSE5; break; default: b = K_AUX1 + ( e.button.button - ( SDL_BUTTON_X2 + 1 ) ) % 16; break; } Com_QueueEvent( 0, sysEventType_t::SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? true : false ), 0, nullptr ); } break; case SDL_MOUSEWHEEL: // FIXME: mouse wheel support shouldn't use keys! if ( e.wheel.y > 0 ) { Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELUP, true, 0, nullptr ); Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELUP, false, 0, nullptr ); } else { Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELDOWN, true, 0, nullptr ); Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELDOWN, false, 0, nullptr ); } break; case SDL_WINDOWEVENT: switch( e.window.event ) { case SDL_WINDOWEVENT_RESIZED: { char width[32], height[32]; 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" ); } 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 ); break; case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; } break; case SDL_QUIT: Cmd::ExecuteCommand("quit Closed window"); break; default: break; } } }
/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( void ) { SDL_Event e; keyNum_t key = 0; static keyNum_t lastKeyDown = 0; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_KEYDOWN: if ( e.key.repeat && Key_GetCatcher( ) == 0 ) break; if( ( key = IN_TranslateSDLToQ3Key( &e.key.keysym, qtrue ) ) ) Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); if( key == K_BACKSPACE ) Com_QueueEvent( 0, SE_CHAR, CTRL('h'), 0, 0, NULL ); else if( keys[K_CTRL].down && key >= 'a' && key <= 'z' ) Com_QueueEvent( 0, SE_CHAR, CTRL(key), 0, 0, NULL ); lastKeyDown = key; break; case SDL_KEYUP: if( ( key = IN_TranslateSDLToQ3Key( &e.key.keysym, qfalse ) ) ) Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); lastKeyDown = 0; break; case SDL_TEXTINPUT: if( lastKeyDown != K_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 ) << 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 ) { if( IN_IsConsoleKey( 0, utf32 ) ) { Com_QueueEvent( 0, SE_KEY, K_CONSOLE, qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, K_CONSOLE, qfalse, 0, NULL ); } else Com_QueueEvent( 0, SE_CHAR, utf32, 0, 0, NULL ); } } } break; case SDL_MOUSEMOTION: if( mouseActive ) { if( !e.motion.xrel && !e.motion.yrel ) break; Com_QueueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { int b; switch( e.button.button ) { case SDL_BUTTON_LEFT: b = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = K_MOUSE3; break; case SDL_BUTTON_RIGHT: b = K_MOUSE2; break; case SDL_BUTTON_X1: b = K_MOUSE4; break; case SDL_BUTTON_X2: b = K_MOUSE5; break; default: b = K_AUX1 + ( e.button.button - SDL_BUTTON_X2 + 1 ) % 16; break; } Com_QueueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_MOUSEWHEEL: if( e.wheel.y > 0 ) { Com_QueueEvent( 0, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); } else { Com_QueueEvent( 0, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, K_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: { int width, height; width = e.window.data1; height = e.window.data2; // check if size actually changed if( cls.glconfig.vidWidth == width && cls.glconfig.vidHeight == height ) { break; } Cvar_SetValue( "r_customwidth", width ); Cvar_SetValue( "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( ) + 1000; } 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 ); break; case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; } break; default: break; } } }
/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( qboolean dropInput ) { SDL_Event e; keyNum_t key = (keyNum_t) 0; static keyNum_t lastKeyDown = (keyNum_t) 0; if ( !SDL_WasInit( SDL_INIT_VIDEO ) ) { return; } #if !SDL_VERSION_ATLEAST( 2, 0, 0 ) if ( cls.keyCatchers == 0 && keyRepeatEnabled ) { SDL_EnableKeyRepeat( 0, 0 ); keyRepeatEnabled = qfalse; } else if ( !keyRepeatEnabled ) { SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); keyRepeatEnabled = qtrue; } #endif while ( SDL_PollEvent( &e ) ) { switch ( e.type ) { case SDL_KEYDOWN: #if SDL_VERSION_ATLEAST( 2, 0, 0 ) if ( !dropInput && ( !e.key.repeat || cls.keyCatchers ) ) #else if ( !dropInput ) #endif { key = IN_TranslateSDLToQ3Key( &e.key.keysym, qtrue ); if ( key ) { Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); #if !SDL_VERSION_ATLEAST( 2, 0, 0 ) if ( key != K_CONSOLE ) { Com_QueueEvent( 0, SE_CHAR, Q_UTF8_Store( Q_UTF8_Encode( e.key.keysym.unicode ) ), 0, 0, NULL ); } #endif } lastKeyDown = key; } break; case SDL_KEYUP: if ( !dropInput ) { key = IN_TranslateSDLToQ3Key( &e.key.keysym, qfalse ); if ( key ) { Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); } lastKeyDown = (keyNum_t) 0; } break; #if SDL_VERSION_ATLEAST( 2, 0, 0 ) case SDL_TEXTINPUT: if ( lastKeyDown != K_CONSOLE ) { char *c = e.text.text; while ( *c ) { int width = Q_UTF8_Width( c ); int sc = Q_UTF8_Store( c ); Com_QueueEvent( 0, SE_CHAR, sc, 0, 0, NULL ); c += width; } } break; #endif case SDL_MOUSEMOTION: if ( !dropInput ) { if ( mouseActive ) { Com_QueueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); #if ( defined( __linux__ ) || defined( __BSD__ ) ) && SDL_VERSION_ATLEAST( 2, 0, 0 ) { // work around X window managers and edge-based workspace flipping // - without this, we get LeaveNotify, no mouse button events, EnterNotify; // we would likely miss some button presses and releases. int w, h; SDL_GetWindowSize( window, &w, &h ); SDL_WarpMouseInWindow( window, w / 2, h / 2 ); } #endif } else if ( uivm ) { // TODO (after no compatibility needed with alpha 8): remove argument int mousepos = VM_Call( uivm, UI_MOUSE_POSITION, 0 ); int cursorx = mousepos & 0xFFFF; int cursory = mousepos >> 16; VM_Call( uivm, UI_MOUSE_EVENT, e.motion.x - cursorx, e.motion.y - cursory ); } } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if ( !dropInput ) { unsigned char b; switch ( e.button.button ) { case SDL_BUTTON_LEFT: b = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = K_MOUSE3; break; case SDL_BUTTON_RIGHT: b = K_MOUSE2; break; #if !SDL_VERSION_ATLEAST( 2, 0, 0 ) case SDL_BUTTON_WHEELUP: b = K_MWHEELUP; break; case SDL_BUTTON_WHEELDOWN: b = K_MWHEELDOWN; break; #endif case SDL_BUTTON_X1: b = K_MOUSE4; break; case SDL_BUTTON_X2: b = K_MOUSE5; break; default: b = K_AUX1 + ( e.button.button - ( SDL_BUTTON_X2 + 1 ) ) % 16; break; } Com_QueueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; #if SDL_VERSION_ATLEAST( 2, 0, 0 ) case SDL_MOUSEWHEEL: // FIXME: mouse wheel support shouldn't use keys! if ( e.wheel.y > 0 ) { Com_QueueEvent( 0, SE_KEY, K_MWHEELUP, qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, K_MWHEELUP, qfalse, 0, NULL ); } else { Com_QueueEvent( 0, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL ); } break; case SDL_WINDOWEVENT: switch( e.window.event ) { case SDL_WINDOWEVENT_RESIZED: { char width[32], height[32]; 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" ); } 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 ); break; case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; } break; #else case SDL_VIDEORESIZE: { char width[32], height[32]; Com_sprintf( width, sizeof( width ), "%d", e.resize.w ); Com_sprintf( height, sizeof( height ), "%d", e.resize.h ); Cvar_Set( "r_customwidth", width ); Cvar_Set( "r_customheight", height ); Cvar_Set( "r_mode", "-1" ); } break; case SDL_ACTIVEEVENT: if ( e.active.state & SDL_APPINPUTFOCUS ) { Cvar_SetValue( "com_unfocused", !e.active.gain ); } if ( e.active.state & SDL_APPACTIVE ) { Cvar_SetValue( "com_minimized", !e.active.gain ); } break; #endif case SDL_QUIT: Cmd::ExecuteCommand("quit Closed window"); break; default: break; } } }
static void IN_ProcessEvents(void) { static keyNum_t scrollwheel = 0; SDL_Event e; const char *character = NULL; keyNum_t key = 0; unsigned char b; if (!SDL_WasInit(SDL_INIT_VIDEO)) { return; } if ( scrollwheel ) { // release mouse wheel "key" Com_QueueEvent(0, SE_KEY, scrollwheel, qfalse, 0, NULL); scrollwheel = 0; } #if 0 if (Key_GetCatcher() == 0 && keyRepeatEnabled) { SDL_EnableKeyRepeat(0, 0); keyRepeatEnabled = qfalse; } else if (!keyRepeatEnabled) { SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); keyRepeatEnabled = qtrue; } #endif while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_KEYDOWN: character = IN_TranslateSDLToQ3Key(&e.key.keysym, &key, qtrue); if (key) { Com_QueueEvent(0, SE_KEY, key, qtrue, 0, NULL); } if (character) { Com_QueueEvent(0, SE_CHAR, *character, 0, 0, NULL); } break; case SDL_KEYUP: character = IN_TranslateSDLToQ3Key(&e.key.keysym, &key, qfalse); if (key) { Com_QueueEvent(0, SE_KEY, key, qfalse, 0, NULL); } break; case SDL_MOUSEMOTION: if (mouseActive) { Com_QueueEvent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: switch (e.button.button) { case 1: b = K_MOUSE1; break; case 2: b = K_MOUSE3; break; case 3: b = K_MOUSE2; break; case 4: b = K_MOUSE4; break; case 5: b = K_MOUSE5; break; default: b = K_AUX1 + (e.button.button - 8) % 16; break; } Com_QueueEvent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL); break; case SDL_MOUSEWHEEL: if (e.wheel.y > 0) scrollwheel = K_MWHEELUP; else scrollwheel = K_MWHEELDOWN; // fake mouse wheel "key" Com_QueueEvent(0, SE_KEY, scrollwheel, qtrue, 0, NULL); break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_WINDOWEVENT_RESIZED: { char width[32], height[32]; 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() + 1000; } break; case SDL_WINDOWEVENT: if (e.window.event & SDL_WINDOW_INPUT_FOCUS) { Cvar_SetValue("com_unfocused", !(SDL_GetWindowFlags( SDLvidscreen ) & SDL_WINDOW_INPUT_FOCUS) ); } if (e.window.event & (SDL_WINDOW_SHOWN | SDL_WINDOW_MINIMIZED)) { Cvar_SetValue("com_minimized", !(SDL_GetWindowFlags( SDLvidscreen ) & SDL_WINDOW_MINIMIZED) ); // if ( e.active.gain && Cvar_VariableIntegerValue("r_fullscreen") ) // Cbuf_ExecuteText( EXEC_APPEND, "vid_restart\n" ); } break; case SDL_TEXTEDITING: case SDL_TEXTINPUT: default: break; } } }
/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( void ) { SDL_Event e; const char *character = NULL; keyNum_t key = 0; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; if( Key_GetCatcher( ) == 0 && keyRepeatEnabled ) { SDL_EnableKeyRepeat( 0, 0 ); keyRepeatEnabled = qfalse; } else if( !keyRepeatEnabled ) { SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); keyRepeatEnabled = qtrue; } while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_ACTIVEEVENT: if( ( e.active.state & SDL_APPACTIVE ) && e.active.gain ) { if( fullscreen_minimized ) { #ifdef MACOS_X Cvar_Set( "r_fullscreen", "1" ); #endif fullscreen_minimized = qfalse; } IN_ActivateMouse(); } break; case SDL_KEYDOWN: character = IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qtrue ); if( key ) Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); if( character ) Com_QueueEvent( 0, SE_CHAR, *character, 0, 0, NULL ); break; case SDL_KEYUP: IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qfalse ); if( key ) Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); break; case SDL_MOUSEMOTION: if( mouseActive ) Com_QueueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned char b; switch( e.button.button ) { case 1: b = K_MOUSE1; break; case 2: b = K_MOUSE3; break; case 3: b = K_MOUSE2; break; case 4: b = K_MWHEELUP; break; case 5: b = K_MWHEELDOWN; break; case 6: b = K_MOUSE4; break; case 7: b = K_MOUSE5; break; default: b = K_AUX1 + ( e.button.button - 8 ) % 16; break; } Com_QueueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_QUIT: Sys_Quit( ); break; default: break; } } }
static void IN_ProcessEvents(void) { SDL_Event e; const char *character = NULL; keyNum_t key = 0; if(!SDL_WasInit(SDL_INIT_VIDEO)) return; if(Key_GetCatcher( ) == 0 && keyRepeatEnabled){ SDL_EnableKeyRepeat(0, 0); keyRepeatEnabled = qfalse; }else if(!keyRepeatEnabled){ SDL_EnableKeyRepeat(300, 31); keyRepeatEnabled = qtrue; } while(SDL_PollEvent(&e)){ switch(e.type){ case SDL_KEYDOWN: character = IN_TranslateSDLToQ3Key(&e.key.keysym, &key, qtrue); if(key) comqueueevent(0, SE_KEY, key, qtrue, 0, NULL); if(character) comqueueevent(0, SE_CHAR, *character, 0, 0, NULL); break; case SDL_KEYUP: IN_TranslateSDLToQ3Key(&e.key.keysym, &key, qfalse); if(key) comqueueevent(0, SE_KEY, key, qfalse, 0, NULL); break; case SDL_MOUSEMOTION: if(mouseActive) comqueueevent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned char b; switch(e.button.button){ case 1: b = K_MOUSE1; break; case 2: b = K_MOUSE3; break; case 3: b = K_MOUSE2; break; case 4: b = K_MWHEELUP; break; case 5: b = K_MWHEELDOWN; break; case 6: b = K_MOUSE4; break; case 7: b = K_MOUSE5; break; default: b = K_AUX1 + (e.button.button - 8) % 16; break; } comqueueevent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL); } break; case SDL_QUIT: cbufexecstr(EXEC_NOW, "quit Closed window\n"); break; case SDL_VIDEORESIZE: { char width[32], height[32]; Q_sprintf(width, sizeof(width), "%d", e.resize.w); Q_sprintf(height, sizeof(height), "%d", e.resize.h); cvarsetstr("r_customwidth", width); cvarsetstr("r_customheight", height); cvarsetstr("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 = sysmillisecs() + 1000; } break; case SDL_ACTIVEEVENT: if(e.active.state & SDL_APPINPUTFOCUS){ cvarsetf("com_unfocused", !e.active.gain); } if(e.active.state & SDL_APPACTIVE){ cvarsetf("com_minimized", !e.active.gain); } break; default: break; } } }
static void IN_ProcessEvents(void) { SDL_Event e; const char *character = NULL; keyNum_t key = 0; if (!SDL_WasInit(SDL_INIT_VIDEO)) { return; } if (Key_GetCatcher() == 0 && keyRepeatEnabled) { SDL_EnableKeyRepeat(0, 0); keyRepeatEnabled = qfalse; } else if (!keyRepeatEnabled) { SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); keyRepeatEnabled = qtrue; } while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_KEYDOWN: character = IN_TranslateSDLToQ3Key(&e.key.keysym, &key, qtrue); if (key) { Com_QueueEvent(0, SE_KEY, key, qtrue, 0, NULL); } if (character) { Com_QueueEvent(0, SE_CHAR, *character, 0, 0, NULL); } break; case SDL_KEYUP: IN_TranslateSDLToQ3Key(&e.key.keysym, &key, qfalse); if (key) { Com_QueueEvent(0, SE_KEY, key, qfalse, 0, NULL); } break; case SDL_MOUSEMOTION: if (mouseActive) { Com_QueueEvent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned char b; switch (e.button.button) { case 1: b = K_MOUSE1; break; case 2: b = K_MOUSE3; break; case 3: b = K_MOUSE2; break; case 4: b = K_MWHEELUP; break; case 5: b = K_MWHEELDOWN; break; case 6: b = K_MOUSE4; break; case 7: b = K_MOUSE5; break; default: b = K_AUX1 + (e.button.button - 8) % 16; break; } Com_QueueEvent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL); } break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_VIDEORESIZE: { char width[32], height[32]; Com_sprintf(width, sizeof(width), "%d", e.resize.w); Com_sprintf(height, sizeof(height), "%d", e.resize.h); 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() + 1000; } break; case SDL_ACTIVEEVENT: if (e.active.state & SDL_APPINPUTFOCUS) { Cvar_SetValue("com_unfocused", !e.active.gain); #ifdef USE_RAW_INPUT_MOUSE if (e.active.gain && in_mouse->integer == 3) //raw input stops working on winxp after losing focus. (why?) { IN_ShutdownRawMouse(); IN_InitRawMouse(); } #endif } if (e.active.state & SDL_APPACTIVE) { Cvar_SetValue("com_minimized", !e.active.gain); // if ( e.active.gain && Cvar_VariableIntegerValue("r_fullscreen") ) // Cbuf_ExecuteText( EXEC_APPEND, "vid_restart\n" ); } break; default: break; } } }