Exemple #1
0
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;
		}
	}
}
Exemple #2
0
/*
===============
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;
		}
	}
}
Exemple #3
0
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;
        }
    }
}
Exemple #6
0
/*
===============
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;
		}
	}
}
Exemple #9
0
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;
		}
	}
}
Exemple #10
0
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;
		}
	}
}