コード例 #1
0
ファイル: sys_win32_con.c プロジェクト: belstgut/etlegacy
/*
==============
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);
}
コード例 #2
0
/*
===============
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;
        }
    }
}
コード例 #3
0
/*
===============
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;
}
コード例 #4
0
/*
===============
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;
		}
	}
}
コード例 #5
0
ファイル: sys_win32_con.cpp プロジェクト: TheDushan/OpenWolf
/*
==============
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 );
}
コード例 #6
0
ファイル: sdl_input.cpp プロジェクト: lmumar/Unvanquished
/*
===============
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;
		}
	}
}
コード例 #7
0
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);
}
コード例 #8
0
ファイル: sdl_input.c プロジェクト: GenaSG/etlegacy
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;
		}
	}
}
コード例 #9
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_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;
		}
	}
}
コード例 #10
0
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;
		}
	}
}
コード例 #11
0
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 );	
}
コード例 #12
0
ファイル: sdl_input.c プロジェクト: MrLoick/openarena-engine
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 );
	}
}
コード例 #13
0
ファイル: sdl_input.c プロジェクト: MrLoick/openarena-engine
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");
	}
}
コード例 #14
0
ファイル: sdl_input.c プロジェクト: 0culus/ioq3
/*
===============
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;
}
コード例 #15
0
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();
}
コード例 #16
0
ファイル: sdl_input.c プロジェクト: 0culus/ioq3
/*
===============
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;
		}
	}
}
コード例 #17
0
ファイル: sdl_input.c プロジェクト: firebombzero/etlegacy
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;
		}
	}
}