/* ============== ConWndProc ============== */ static LONG WINAPI ConWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { char *cmdString; static qboolean s_timePolarity; switch (uMsg) { case WM_SIZE: CON_ResizeWindowsCon(LOWORD(lParam), HIWORD(lParam)); break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) { SetFocus(s_wcd.hwndInputLine); } if (com_viewlog && (com_dedicated && !com_dedicated->integer)) { // if the viewlog is open, check to see if it's being minimized if (com_viewlog->integer == 1) { if (HIWORD(wParam)) // minimized flag { Cvar_Set("viewlog", "2"); } } else if (com_viewlog->integer == 2) { if (!HIWORD(wParam)) // minimized flag { Cvar_Set("viewlog", "1"); } } } break; case WM_CLOSE: if ((com_dedicated && com_dedicated->integer)) { cmdString = CopyString("quit"); Com_QueueEvent(0, SE_CONSOLE, 0, 0, strlen(cmdString) + 1, cmdString); } else if (s_wcd.quitOnClose) { PostQuitMessage(0); } else { Sys_ShowConsole(0, qfalse); Cvar_Set("viewlog", "0"); } return 0; case WM_CTLCOLORSTATIC: if ((HWND)lParam == s_wcd.hwndBuffer) { SetBkColor((HDC)wParam, COLOR_BCK_NORMAL); SetTextColor((HDC)wParam, COLOR_TEXT_NORMAL); return (long)s_wcd.hbrEditBackground; } else if ((HWND)lParam == s_wcd.hwndErrorBox) { SetBkColor((HDC)wParam, COLOR_BCK_ERROR); if (s_timePolarity & 1) { SetTextColor((HDC)wParam, COLOR_TEXT_ERROR1); } else { SetTextColor((HDC)wParam, COLOR_TEXT_ERROR2); } return (long)s_wcd.hbrErrorBackground; } break; case WM_CTLCOLOREDIT: if ((HWND)lParam == s_wcd.hwndInputLine) { SetBkColor((HDC)wParam, COLOR_BCK_NORMAL); SetTextColor((HDC)wParam, COLOR_TEXT_EDIT); return (long)s_wcd.hbrEditBackground; } case WM_COMMAND: if (wParam == COPY_ID) { SendMessage(s_wcd.hwndBuffer, EM_SETSEL, 0, -1); SendMessage(s_wcd.hwndBuffer, WM_COPY, 0, 0); } else if (wParam == QUIT_ID) { if (s_wcd.quitOnClose) { PostQuitMessage(0); } else { cmdString = CopyString("quit"); Com_QueueEvent(0, SE_CONSOLE, 0, 0, strlen(cmdString) + 1, cmdString); } } else if (wParam == CLEAR_ID) { SendMessage(s_wcd.hwndBuffer, EM_SETSEL, 0, -1); SendMessage(s_wcd.hwndBuffer, EM_REPLACESEL, FALSE, ( LPARAM ) ""); UpdateWindow(s_wcd.hwndBuffer); } break; case WM_CREATE: s_wcd.hbmLogo = LoadBitmap(g_wv.hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); s_wcd.hbmClearBitmap = LoadBitmap(g_wv.hInstance, MAKEINTRESOURCE(IDB_BITMAP2)); s_wcd.hbrEditBackground = CreateSolidBrush(COLOR_BCK_NORMAL); s_wcd.hbrErrorBackground = CreateSolidBrush(COLOR_BCK_ERROR); SetTimer(hWnd, 1, 1000, NULL); break; case WM_ERASEBKGND: return DefWindowProc(hWnd, uMsg, wParam, lParam); case WM_TIMER: if (wParam == 1) { s_timePolarity = (qboolean) !s_timePolarity; if (s_wcd.hwndErrorBox) { InvalidateRect(s_wcd.hwndErrorBox, NULL, FALSE); } } break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }
/* =============== 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_Xbox360ControllerMove =============== */ static void IN_Xbox360ControllerMove() { bool joy_pressed[ ARRAY_LEN( joy_keys ) ]; unsigned int axes = 0; unsigned int hat = 0; int total = 0; int i = 0; if ( !stick ) { return; } if ( !in_joystick->integer ) { return; } SDL_JoystickUpdate(); memset( joy_pressed, '\0', sizeof( joy_pressed ) ); // query the stick buttons... total = SDL_JoystickNumButtons( stick ); if ( total > 0 ) { if ( total > (int) ARRAY_LEN( stick_state.buttons ) ) { total = ARRAY_LEN( stick_state.buttons ); } for ( i = 0; i < total; i++ ) { bool pressed = ( SDL_JoystickGetButton( stick, i ) != 0 ); if ( pressed != stick_state.buttons[ i ] ) { Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_A + i, pressed, 0, nullptr ); if ( in_xbox360ControllerDebug->integer ) { Log::Notice( "xbox button = %i to key = Q:0x%02x(%s)\n", i, K_XBOX360_A + i, Key_KeynumToString( K_XBOX360_A + i ) ); } stick_state.buttons[ i ] = pressed; } } } // look at the hats... total = SDL_JoystickNumHats( stick ); hat = SDL_JoystickGetHat( stick, 0 ); // update hat state if ( hat != stick_state.oldhats ) { if ( hat != stick_state.oldhats ) { int key; const int allHatDirections = ( SDL_HAT_UP | SDL_HAT_RIGHT | SDL_HAT_DOWN | SDL_HAT_LEFT ); if ( in_xbox360ControllerDebug->integer ) { switch ( hat & allHatDirections ) { case SDL_HAT_UP: key = K_XBOX360_DPAD_UP; break; case SDL_HAT_RIGHT: key = K_XBOX360_DPAD_RIGHT; break; case SDL_HAT_DOWN: key = K_XBOX360_DPAD_DOWN; break; case SDL_HAT_LEFT: key = K_XBOX360_DPAD_LEFT; break; case SDL_HAT_RIGHTUP: key = K_XBOX360_DPAD_RIGHTUP; break; case SDL_HAT_RIGHTDOWN: key = K_XBOX360_DPAD_RIGHTDOWN; break; case SDL_HAT_LEFTUP: key = K_XBOX360_DPAD_LEFTUP; break; case SDL_HAT_LEFTDOWN: key = K_XBOX360_DPAD_LEFTDOWN; break; default: key = 0; break; } if ( hat != SDL_HAT_CENTERED ) { Log::Notice( "xbox hat bits = %i to key = Q:0x%02x(%s)\n", hat, key, Key_KeynumToString( key ) ); } } // release event switch ( stick_state.oldhats & allHatDirections ) { case SDL_HAT_UP: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_UP, false, 0, nullptr ); break; case SDL_HAT_RIGHT: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_RIGHT, false, 0, nullptr ); break; case SDL_HAT_DOWN: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_DOWN, false, 0, nullptr ); break; case SDL_HAT_LEFT: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_LEFT, false, 0, nullptr ); break; case SDL_HAT_RIGHTUP: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_RIGHTUP, false, 0, nullptr ); break; case SDL_HAT_RIGHTDOWN: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_RIGHTDOWN, false, 0, nullptr ); break; case SDL_HAT_LEFTUP: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_LEFTUP, false, 0, nullptr ); break; case SDL_HAT_LEFTDOWN: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_LEFTDOWN, false, 0, nullptr ); break; default: break; } // press event switch ( hat & allHatDirections ) { case SDL_HAT_UP: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_UP, true, 0, nullptr ); break; case SDL_HAT_RIGHT: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_RIGHT, true, 0, nullptr ); break; case SDL_HAT_DOWN: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_DOWN, true, 0, nullptr ); break; case SDL_HAT_LEFT: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_LEFT, true, 0, nullptr ); break; case SDL_HAT_RIGHTUP: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_RIGHTUP, true, 0, nullptr ); break; case SDL_HAT_RIGHTDOWN: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_RIGHTDOWN, true, 0, nullptr ); break; case SDL_HAT_LEFTUP: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_LEFTUP, true, 0, nullptr ); break; case SDL_HAT_LEFTDOWN: Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_XBOX360_DPAD_LEFTDOWN, true, 0, nullptr ); break; default: break; } } } // save hat state stick_state.oldhats = hat; #if defined( WIN32 ) // use left stick for strafing IN_XBox360Axis( 0, joystickAxis_t::AXIS_SIDE, 127 ); IN_XBox360Axis( 1, joystickAxis_t::AXIS_FORWARD, -127 ); // use right stick for viewing IN_XBox360Axis( 4, joystickAxis_t::AXIS_YAW, -127 ); IN_XBox360Axis( 3, joystickAxis_t::AXIS_PITCH, 127 ); axes |= IN_XBox360AxisToButton( 2, K_XBOX360_LT, -1, 0 ); axes |= IN_XBox360AxisToButton( 5, K_XBOX360_RT, -1, 0 ); #else // use left stick for strafing IN_XBox360Axis( 0, joystickAxis_t::AXIS_SIDE, 127 ); IN_XBox360Axis( 1, joystickAxis_t::AXIS_FORWARD, -127 ); // use right stick for viewing IN_XBox360Axis( 3, joystickAxis_t::AXIS_YAW, -127 ); IN_XBox360Axis( 4, joystickAxis_t::AXIS_PITCH, 127 ); axes |= IN_XBox360AxisToButton( 2, K_XBOX360_LT, -1, 0 ); axes |= IN_XBox360AxisToButton( 5, K_XBOX360_RT, -1, 0 ); #endif /* Save for future generations. */ stick_state.oldaxes = axes; }
/* =============== 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; } } }
/* ============== ConWndProc ============== */ static LONG WINAPI ConWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { char *cmdString; static bool s_timePolarity; int cx, cy; float sx, sy, x, y, w, h; switch ( uMsg ) { case WM_SIZE: // NERVE - SMF cx = LOWORD( lParam ); cy = HIWORD( lParam ); if ( cx < SYSCON_DEFAULT_WIDTH ) cx = SYSCON_DEFAULT_WIDTH; if ( cy < SYSCON_DEFAULT_HEIGHT ) cy = SYSCON_DEFAULT_HEIGHT; sx = (float)cx / SYSCON_DEFAULT_WIDTH; sy = (float)cy / SYSCON_DEFAULT_HEIGHT; x = 5; y = 40; w = cx - 15; h = cy - 100; SetWindowPos( s_wcd.hwndBuffer, NULL, x, y, w, h, 0 ); y = y + h + 8; h = 20; SetWindowPos( s_wcd.hwndInputLine, NULL, x, y, w, h, 0 ); y = y + h + 4; w = 72 * sx; h = 24; SetWindowPos( s_wcd.hwndButtonCopy, NULL, x, y, w, h, 0 ); x = x + w + 2; SetWindowPos( s_wcd.hwndButtonClear, NULL, x, y, w, h, 0 ); x = cx - 15 - w; SetWindowPos( s_wcd.hwndButtonQuit, NULL, x, y, w, h, 0 ); s_wcd.windowWidth = cx; s_wcd.windowHeight = cy; // -NERVE - SMF break; case WM_ACTIVATE: if ( LOWORD( wParam ) != WA_INACTIVE ) { SetFocus( s_wcd.hwndInputLine ); } if ( com_viewlog && ( com_dedicated && !com_dedicated->integer ) ) { // if the viewlog is open, check to see if it's being minimized if ( com_viewlog->integer == 1 ) { if ( HIWORD( wParam ) ) { // minimized flag Cvar_Set( "viewlog", "2" ); } } else if ( com_viewlog->integer == 2 ) { if ( !HIWORD( wParam ) ) { // minimized flag Cvar_Set( "viewlog", "1" ); } } } break; case WM_CLOSE: if ( ( com_dedicated && com_dedicated->integer ) ) { cmdString = CopyString( "quit" ); Com_QueueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, cmdString ); } else if ( s_wcd.quitOnClose ) { PostQuitMessage( 0 ); } else { Sys_ShowConsole( 0, false ); Cvar_Set( "viewlog", "0" ); } return 0; case WM_CTLCOLORSTATIC: if ( ( HWND ) lParam == s_wcd.hwndBuffer ) { SetBkColor( ( HDC ) wParam, RGB( 204, 204, 204 ) ); SetTextColor( ( HDC ) wParam, RGB( 0, 0, 0 ) ); #if 0 // this draws a background in the edit box, but there are issues with this if ( ( hdcScaled = CreateCompatibleDC( ( HDC ) wParam ) ) != 0 ) { if ( SelectObject( ( HDC ) hdcScaled, s_wcd.hbmLogo ) ) { StretchBlt( ( HDC ) wParam, 0, 0, 512, 384, hdcScaled, 0, 0, 512, 384, SRCCOPY ); } DeleteDC( hdcScaled ); } #endif return ( long ) s_wcd.hbrEditBackground; } else if ( ( HWND ) lParam == s_wcd.hwndErrorBox ) { if ( s_timePolarity & 1 ) { SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); SetTextColor( ( HDC ) wParam, RGB( 0xff, 0x0, 0x00 ) ); } else { SetBkColor( ( HDC ) wParam, RGB( 0x80, 0x80, 0x80 ) ); SetTextColor( ( HDC ) wParam, RGB( 0x00, 0x0, 0x00 ) ); } return ( long ) s_wcd.hbrErrorBackground; } break; case WM_COMMAND: if ( wParam == COPY_ID ) { SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); SendMessage( s_wcd.hwndBuffer, WM_COPY, 0, 0 ); } else if ( wParam == QUIT_ID ) { if ( s_wcd.quitOnClose ) { PostQuitMessage( 0 ); } else { cmdString = CopyString( "quit" ); Com_QueueEvent( 0, SE_CONSOLE, 0, 0, strlen( cmdString ) + 1, cmdString ); } } else if ( wParam == CLEAR_ID ) { SendMessage( s_wcd.hwndBuffer, EM_SETSEL, 0, -1 ); SendMessage( s_wcd.hwndBuffer, EM_REPLACESEL, FALSE, ( LPARAM ) "" ); UpdateWindow( s_wcd.hwndBuffer ); } break; case WM_CREATE: s_wcd.hbmLogo = LoadBitmap( g_wv.hInstance, MAKEINTRESOURCE( IDB_BITMAP1 ) ); s_wcd.hbmClearBitmap = LoadBitmap( g_wv.hInstance, MAKEINTRESOURCE( IDB_BITMAP2 ) ); s_wcd.hbrEditBackground = CreateSolidBrush( RGB( 204, 204, 204 ) ); s_wcd.hbrErrorBackground = CreateSolidBrush( RGB( 0x80, 0x80, 0x80 ) ); SetTimer( hWnd, 1, 1000, NULL ); break; case WM_ERASEBKGND: #if 0 HDC hdcScaled; HGDIOBJ oldObject; #if 0 // a single, large image hdcScaled = CreateCompatibleDC( ( HDC ) wParam ); assert( hdcScaled != 0 ); if ( hdcScaled ) { oldObject = SelectObject( ( HDC ) hdcScaled, s_wcd.hbmLogo ); assert( oldObject != 0 ); if ( oldObject ) { StretchBlt( ( HDC ) wParam, 0, 0, s_wcd.windowWidth, s_wcd.windowHeight, hdcScaled, 0, 0, 512, 384, SRCCOPY ); } DeleteDC( hdcScaled ); hdcScaled = 0; } #else // a repeating brush { HBRUSH hbrClearBrush; RECT r; GetWindowRect( hWnd, &r ); r.bottom = r.bottom - r.top + 1; r.right = r.right - r.left + 1; r.top = 0; r.left = 0; hbrClearBrush = CreatePatternBrush( s_wcd.hbmClearBitmap ); assert( hbrClearBrush != 0 ); if ( hbrClearBrush ) { FillRect( ( HDC ) wParam, &r, hbrClearBrush ); DeleteObject( hbrClearBrush ); } } #endif return 1; #endif return DefWindowProc( hWnd, uMsg, wParam, lParam ); case WM_TIMER: if ( wParam == 1 ) { s_timePolarity = (bool)!s_timePolarity; if ( s_wcd.hwndErrorBox ) { InvalidateRect( s_wcd.hwndErrorBox, NULL, FALSE ); } } break; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
/* =============== 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 Accelerometer_HandleEvents(void) { int dx = 0, dy = 0; int t, tmp; int x, y, z; static int jumpTime = 0; t = Sys_Milliseconds(); if (!accel_angle) { accel_angle = Cvar_Get("accel_angle", "45", CVAR_ARCHIVE); } if (!accel_debug) { accel_debug = Cvar_Get("accel_debug", "0", CVAR_ARCHIVE); } if (!accel_jump) { accel_jump = Cvar_Get("accel_jump", "-1300", CVAR_ARCHIVE); } if (!accel_epsilon_x) { accel_epsilon_x = Cvar_Get("accel_epsilon_x", "100", CVAR_ARCHIVE); } if (!accel_epsilon_y) { accel_epsilon_y = Cvar_Get("accel_epsilon_y", "100", CVAR_ARCHIVE); } Accelerometer_ReadCoords(&x, &y, &z); /* only update sin and cos if the cvar's changed */ tmp = accel_angle->value; if(tmp != accel_angle_value) { /* what happened to sincosf()? */ accel_sin = sin(DEG2RAD(tmp)); accel_cos = cos(DEG2RAD(tmp)); accel_angle_value = tmp; } tmp = y * accel_cos - z * accel_sin; z = z * accel_cos + y * accel_sin; y = tmp; if (accel_debug->integer) { Com_DPrintf("Accelerometer_HandleEvents: y = %d\n", y); } if (accel_jump->value) { float mag = sqrtf(y*y+z*z); // HACK - change the sign of jump to be +ve not -ve // HACK - z<0 means that lots of jerks will look like jumps // change it to < -500 or < accel_jump->value/2 int looks_like_a_jump = (mag > -accel_jump->value) && (z < 0); if (!jumpTime && looks_like_a_jump) { Com_QueueEvent(t, SE_KEY, K_SPACE, qtrue, 0, NULL); jumpTime = t; } else if (jumpTime && !looks_like_a_jump) { Com_QueueEvent(t, SE_KEY, K_SPACE, qfalse, 0, NULL); jumpTime = 0; } } if (x > accel_epsilon_x->integer) dx = -(x - accel_epsilon_x->integer); else if (x < -accel_epsilon_x->integer) dx = -(x + accel_epsilon_x->integer); if (y > accel_epsilon_y->integer) dy = -(y - accel_epsilon_y->integer); else if (y < -accel_epsilon_y->integer) dy = -(y + accel_epsilon_y->integer); dx *= cl_sensitivity->value; dy *= cl_sensitivity->value; Com_QueueEvent(t, SE_ACCEL, dx, dy, 0, NULL); }
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; } } }
/* =============== 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) { 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; } } }
static void JoySetAxisValue(int axis, signed short value) { float f = ( (float) abs(value) ) / 32767.0f; if( f < in_joystickThreshold->value ) value = 0; Com_QueueEvent( 0, SE_JOYSTICK_AXIS, axis, value, 0, NULL ); }
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.x, e.motion.y, 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_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); SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_5, &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 (cl_runningOnOuya->integer) { touchPointers[e.jball.ball].x = touchPointers[e.jball.ball].x * cls.glconfig.vidWidth / (cls.glconfig.vidWidth - cls.glconfig.vidWidth * OUYA_BORDER / 100 * 3 / 2) - cls.glconfig.vidWidth * OUYA_BORDER / 100; touchPointers[e.jball.ball].y = touchPointers[e.jball.ball].y * cls.glconfig.vidHeight / (cls.glconfig.vidHeight - cls.glconfig.vidHeight * OUYA_BORDER / 100 * 3 / 2) - cls.glconfig.vidHeight * OUYA_BORDER / 100; } 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 ); } }
static void IN_ProcessTouchPoints( void ) { // We need only two touch pointers - first one is mouse, second for weapon selection, so we'll ignore all extra touch events. // SDL will provide us with on-screen joystick, accelerometer and text input button, that won't be in touch events. // TODO: this code will skip events, if user touches and releases finger during a single frame. int i, j, allEmpty = 1, nonEmpty[MAX_FILTERED] = { -1, -1 }; for( i = 0; i < MAX_POINTERS; i++ ) { if( touchPointers[i].pressed ) { allEmpty = 0; if( nonEmpty[0] < 0 ) nonEmpty[0] = i; else if( nonEmpty[1] < 0 ) nonEmpty[1] = i; if( filteredTouch[0].idx < 0 ) filteredTouch[0].idx = i; else if( filteredTouch[1].idx < 0 && filteredTouch[0].idx != i ) filteredTouch[1].idx = i; } } if( allEmpty ) { if( filteredTouch[0].idx >= 0 ) filteredTouch[0].idx = -1; if( filteredTouch[1].idx >= 0 ) filteredTouch[1].idx = -1; } if( filteredTouch[0].idx >= 0 && !touchPointers[filteredTouch[0].idx].pressed ) { filteredTouch[0].idx = nonEmpty[0]; if( filteredTouch[1].idx == filteredTouch[0].idx ) filteredTouch[1].idx = nonEmpty[1]; } if( filteredTouch[1].idx >= 0 && !touchPointers[filteredTouch[1].idx].pressed ) { if( nonEmpty[0] != filteredTouch[0].idx ) filteredTouch[1].idx = nonEmpty[0]; else filteredTouch[1].idx = nonEmpty[1]; } // TODO: too lazy to put them in a loop if( filteredTouch[0].idx >= 0 ) { //Com_Printf("K_MOUSE1 coords %04d %04d\n", touchPointers[filteredTouch[0].idx].x, touchPointers[filteredTouch[0].idx].y); Com_QueueEvent( 0, SE_MOUSE, touchPointers[filteredTouch[0].idx].x, touchPointers[filteredTouch[0].idx].y, 0, NULL ); filteredTouch[0].pressed = 1; } if( filteredTouch[0].idx < 0 && filteredTouch[0].pressed ) filteredTouch[0].pressed = 0; if( filteredTouch[0].pressed != filteredTouch[0].oldpressed ) { filteredTouch[0].oldpressed = filteredTouch[0].pressed; // Defer the mouse event for two frames, because in game code, we shoot first, then send a packet to the server, and only then aim. This will hopefully be unnoticeable on fast devices. if( filteredTouch[0].pressed ) deferredTouch = 2; else { if( deferredTouch > 0 ) Com_QueueEvent( 0, SE_KEY, K_MOUSE1, qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, K_MOUSE1, qfalse, 0, NULL ); deferredTouch = 0; } } if( filteredTouch[1].idx >= 0 ) { //Com_Printf("K_MOUSE2 coords %04d %04d\n", touchPointers[filteredTouch[1].idx].x, touchPointers[filteredTouch[1].idx].y); Com_QueueEvent( 0, SE_MOUSE2, touchPointers[filteredTouch[1].idx].x, touchPointers[filteredTouch[1].idx].y, 0, NULL ); filteredTouch[1].pressed = 1; } if( filteredTouch[1].idx < 0 && filteredTouch[1].pressed ) { filteredTouch[1].pressed = 0; } if( filteredTouch[1].pressed != filteredTouch[1].oldpressed ) { filteredTouch[1].oldpressed = filteredTouch[1].pressed; Com_QueueEvent( 0, SE_KEY, K_MOUSE5, filteredTouch[1].pressed, 0, NULL ); //Com_Printf("K_MOUSE2 %s\n", filteredTouch[1].pressed ? "pressed" : "released"); } }
/* =============== IN_JoyMove =============== */ static void IN_JoyMove( void ) { qboolean joy_pressed[ARRAY_LEN(joy_keys)]; unsigned int axes = 0; unsigned int hats = 0; int total = 0; int i = 0; if (!stick) return; SDL_JoystickUpdate(); memset(joy_pressed, '\0', sizeof (joy_pressed)); // update the ball state. total = SDL_JoystickNumBalls(stick); if (total > 0) { int balldx = 0; int balldy = 0; for (i = 0; i < total; i++) { int dx = 0; int dy = 0; SDL_JoystickGetBall(stick, i, &dx, &dy); balldx += dx; balldy += dy; } if (balldx || balldy) { // !!! FIXME: is this good for stick balls, or just mice? // Scale like the mouse input... if (abs(balldx) > 1) balldx *= 2; if (abs(balldy) > 1) balldy *= 2; Com_QueueEvent( 0, SE_MOUSE, balldx, balldy, 0, NULL ); } } // now query the stick buttons... total = SDL_JoystickNumButtons(stick); if (total > 0) { if (total > ARRAY_LEN(stick_state.buttons)) total = ARRAY_LEN(stick_state.buttons); for (i = 0; i < total; i++) { qboolean pressed = (SDL_JoystickGetButton(stick, i) != 0); if (pressed != stick_state.buttons[i]) { Com_QueueEvent( 0, SE_KEY, K_JOY1 + i, pressed, 0, NULL ); stick_state.buttons[i] = pressed; } } } // look at the hats... total = SDL_JoystickNumHats(stick); if (total > 0) { if (total > 4) total = 4; for (i = 0; i < total; i++) { ((Uint8 *)&hats)[i] = SDL_JoystickGetHat(stick, i); } } // update hat state if (hats != stick_state.oldhats) { for( i = 0; i < 4; i++ ) { if( ((Uint8 *)&hats)[i] != ((Uint8 *)&stick_state.oldhats)[i] ) { // release event switch( ((Uint8 *)&stick_state.oldhats)[i] ) { case SDL_HAT_UP: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 0], qfalse, 0, NULL ); break; case SDL_HAT_RIGHT: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 1], qfalse, 0, NULL ); break; case SDL_HAT_DOWN: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 2], qfalse, 0, NULL ); break; case SDL_HAT_LEFT: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 3], qfalse, 0, NULL ); break; case SDL_HAT_RIGHTUP: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 0], qfalse, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 1], qfalse, 0, NULL ); break; case SDL_HAT_RIGHTDOWN: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 2], qfalse, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 1], qfalse, 0, NULL ); break; case SDL_HAT_LEFTUP: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 0], qfalse, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 3], qfalse, 0, NULL ); break; case SDL_HAT_LEFTDOWN: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 2], qfalse, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 3], qfalse, 0, NULL ); break; default: break; } // press event switch( ((Uint8 *)&hats)[i] ) { case SDL_HAT_UP: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 0], qtrue, 0, NULL ); break; case SDL_HAT_RIGHT: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 1], qtrue, 0, NULL ); break; case SDL_HAT_DOWN: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 2], qtrue, 0, NULL ); break; case SDL_HAT_LEFT: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 3], qtrue, 0, NULL ); break; case SDL_HAT_RIGHTUP: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 0], qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 1], qtrue, 0, NULL ); break; case SDL_HAT_RIGHTDOWN: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 2], qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 1], qtrue, 0, NULL ); break; case SDL_HAT_LEFTUP: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 0], qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 3], qtrue, 0, NULL ); break; case SDL_HAT_LEFTDOWN: Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 2], qtrue, 0, NULL ); Com_QueueEvent( 0, SE_KEY, hat_keys[4*i + 3], qtrue, 0, NULL ); break; default: break; } } } } // save hat state stick_state.oldhats = hats; // finally, look at the axes... total = SDL_JoystickNumAxes(stick); if (total > 0) { if (in_joystickUseAnalog->integer) { if (total > MAX_JOYSTICK_AXIS) total = MAX_JOYSTICK_AXIS; for (i = 0; i < total; i++) { Sint16 axis = SDL_JoystickGetAxis(stick, i); float f = ( (float) abs(axis) ) / 32767.0f; if( f < in_joystickThreshold->value ) axis = 0; if ( axis != stick_state.oldaaxes[i] ) { Com_QueueEvent( 0, SE_JOYSTICK_AXIS, i, axis, 0, NULL ); stick_state.oldaaxes[i] = axis; } } } else { if (total > 16) total = 16; for (i = 0; i < total; i++) { Sint16 axis = SDL_JoystickGetAxis(stick, i); float f = ( (float) axis ) / 32767.0f; if( f < -in_joystickThreshold->value ) { axes |= ( 1 << ( i * 2 ) ); } else if( f > in_joystickThreshold->value ) { axes |= ( 1 << ( ( i * 2 ) + 1 ) ); } } } } /* Time to update axes state based on old vs. new. */ if (axes != stick_state.oldaxes) { for( i = 0; i < 16; i++ ) { if( ( axes & ( 1 << i ) ) && !( stick_state.oldaxes & ( 1 << i ) ) ) { Com_QueueEvent( 0, SE_KEY, joy_keys[i], qtrue, 0, NULL ); } if( !( axes & ( 1 << i ) ) && ( stick_state.oldaxes & ( 1 << i ) ) ) { Com_QueueEvent( 0, SE_KEY, joy_keys[i], qfalse, 0, NULL ); } } } /* Save for future generations. */ stick_state.oldaxes = axes; }
static void HandleEvents(void) { int key; XEvent event; char *p; static int dx = 0, dy = 0; int t = 0; // default to 0 in case we don't set if (!dpy) return; while (XPending(dpy)) { XNextEvent(dpy, &event); switch (event.type) { case KeyPress: t = Sys_XTimeToSysTime(event.xkey.time); p = XLateKey(&event.xkey, &key); if (key) { Com_QueueEvent(t, SE_KEY, key, qtrue, 0, NULL); } if (p) { while (*p) { Com_QueueEvent(t, SE_CHAR, *p++, 0, 0, NULL); } } break; case KeyRelease: t = Sys_XTimeToSysTime(event.xkey.time); #if 0 // bk001206 - handle key repeat w/o XAutRepatOn/Off // also: not done if console/menu is active. // From Ryan's Fakk2. // see game/q_shared.h, KEYCATCH_* . 0 == in 3d game. if (cls.keyCatchers == 0) { // FIXME: KEYCATCH_NONE if (repeated_press(&event) == qtrue) continue; } // if #endif XLateKey(&event.xkey, &key); Com_QueueEvent(t, SE_KEY, key, qfalse, 0, NULL); break; case MotionNotify: t = Sys_XTimeToSysTime(event.xkey.time); dx = event.xmotion.x; dy = event.xmotion.y; break; case ButtonPress: case ButtonRelease: t = Sys_XTimeToSysTime(event.xkey.time); motionPressed = (qboolean) (event.type == ButtonPress); if (Key_GetCatcher() & (KEYCATCH_CGAME | KEYCATCH_UI)) { Com_QueueEvent(t, SE_KEY, K_MOUSE1, motionPressed, 0, NULL); } break; case CreateNotify: win_x = event.xcreatewindow.x; win_y = event.xcreatewindow.y; break; case ConfigureNotify: win_x = event.xconfigure.x; win_y = event.xconfigure.y; break; } } if (motionPressed) { Com_QueueEvent(t, SE_MOUSE, dx, dy, 0, NULL); } Proximity_HandleEvents(); Accelerometer_HandleEvents(); }
/* =============== 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; 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 != CONSOLE_KEY) { 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, CONSOLE_KEY, qtrue, 0, NULL); Com_QueueEvent(0, SE_KEY, CONSOLE_KEY, 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; } } }