示例#1
0
/*
===============
IN_ProcessEvents
===============
*/
static void IN_ProcessEvents( void )
{
	SDL_Event e;
	fakeAscii_t key = A_NULL;
	const char *character = NULL;
	static fakeAscii_t lastKeyDown = A_NULL;

	if( !SDL_WasInit( SDL_INIT_VIDEO ) )
			return;

	while( SDL_PollEvent( &e ) )
	{
		switch( e.type )
		{
			case SDL_KEYDOWN:
				character = IN_TranslateSDLToJKKey( &e.key.keysym, &key, qtrue );
				if( key != A_NULL )
					Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL );
				
				if( character )
					Sys_QueEvent( 0, SE_CHAR, *character, qfalse, 0, NULL );

				lastKeyDown = key;
				break;

			case SDL_KEYUP:
				IN_TranslateSDLToJKKey( &e.key.keysym, &key, qfalse );
				if( key != A_NULL )
					Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL );

				lastKeyDown = A_NULL;
				break;

			case SDL_TEXTINPUT:
				if( lastKeyDown != A_CONSOLE )
				{
					char *c = e.text.text;

					// Quick and dirty UTF-8 to UTF-32 conversion
					while( *c )
					{
						int utf32 = 0;

						if( ( *c & 0x80 ) == 0 )
							utf32 = *c++;
						else if( ( *c & 0xE0 ) == 0xC0 ) // 110x xxxx
						{
							utf32 |= ( *c++ & 0x1F ) << 6;
							utf32 |= ( *c++ & 0x3F );
						}
						else if( ( *c & 0xF0 ) == 0xE0 ) // 1110 xxxx
						{
							utf32 |= ( *c++ & 0x0F ) << 12;
							utf32 |= ( *c++ & 0x3F ) << 6;
							utf32 |= ( *c++ & 0x3F );
						}
						else if( ( *c & 0xF8 ) == 0xF0 ) // 1111 0xxx
						{
							utf32 |= ( *c++ & 0x07 ) << 18;
							utf32 |= ( *c++ & 0x3F ) << 6;
							utf32 |= ( *c++ & 0x3F ) << 6;
							utf32 |= ( *c++ & 0x3F );
						}
						else
						{
							Com_DPrintf( "Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c );
							c++;
						}

						if( utf32 != 0 )
						{
							if( IN_IsConsoleKey( A_NULL, utf32 ) )
							{
								Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL );
								Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL );
							}
							else
								Sys_QueEvent( 0, SE_CHAR, utf32, 0, 0, NULL );
						}
					}
				}
				break;

			case SDL_MOUSEMOTION:
				if( mouseActive )
					Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL );
				break;

			case SDL_MOUSEBUTTONDOWN:
			case SDL_MOUSEBUTTONUP:
				{
					unsigned short b;
					switch( e.button.button )
					{
						case SDL_BUTTON_LEFT:	b = A_MOUSE1;     break;
						case SDL_BUTTON_MIDDLE:	b = A_MOUSE3;     break;
						case SDL_BUTTON_RIGHT:	b = A_MOUSE2;     break;
						case SDL_BUTTON_X1:		b = A_MOUSE4;     break;
						case SDL_BUTTON_X2:		b = A_MOUSE5;     break;
						default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break;
					}
					Sys_QueEvent( 0, SE_KEY, b,
						( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL );
				}
				break;

			case SDL_MOUSEWHEEL:
				if( e.wheel.y > 0 )
					Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL );
				else
					Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL );
				break;

			case SDL_QUIT:
				Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n");
				break;

			case SDL_WINDOWEVENT:
				switch( e.window.event )
				{
					case SDL_WINDOWEVENT_RESIZED:
						{
							char width[32], height[32];
							if (!Cvar_VariableIntegerValue("r_restartOnResize"))
								break;
							Com_sprintf( width, sizeof( width ), "%d", e.window.data1 );
							Com_sprintf( height, sizeof( height ), "%d", e.window.data2 );
							Cvar_Set( "r_customwidth", width );
							Cvar_Set( "r_customheight", height );
							Cvar_Set( "r_mode", "-1" );

							// Wait until user stops dragging for 1 second, so
							// we aren't constantly recreating the GL context while
							// he tries to drag...
							vidRestartTime = Sys_Milliseconds( ) + Cvar_VariableIntegerValue("r_resizeDelay");
						}
						break;

					case SDL_WINDOWEVENT_MINIMIZED:    Cvar_SetValue( "com_minimized", 1 ); break;
					case SDL_WINDOWEVENT_MAXIMIZED:    Cvar_SetValue( "com_minimized", 0 ); break;
					case SDL_WINDOWEVENT_FOCUS_LOST:   Cvar_SetValue( "com_unfocused", 1 ); break;
					case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break;
				}
				break;

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

	if( !SDL_WasInit( SDL_INIT_VIDEO ) )
			return;

	while( SDL_PollEvent( &e ) )
	{
		switch( e.type )
		{
			case SDL_KEYDOWN:
				key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue );
				if ( key != A_NULL )
					Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL );

				if ( key == A_BACKSPACE )
					Sys_QueEvent( 0, SE_CHAR, CTRL('h'), qfalse, 0, NULL);
				else if ( kg.keys[A_CTRL].down && key >= 'a' && key <= 'z' )
					Sys_QueEvent( 0, SE_CHAR, CTRL(key), qfalse, 0, NULL );

				lastKeyDown = key;
				break;

			case SDL_KEYUP:
				key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse );
				if( key != A_NULL )
					Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL );

				lastKeyDown = A_NULL;
				break;

			case SDL_TEXTINPUT:
				if( lastKeyDown != A_CONSOLE )
				{
					char *c = e.text.text;

					// Quick and dirty UTF-8 to UTF-32 conversion
					while( *c )
					{
						uint32_t utf32 = ConvertUTF8ToUTF32( c, &c );
						if( utf32 != 0 )
						{
							if( IN_IsConsoleKey( A_NULL, utf32 ) )
							{
								Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL );
								Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL );
							}
							else
							{
								uint8_t encoded = ConvertUTF32ToExpectedCharset( utf32 );
								Sys_QueEvent( 0, SE_CHAR, encoded, 0, 0, NULL );
							}
						}
					}
				}
				break;

			case SDL_MOUSEMOTION:
				if ( mouseActive )
				{
					if ( !e.motion.xrel && !e.motion.yrel )
						break;
					Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL );
				}
				break;

			case SDL_MOUSEBUTTONDOWN:
			case SDL_MOUSEBUTTONUP:
				{
					unsigned short b;
					switch( e.button.button )
					{
						case SDL_BUTTON_LEFT:	b = A_MOUSE1;     break;
						case SDL_BUTTON_MIDDLE:	b = A_MOUSE3;     break;
						case SDL_BUTTON_RIGHT:	b = A_MOUSE2;     break;
						case SDL_BUTTON_X1:		b = A_MOUSE4;     break;
						case SDL_BUTTON_X2:		b = A_MOUSE5;     break;
						default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break;
					}
					Sys_QueEvent( 0, SE_KEY, b,
						( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL );
				}
				break;

			case SDL_MOUSEWHEEL:
				if( e.wheel.y > 0 )
				{
					Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL );
					Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL );
				}
				else
				{
					Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL );
					Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL );
				}
				break;

			case SDL_QUIT:
				Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n");
				break;

			case SDL_WINDOWEVENT:
				switch( e.window.event )
				{
					case SDL_WINDOWEVENT_MINIMIZED:    Cvar_SetValue( "com_minimized", 1 ); break;
					case SDL_WINDOWEVENT_RESTORED:
					case SDL_WINDOWEVENT_MAXIMIZED:    Cvar_SetValue( "com_minimized", 0 ); break;
					case SDL_WINDOWEVENT_FOCUS_LOST:
					{
						Cvar_SetValue( "com_unfocused", 1 );
						SNDDMA_Activate( qfalse );
						break;
					}

					case SDL_WINDOWEVENT_FOCUS_GAINED:
					{
						Cvar_SetValue( "com_unfocused", 0 );
						SNDDMA_Activate( qtrue );
						break;
					}
				}
				break;

			default:
				break;
		}
	}
}
示例#4
0
/*
===============
IN_ProcessEvents
===============
*/
static void IN_ProcessEvents( void )
{
	SDL_Event e;
	fakeAscii_t key = A_NULL;

	if( !SDL_WasInit( SDL_INIT_VIDEO ) )
			return;

	while( SDL_PollEvent( &e ) )
	{
		switch( e.type )
		{
			case SDL_KEYDOWN:
				if (e.key.keysym.scancode == SDL_SCANCODE_GRAVE) {
					Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL );
				} else {
					key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue );
					if ( key != A_NULL ) {
						fakeAscii_t upperKey = key;
						if (e.key.keysym.sym >= A_LOW_A && e.key.keysym.sym <= A_LOW_Z) {
							upperKey = (fakeAscii_t)(A_CAP_A + (e.key.keysym.sym - A_LOW_A));
						} else if (e.key.keysym.sym >= A_LOW_AGRAVE && e.key.keysym.sym <= A_LOW_THORN && e.key.keysym.sym != A_DIVIDE) {
							upperKey = (fakeAscii_t)(A_CAP_AGRAVE + (e.key.keysym.sym - A_LOW_AGRAVE));
						}

						Sys_QueEvent( 0, SE_KEY, upperKey, qtrue, 0, NULL );
					}

					if ( key == A_BACKSPACE )
						Sys_QueEvent( 0, SE_CHAR, CTRL('h'), qfalse, 0, NULL);
					else if ( kg.keys[A_CTRL].down && key >= 'a' && key <= 'z' )
						Sys_QueEvent( 0, SE_CHAR, CTRL(key), qfalse, 0, NULL );
				}
				break;

			case SDL_KEYUP:
				if (e.key.keysym.scancode == SDL_SCANCODE_GRAVE) {
					Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL );
				} else {
					key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse );
					if( key != A_NULL ) {
						fakeAscii_t upperKey = key;
						if (e.key.keysym.sym >= A_LOW_A && e.key.keysym.sym <= A_LOW_Z) {
							upperKey = (fakeAscii_t)(A_CAP_A + (e.key.keysym.sym - A_LOW_A));
						} else if (e.key.keysym.sym >= A_LOW_AGRAVE && e.key.keysym.sym <= A_LOW_THORN && e.key.keysym.sym != A_DIVIDE) {
							upperKey = (fakeAscii_t)(A_CAP_AGRAVE + (e.key.keysym.sym - A_LOW_AGRAVE));
						}

						Sys_QueEvent( 0, SE_KEY, upperKey, qfalse, 0, NULL );
					}
				}
				
				if ( ( e.key.keysym.scancode == SDL_SCANCODE_LGUI || e.key.keysym.scancode == SDL_SCANCODE_RGUI ) &&
					Cvar_VariableIntegerValue("r_fullscreen")) {
					SDL_MinimizeWindow(SDL_window);
				}
				
				break;

			case SDL_TEXTINPUT:
			{
					char *c = e.text.text;

					// Quick and dirty UTF-8 to UTF-32 conversion
					while( *c )
					{
						int utf32 = 0;

						if( ( *c & 0x80 ) == 0 )
							utf32 = *c++;
						else if( ( *c & 0xE0 ) == 0xC0 ) // 110x xxxx
						{
							utf32 |= ( *c++ & 0x1F ) << 6;
							utf32 |= ( *c++ & 0x3F );
						}
						else if( ( *c & 0xF0 ) == 0xE0 ) // 1110 xxxx
						{
							utf32 |= ( *c++ & 0x0F ) << 12;
							utf32 |= ( *c++ & 0x3F ) << 6;
							utf32 |= ( *c++ & 0x3F );
						}
						else if( ( *c & 0xF8 ) == 0xF0 ) // 1111 0xxx
						{
							utf32 |= ( *c++ & 0x07 ) << 18;
							utf32 |= ( *c++ & 0x3F ) << 12;
							utf32 |= ( *c++ & 0x3F ) << 6;
							utf32 |= ( *c++ & 0x3F );
						}
						else
						{
							Com_DPrintf( "Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c );
							c++;
						}

						if( utf32 != 0 )
						{
							Sys_QueEvent( 0, SE_CHAR, utf32, 0, 0, NULL );
						}
					}
					break;
			}
			case SDL_MOUSEMOTION:
				if( mouseActive )
					Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL );
				break;

			case SDL_MOUSEBUTTONDOWN:
			case SDL_MOUSEBUTTONUP:
				{
					unsigned short b;
					switch( e.button.button )
					{
						case SDL_BUTTON_LEFT:	b = A_MOUSE1;     break;
						case SDL_BUTTON_MIDDLE:	b = A_MOUSE3;     break;
						case SDL_BUTTON_RIGHT:	b = A_MOUSE2;     break;
						case SDL_BUTTON_X1:		b = A_MOUSE4;     break;
						case SDL_BUTTON_X2:		b = A_MOUSE5;     break;
						default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break;
					}
					Sys_QueEvent( 0, SE_KEY, b,
						( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL );
				}
				break;

			case SDL_MOUSEWHEEL:
				if( e.wheel.y > 0 )
				{
					Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL );
					Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL );
				}
				else
				{
					Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL );
					Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qfalse, 0, NULL );
				}
				break;

			case SDL_QUIT:
				Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n");
				break;

			case SDL_WINDOWEVENT:
				switch( e.window.event )
				{
					case SDL_WINDOWEVENT_MINIMIZED:    Cvar_SetValue( "com_minimized", 1 ); break;
					case SDL_WINDOWEVENT_RESTORED:
					case SDL_WINDOWEVENT_MAXIMIZED:    Cvar_SetValue( "com_minimized", 0 ); break;
					case SDL_WINDOWEVENT_FOCUS_LOST:
						Cvar_SetValue( "com_unfocused", 1 );
						S_MuteAllSounds(true);

						break;
					case SDL_WINDOWEVENT_FOCUS_GAINED:
						Cvar_SetValue( "com_unfocused", 0 );
						S_MuteAllSounds(false);

						break;
				}

			default:
				break;
		}
	}
}