void Q3E_KeyEvent(int state,int key,int character)
{
    int t = Sys_Milliseconds();
    if ((state==1)&&(IN_IsConsoleKey(key,character)))
    {
	Com_QueueEvent(t, SE_KEY, K_CONSOLE, state, 0, NULL);
	return;
    }
    if (key!=0)
    {
    Com_QueueEvent(t, SE_KEY, key, state, 0, NULL);
    Com_DPrintf("SE_KEY key=%d state=%d\n", key, state);
    }
    if ((state==1)&&(character!=0))
    {
        Com_DPrintf("SE_CHAR key=%d state=%d\n", character, state);
        Com_QueueEvent(t, SE_CHAR, character, 0, 0, NULL);
    }
}
Esempio n. 2
0
/**
 * @brief translates SDL keyboard identifier to its Q3 counterpart
 */
static keyNum_t IN_TranslateSDLToQ3Key(SDL_Keysym *keysym, qboolean down)
{
	keyNum_t key = 0;

	if (keysym->sym >= SDLK_SPACE && keysym->sym < SDLK_DELETE)
	{
		// These happen to match the ASCII chars
		key = (int)keysym->sym;
	}
	else
	{
/*
        // FIXME/SDL2 BUG/FEATUTE NUM keyboard state
        // https://forums.libsdl.org/viewtopic.php?p=43816&sid=b2ff6e037c85e6a80c6c506035668246
        // currently SDL2 only sets NUM keyboard status when key is pressed and expects NUM disabled at start
        // see SDL_SendKeyboardKey in SDL_Keyboard.c
        // notes:
        // - SDL_SCANCODE_NUMLOCKCLEAR does the job
        // - clarify APPLE clear key
        if (SDL_GetModState() & KMOD_NUM)
        {
            Com_Printf("NUM LED on\n");
        }
        else
        {
            Com_Printf("NUM LED off\n");
        }
*/

		switch (keysym->sym)
		{
		// keypad
		case SDLK_KP_0:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_INS;
			}
			break;
		case SDLK_KP_1:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_END;
			}
			break;
		case SDLK_KP_2:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_DOWNARROW;
			}
			break;
		case SDLK_KP_3:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_PGDN;
			}
			break;
		case SDLK_KP_4:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_LEFTARROW;
			}
			break;
		case SDLK_KP_5:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_5;
			}
			break;
		case SDLK_KP_6:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_RIGHTARROW;
			}
			break;
		case SDLK_KP_7:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_HOME;
			}
			break;
		case SDLK_KP_8:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_UPARROW;
			}
			break;
		case SDLK_KP_9:
			if (!(keysym->mod & KMOD_NUM))
			{
				key = K_KP_PGUP;
			}
			break;
		case SDLK_KP_ENTER:     key = K_KP_ENTER;
			break;
		case SDLK_KP_PERIOD:    key = K_KP_DEL;
			break;
		case SDLK_KP_MULTIPLY:  key = K_KP_STAR;
			break;
		case SDLK_KP_PLUS:      key = K_KP_PLUS;
			break;
		case SDLK_KP_MINUS:     key = K_KP_MINUS;
			break;
		case SDLK_KP_DIVIDE:    key = K_KP_SLASH;
			break;

		case SDLK_PAGEUP:       key = K_PGUP;
			break;
		case SDLK_PAGEDOWN:     key = K_PGDN;
			break;
		case SDLK_HOME:         key = K_HOME;
			break;
		case SDLK_END:          key = K_END;
			break;
		case SDLK_LEFT:         key = K_LEFTARROW;
			break;
		case SDLK_RIGHT:        key = K_RIGHTARROW;
			break;
		case SDLK_DOWN:         key = K_DOWNARROW;
			break;
		case SDLK_UP:           key = K_UPARROW;
			break;
		case SDLK_ESCAPE:       key = K_ESCAPE;
			break;
		case SDLK_RETURN:       key = K_ENTER;
			break;
		case SDLK_TAB:          key = K_TAB;
			break;
		case SDLK_F1:           key = K_F1;
			break;
		case SDLK_F2:           key = K_F2;
			break;
		case SDLK_F3:           key = K_F3;
			break;
		case SDLK_F4:           key = K_F4;
			break;
		case SDLK_F5:           key = K_F5;
			break;
		case SDLK_F6:           key = K_F6;
			break;
		case SDLK_F7:           key = K_F7;
			break;
		case SDLK_F8:           key = K_F8;
			break;
		case SDLK_F9:           key = K_F9;
			break;
		case SDLK_F10:          key = K_F10;
			break;
		case SDLK_F11:          key = K_F11;
			break;
		case SDLK_F12:          key = K_F12;
			break;
		case SDLK_F13:          key = K_F13;
			break;
		case SDLK_F14:          key = K_F14;
			break;
		case SDLK_F15:          key = K_F15;
			break;
		case SDLK_BACKSPACE:    key = K_BACKSPACE;
			break;

		case SDLK_DELETE:       key = K_DEL;
			break;
		case SDLK_PAUSE:        key = K_PAUSE;
			break; // FIXME: SDL 2.0 maps PAUSE to PAUSE as well as BREAK
		// (key = K_BREAK;         break;)
		case SDLK_LSHIFT:
		case SDLK_RSHIFT:       key = K_SHIFT;
			break;
		case SDLK_LCTRL:
		case SDLK_RCTRL:        key = K_CTRL;
			break;

#ifdef __APPLE__
		case SDLK_RGUI:
		case SDLK_LGUI:         key = K_COMMAND;
			break;
#else
		case SDLK_RGUI:
		case SDLK_LGUI:         key = K_SUPER;
			break;
#endif

		case SDLK_RALT:
		case SDLK_LALT:         key = K_ALT;
			break;

		case SDLK_INSERT:       key = K_INS;
			break;

		case SDLK_MODE:         key = K_MODE;
			break;
		case SDLK_APPLICATION:  key = K_COMPOSE;     // map to K_MENU ?
			break;
		case SDLK_HELP:         key = K_HELP;
			break;
		case SDLK_PRINTSCREEN:  key = K_PRINT;
			break;
		case SDLK_SYSREQ:       key = K_SYSREQ;
			break;
		case SDLK_MENU:         key = K_MENU;
			break;
		case SDLK_POWER:        key = K_POWER;
			break;
		case SDLK_CURRENCYUNIT: key = K_EURO;
			break;
		case SDLK_UNDO:         key = K_UNDO;
			break;
		case SDLK_SCROLLLOCK:   key = K_SCROLLOCK;
			break;
		case SDLK_NUMLOCKCLEAR: key = K_KP_NUMLOCK;
			break;
		case SDLK_CAPSLOCK:     key = K_CAPSLOCK;
			break;

		default:
			// physical key mapped to a non-ascii character
			switch (keysym->scancode)
			{
			case SDL_SCANCODE_1: key = K_1;
				break;
			case SDL_SCANCODE_2: key = K_2;
				break;
			case SDL_SCANCODE_3: key = K_3;
				break;
			case SDL_SCANCODE_4: key = K_4;
				break;
			case SDL_SCANCODE_5: key = K_5;
				break;
			case SDL_SCANCODE_6: key = K_6;
				break;
			case SDL_SCANCODE_7: key = K_7;
				break;
			case SDL_SCANCODE_8: key = K_8;
				break;
			case SDL_SCANCODE_9: key = K_9;
				break;
			case SDL_SCANCODE_0: key = K_0;
				break;

			case SDL_SCANCODE_MINUS: key = K_MINUS;
				break;
			case SDL_SCANCODE_EQUALS: key = K_EQUALS;
				break;
			case SDL_SCANCODE_LEFTBRACKET: key = K_LEFTBRACKET;
				break;
			case SDL_SCANCODE_RIGHTBRACKET: key = K_RIGHTBRACKET;
				break;
			case SDL_SCANCODE_BACKSLASH: key = K_BACKSLASH;
				break;
			case SDL_SCANCODE_SEMICOLON: key = K_SEMICOLON;
				break;
			case SDL_SCANCODE_APOSTROPHE: key = K_APOSTROPHE;
				break;
			case SDL_SCANCODE_GRAVE: key = K_GRAVE;              // NOTE: this is console toogle key!
				break;
			case SDL_SCANCODE_COMMA: key = K_COMMA;
				break;
			case SDL_SCANCODE_PERIOD: key = K_PERIOD;
				break;
			case SDL_SCANCODE_SLASH: key = K_SLASH;
				break;
			case SDL_SCANCODE_NONUSBACKSLASH: key = K_NONUSBACKSLASH;
				break;

			default:
				break;
			}
			break;
		}
	}

	if (in_keyboardDebug->integer)
	{
		IN_PrintKey(keysym, key, down);
	}

	if (IN_IsConsoleKey(key, 0))
	{
		// Console keys can't be bound or generate characters
		key = K_CONSOLE;
	}

	return key;
}
Esempio n. 3
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;
		}
	}
}
Esempio n. 4
0
/*
===============
IN_TranslateSDLToQ3Key
===============
*/
static const char *IN_TranslateSDLToQ3Key( SDL_keysym *keysym,
	keyNum_t *key, qboolean down )
{
	static unsigned char buf[ 2 ] = { '\0', '\0' };

	*buf = '\0';
	*key = 0;

	if( keysym->sym >= SDLK_SPACE && keysym->sym < SDLK_DELETE )
	{
		// These happen to match the ASCII chars
		*key = (int)keysym->sym;
	}
	else
	{
		switch( keysym->sym )
		{
			case SDLK_PAGEUP:       *key = K_PGUP;          break;
			case SDLK_KP9:          *key = K_KP_PGUP;       break;
			case SDLK_PAGEDOWN:     *key = K_PGDN;          break;
			case SDLK_KP3:          *key = K_KP_PGDN;       break;
			case SDLK_KP7:          *key = K_KP_HOME;       break;
			case SDLK_HOME:         *key = K_HOME;          break;
			case SDLK_KP1:          *key = K_KP_END;        break;
			case SDLK_END:          *key = K_END;           break;
			case SDLK_KP4:          *key = K_KP_LEFTARROW;  break;
			case SDLK_LEFT:         *key = K_LEFTARROW;     break;
			case SDLK_KP6:          *key = K_KP_RIGHTARROW; break;
			case SDLK_RIGHT:        *key = K_RIGHTARROW;    break;
			case SDLK_KP2:          *key = K_KP_DOWNARROW;  break;
			case SDLK_DOWN:         *key = K_DOWNARROW;     break;
			case SDLK_KP8:          *key = K_KP_UPARROW;    break;
			case SDLK_UP:           *key = K_UPARROW;       break;
			case SDLK_ESCAPE:       *key = K_ESCAPE;        break;
			case SDLK_KP_ENTER:     *key = K_KP_ENTER;      break;
			case SDLK_RETURN:       *key = K_ENTER;         break;
			case SDLK_TAB:          *key = K_TAB;           break;
			case SDLK_F1:           *key = K_F1;            break;
			case SDLK_F2:           *key = K_F2;            break;
			case SDLK_F3:           *key = K_F3;            break;
			case SDLK_F4:           *key = K_F4;            break;
			case SDLK_F5:           *key = K_F5;            break;
			case SDLK_F6:           *key = K_F6;            break;
			case SDLK_F7:           *key = K_F7;            break;
			case SDLK_F8:           *key = K_F8;            break;
			case SDLK_F9:           *key = K_F9;            break;
			case SDLK_F10:          *key = K_F10;           break;
			case SDLK_F11:          *key = K_F11;           break;
			case SDLK_F12:          *key = K_F12;           break;
			case SDLK_F13:          *key = K_F13;           break;
			case SDLK_F14:          *key = K_F14;           break;
			case SDLK_F15:          *key = K_F15;           break;

			case SDLK_BACKSPACE:    *key = K_BACKSPACE;     break;
			case SDLK_KP_PERIOD:    *key = K_KP_DEL;        break;
			case SDLK_DELETE:       *key = K_DEL;           break;
			case SDLK_PAUSE:        *key = K_PAUSE;         break;

			case SDLK_LSHIFT:
			case SDLK_RSHIFT:       *key = K_SHIFT;         break;

			case SDLK_LCTRL:
			case SDLK_RCTRL:        *key = K_CTRL;          break;

			case SDLK_RMETA:
			case SDLK_LMETA:        *key = K_COMMAND;       break;

			case SDLK_RALT:
			case SDLK_LALT:         *key = K_ALT;           break;

			case SDLK_LSUPER:
			case SDLK_RSUPER:       *key = K_SUPER;         break;

			case SDLK_KP5:          *key = K_KP_5;          break;
			case SDLK_INSERT:       *key = K_INS;           break;
			case SDLK_KP0:          *key = K_KP_INS;        break;
			case SDLK_KP_MULTIPLY:  *key = K_KP_STAR;       break;
			case SDLK_KP_PLUS:      *key = K_KP_PLUS;       break;
			case SDLK_KP_MINUS:     *key = K_KP_MINUS;      break;
			case SDLK_KP_DIVIDE:    *key = K_KP_SLASH;      break;

			case SDLK_MODE:         *key = K_MODE;          break;
			case SDLK_COMPOSE:      *key = K_COMPOSE;       break;
			case SDLK_HELP:         *key = K_HELP;          break;
			case SDLK_PRINT:        *key = K_PRINT;         break;
			case SDLK_SYSREQ:       *key = K_SYSREQ;        break;
			case SDLK_BREAK:        *key = K_BREAK;         break;
			case SDLK_MENU:         *key = K_MENU;          break;
			case SDLK_POWER:        *key = K_POWER;         break;
			case SDLK_EURO:         *key = K_EURO;          break;
			case SDLK_UNDO:         *key = K_UNDO;          break;
			case SDLK_SCROLLOCK:    *key = K_SCROLLOCK;     break;
			case SDLK_NUMLOCK:      *key = K_KP_NUMLOCK;    break;
			case SDLK_CAPSLOCK:     *key = K_CAPSLOCK;      break;

			default:
				if( keysym->sym >= SDLK_WORLD_0 && keysym->sym <= SDLK_WORLD_95 )
					*key = ( keysym->sym - SDLK_WORLD_0 ) + K_WORLD_0;
				break;
		}
	}

	if( down && keysym->unicode && !( keysym->unicode & 0xFF00 ) )
	{
		unsigned char ch = (unsigned char)keysym->unicode & 0xFF;

		switch( ch )
		{
			case 127: // ASCII delete
				if( *key != K_DEL )
				{
					// ctrl-h
					*buf = CTRL('h');
					break;
				}
				// fallthrough

			default: *buf = ch; break;
		}
	}

	if( in_keyboardDebug->integer )
		IN_PrintKey( keysym, *key, down );

	// Keys that have ASCII names but produce no character are probably
	// dead keys -- ignore them
	if( down && strlen( Key_KeynumToString( *key ) ) == 1 &&
		keysym->unicode == 0 )
	{
		if( in_keyboardDebug->integer )
			Com_Printf( "  Ignored dead key '%c'\n", *key );

		*key = 0;
	}

	if( IN_IsConsoleKey( *key, *buf ) )
	{
		// Console keys can't be bound or generate characters
		*key = K_CONSOLE;
		*buf = '\0';
	}

	// Don't allow extended ASCII to generate characters
	if( *buf & 0x80 )
		*buf = '\0';

	return (char *)buf;
}
Esempio n. 5
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;
        }
    }
}
Esempio n. 6
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;
		}
	}
}
Esempio n. 7
0
/*
===============
IN_TranslateSDLToQ3Key
===============
*/
static keyNum_t IN_TranslateSDLToQ3Key( SDL_Keysym *keysym, qboolean down )
{
    keyNum_t key = 0;

    if( keysym->sym >= SDLK_SPACE && keysym->sym < SDLK_DELETE )
    {
        // These happen to match the ASCII chars
        key = (int)keysym->sym;
    }
    else
    {
        switch( keysym->sym )
        {
        case SDLK_PAGEUP:
            key = K_PGUP;
            break;
        case SDLK_KP_9:
            key = K_KP_PGUP;
            break;
        case SDLK_PAGEDOWN:
            key = K_PGDN;
            break;
        case SDLK_KP_3:
            key = K_KP_PGDN;
            break;
        case SDLK_KP_7:
            key = K_KP_HOME;
            break;
        case SDLK_HOME:
            key = K_HOME;
            break;
        case SDLK_KP_1:
            key = K_KP_END;
            break;
        case SDLK_END:
            key = K_END;
            break;
        case SDLK_KP_4:
            key = K_KP_LEFTARROW;
            break;
        case SDLK_LEFT:
            key = K_LEFTARROW;
            break;
        case SDLK_KP_6:
            key = K_KP_RIGHTARROW;
            break;
        case SDLK_RIGHT:
            key = K_RIGHTARROW;
            break;
        case SDLK_KP_2:
            key = K_KP_DOWNARROW;
            break;
        case SDLK_DOWN:
            key = K_DOWNARROW;
            break;
        case SDLK_KP_8:
            key = K_KP_UPARROW;
            break;
        case SDLK_UP:
            key = K_UPARROW;
            break;
        case SDLK_ESCAPE:
            key = K_ESCAPE;
            break;
        case SDLK_KP_ENTER:
            key = K_KP_ENTER;
            break;
        case SDLK_RETURN:
            key = K_ENTER;
            break;
        case SDLK_TAB:
            key = K_TAB;
            break;
        case SDLK_F1:
            key = K_F1;
            break;
        case SDLK_F2:
            key = K_F2;
            break;
        case SDLK_F3:
            key = K_F3;
            break;
        case SDLK_F4:
            key = K_F4;
            break;
        case SDLK_F5:
            key = K_F5;
            break;
        case SDLK_F6:
            key = K_F6;
            break;
        case SDLK_F7:
            key = K_F7;
            break;
        case SDLK_F8:
            key = K_F8;
            break;
        case SDLK_F9:
            key = K_F9;
            break;
        case SDLK_F10:
            key = K_F10;
            break;
        case SDLK_F11:
            key = K_F11;
            break;
        case SDLK_F12:
            key = K_F12;
            break;
        case SDLK_F13:
            key = K_F13;
            break;
        case SDLK_F14:
            key = K_F14;
            break;
        case SDLK_F15:
            key = K_F15;
            break;

        case SDLK_BACKSPACE:
            key = K_BACKSPACE;
            break;
        case SDLK_KP_PERIOD:
            key = K_KP_DEL;
            break;
        case SDLK_DELETE:
            key = K_DEL;
            break;
        case SDLK_PAUSE:
            key = K_PAUSE;
            break;

        case SDLK_LSHIFT:
        case SDLK_RSHIFT:
            key = K_SHIFT;
            break;

        case SDLK_LCTRL:
        case SDLK_RCTRL:
            key = K_CTRL;
            break;

#ifdef MACOS_X
        case SDLK_RGUI:
        case SDLK_LGUI:
            key = K_COMMAND;
            break;
#else
        case SDLK_RGUI:
        case SDLK_LGUI:
            key = K_SUPER;
            break;
#endif

        case SDLK_RALT:
        case SDLK_LALT:
            key = K_ALT;
            break;

        case SDLK_KP_5:
            key = K_KP_5;
            break;
        case SDLK_INSERT:
            key = K_INS;
            break;
        case SDLK_KP_0:
            key = K_KP_INS;
            break;
        case SDLK_KP_MULTIPLY:
            key = K_KP_STAR;
            break;
        case SDLK_KP_PLUS:
            key = K_KP_PLUS;
            break;
        case SDLK_KP_MINUS:
            key = K_KP_MINUS;
            break;
        case SDLK_KP_DIVIDE:
            key = K_KP_SLASH;
            break;

        case SDLK_MODE:
            key = K_MODE;
            break;
        case SDLK_HELP:
            key = K_HELP;
            break;
        case SDLK_PRINTSCREEN:
            key = K_PRINT;
            break;
        case SDLK_SYSREQ:
            key = K_SYSREQ;
            break;
        case SDLK_MENU:
            key = K_MENU;
            break;
        case SDLK_APPLICATION:
            key = K_MENU;
            break;
        case SDLK_POWER:
            key = K_POWER;
            break;
        case SDLK_UNDO:
            key = K_UNDO;
            break;
        case SDLK_SCROLLLOCK:
            key = K_SCROLLOCK;
            break;
        case SDLK_NUMLOCKCLEAR:
            key = K_KP_NUMLOCK;
            break;
        case SDLK_CAPSLOCK:
            key = K_CAPSLOCK;
            break;

        default:
            break;
        }
    }

    if( in_keyboardDebug->integer )
        IN_PrintKey( keysym, key, down );

    if( IN_IsConsoleKey( key, 0 ) )
    {
        // Console keys can't be bound or generate characters
        key = K_CONSOLE;
    }

    return key;
}
Esempio n. 8
0
/*
===============
IN_TranslateSDLToJKKey
===============
*/
static const char *IN_TranslateSDLToJKKey( SDL_Keysym *keysym, fakeAscii_t *key, qboolean down )
{
	static unsigned char buf[ 2 ] = { '\0', '\0' };

	*buf = '\0';
	*key = A_NULL;

	if( keysym->sym >= SDLK_SPACE && keysym->sym < SDLK_DELETE )
	{
		// These happen to match the ASCII chars
		*key = (fakeAscii_t)keysym->sym;
	}
	else
	{
		switch( keysym->sym )
		{
			case SDLK_PAGEUP:       *key = A_PAGE_UP;       break;
			case SDLK_KP_9:         *key = A_KP_9;          break;
			case SDLK_PAGEDOWN:     *key = A_PAGE_DOWN;     break;
			case SDLK_KP_3:         *key = A_KP_3;          break;
			case SDLK_KP_7:         *key = A_KP_7;          break;
			case SDLK_HOME:         *key = A_HOME;          break;
			case SDLK_KP_1:         *key = A_KP_1;          break;
			case SDLK_END:          *key = A_END;           break;
			case SDLK_KP_4:         *key = A_KP_4;          break;
			case SDLK_LEFT:         *key = A_CURSOR_LEFT;   break;
			case SDLK_KP_6:         *key = A_KP_6;          break;
			case SDLK_RIGHT:        *key = A_CURSOR_RIGHT;  break;
			case SDLK_KP_2:         *key = A_KP_2;          break;
			case SDLK_DOWN:         *key = A_CURSOR_DOWN;   break;
			case SDLK_KP_8:         *key = A_KP_8;          break;
			case SDLK_UP:           *key = A_CURSOR_UP;     break;
			case SDLK_ESCAPE:       *key = A_ESCAPE;        break;
			case SDLK_KP_ENTER:     *key = A_KP_ENTER;      break;
			case SDLK_RETURN:       *key = A_ENTER;         break;
			case SDLK_TAB:          *key = A_TAB;           break;
			case SDLK_F1:           *key = A_F1;            break;
			case SDLK_F2:           *key = A_F2;            break;
			case SDLK_F3:           *key = A_F3;            break;
			case SDLK_F4:           *key = A_F4;            break;
			case SDLK_F5:           *key = A_F5;            break;
			case SDLK_F6:           *key = A_F6;            break;
			case SDLK_F7:           *key = A_F7;            break;
			case SDLK_F8:           *key = A_F8;            break;
			case SDLK_F9:           *key = A_F9;            break;
			case SDLK_F10:          *key = A_F10;           break;
			case SDLK_F11:          *key = A_F11;           break;
			case SDLK_F12:          *key = A_F12;           break;

			case SDLK_BACKSPACE:    *key = A_BACKSPACE;     break;
			case SDLK_KP_PERIOD:    *key = A_KP_PERIOD;     break;
			case SDLK_DELETE:       *key = A_DELETE;        break;
			case SDLK_PAUSE:        *key = A_PAUSE;         break;

			case SDLK_LSHIFT:
			case SDLK_RSHIFT:       *key = A_SHIFT;         break;

			case SDLK_LCTRL:
			case SDLK_RCTRL:        *key = A_CTRL;          break;

			case SDLK_RALT:
			case SDLK_LALT:         *key = A_ALT;           break;

			case SDLK_KP_5:         *key = A_KP_5;          break;
			case SDLK_INSERT:       *key = A_INSERT;        break;
			case SDLK_KP_0:         *key = A_KP_0;          break;
			case SDLK_KP_MULTIPLY:  *key = A_STAR;          break;
			case SDLK_KP_PLUS:      *key = A_KP_PLUS;       break;
			case SDLK_KP_MINUS:     *key = A_KP_MINUS;      break;
			case SDLK_KP_DIVIDE:    *key = A_FORWARD_SLASH; break;

			case SDLK_SCROLLLOCK:   *key = A_SCROLLLOCK;    break;
			case SDLK_NUMLOCKCLEAR: *key = A_NUMLOCK;       break;
			case SDLK_CAPSLOCK:     *key = A_CAPSLOCK;      break;

			default:
				break;
		}
	}

	if( in_keyboardDebug->integer )
		IN_PrintKey( keysym, *key, down );

	if( *key == A_BACKSPACE )
		*buf = '\b'; // Full-hack ahead!

	if( IN_IsConsoleKey( *key, 0 ) )
	{
		// Console keys can't be bound or generate characters
		*key = A_CONSOLE;
		*buf = '\0';
	}

	return (const char *)buf;
}
Esempio n. 9
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;
		}
	}
}
Esempio n. 10
0
/*
===============
IN_TranslateSDLToJKKey
===============
*/
static fakeAscii_t IN_TranslateSDLToJKKey( SDL_Keysym *keysym, qboolean down ) {
	fakeAscii_t key = A_NULL;

	if( keysym->sym >= SDLK_SPACE && keysym->sym < SDLK_DELETE )
	{
		// These happen to match the ASCII chars
		key = (fakeAscii_t)keysym->sym;
	}
	else
	{
		IN_TranslateNumpad( keysym, &key );

		switch( keysym->sym )
		{
			case SDLK_PAGEUP:       key = A_PAGE_UP;       break;
			case SDLK_KP_9:         key = A_KP_9;          break;
			case SDLK_PAGEDOWN:     key = A_PAGE_DOWN;     break;
			case SDLK_KP_3:         key = A_KP_3;          break;
			case SDLK_KP_7:         key = A_KP_7;          break;
			case SDLK_HOME:         key = A_HOME;          break;
			case SDLK_KP_1:         key = A_KP_1;          break;
			case SDLK_END:          key = A_END;           break;
			case SDLK_KP_4:         key = A_KP_4;          break;
			case SDLK_LEFT:         key = A_CURSOR_LEFT;   break;
			case SDLK_KP_6:         key = A_KP_6;          break;
			case SDLK_RIGHT:        key = A_CURSOR_RIGHT;  break;
			case SDLK_KP_2:         key = A_KP_2;          break;
			case SDLK_DOWN:         key = A_CURSOR_DOWN;   break;
			case SDLK_KP_8:         key = A_KP_8;          break;
			case SDLK_UP:           key = A_CURSOR_UP;     break;
			case SDLK_ESCAPE:       key = A_ESCAPE;        break;
			case SDLK_KP_ENTER:     key = A_KP_ENTER;      break;
			case SDLK_RETURN:       key = A_ENTER;         break;
			case SDLK_TAB:          key = A_TAB;           break;
			case SDLK_F1:           key = A_F1;            break;
			case SDLK_F2:           key = A_F2;            break;
			case SDLK_F3:           key = A_F3;            break;
			case SDLK_F4:           key = A_F4;            break;
			case SDLK_F5:           key = A_F5;            break;
			case SDLK_F6:           key = A_F6;            break;
			case SDLK_F7:           key = A_F7;            break;
			case SDLK_F8:           key = A_F8;            break;
			case SDLK_F9:           key = A_F9;            break;
			case SDLK_F10:          key = A_F10;           break;
			case SDLK_F11:          key = A_F11;           break;
			case SDLK_F12:          key = A_F12;           break;

			case SDLK_BACKSPACE:    key = A_BACKSPACE;     break;
			case SDLK_KP_PERIOD:    key = A_KP_PERIOD;     break;
			case SDLK_DELETE:       key = A_DELETE;        break;
			case SDLK_PAUSE:        key = A_PAUSE;         break;

			case SDLK_LSHIFT:
			case SDLK_RSHIFT:       key = A_SHIFT;         break;

			case SDLK_LCTRL:
			case SDLK_RCTRL:        key = A_CTRL;          break;

			case SDLK_RALT:
			case SDLK_LALT:         key = A_ALT;           break;

			case SDLK_KP_5:         key = A_KP_5;          break;
			case SDLK_INSERT:       key = A_INSERT;        break;
			case SDLK_KP_0:         key = A_KP_0;          break;
			case SDLK_KP_MULTIPLY:  key = A_STAR;          break;
			case SDLK_KP_PLUS:      key = A_KP_PLUS;       break;
			case SDLK_KP_MINUS:     key = A_KP_MINUS;      break;
			case SDLK_KP_DIVIDE:    key = A_FORWARD_SLASH; break;

			case SDLK_SCROLLLOCK:   key = A_SCROLLLOCK;    break;
			case SDLK_NUMLOCKCLEAR: key = A_NUMLOCK;       break;
			case SDLK_CAPSLOCK:     key = A_CAPSLOCK;      break;

			case L'\u00D7':			key = A_MULTIPLY;		break;
			case L'\u00E0':			key = A_LOW_AGRAVE;		break;
			case L'\u00E1':			key = A_LOW_AACUTE;		break;
			case L'\u00E2':			key = A_LOW_ACIRCUMFLEX; break;
			case L'\u00E3':			key = A_LOW_ATILDE;		break;
			case L'\u00E4':			key = A_LOW_ADIERESIS;	break;
			case L'\u00E5':			key = A_LOW_ARING;		break;
			case L'\u00E6':			key = A_LOW_AE;			break;
			case L'\u00E7':			key = A_LOW_CCEDILLA;	break;
			case L'\u00E8':			key = A_LOW_EGRAVE;		break;
			case L'\u00E9':			key = A_LOW_EACUTE;		break;
			case L'\u00EA':			key = A_LOW_ECIRCUMFLEX; break;
			case L'\u00EB':			key = A_LOW_EDIERESIS;	break;
			case L'\u00EC':			key = A_LOW_IGRAVE;		break;
			case L'\u00ED':			key = A_LOW_IACUTE;		break;
			case L'\u00EE':			key = A_LOW_ICIRCUMFLEX; break;
			case L'\u00EF':			key = A_LOW_IDIERESIS;	break;
			case L'\u00F0':			key = A_LOW_ETH;		break;
			case L'\u00F1':			key = A_LOW_NTILDE;		break;
			case L'\u00F2':			key = A_LOW_OGRAVE;		break;
			case L'\u00F3':			key = A_LOW_OACUTE;		break;
			case L'\u00F4':			key = A_LOW_OCIRCUMFLEX; break;
			case L'\u00F5':			key = A_LOW_OTILDE;		break;
			case L'\u00F6':			key = A_LOW_ODIERESIS;	break;
			case L'\u00F7':			key = A_DIVIDE;			break;
			case L'\u00F8':			key = A_LOW_OSLASH;		break;
			case L'\u00F9':			key = A_LOW_UGRAVE;		break;
			case L'\u00FA':			key = A_LOW_UACUTE;		break;
			case L'\u00FB':			key = A_LOW_UCIRCUMFLEX; break;
			case L'\u00FC':			key = A_LOW_UDIERESIS;	break;
			case L'\u00FD':			key = A_LOW_YACUTE;		break;
			case L'\u00FE':			key = A_LOW_THORN;		break;
			case L'\u00FF':			key = A_LOW_YDIERESIS;	break;

			default:
				break;
		}
	}

	if( in_keyboardDebug->integer )
		IN_PrintKey( keysym, key, down );

	if( IN_IsConsoleKey( key, 0 ) )
	{
		// Console keys can't be bound or generate characters
		key = A_CONSOLE;
	}

	return key;
}
Esempio n. 11
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;
		}
	}
}
Esempio n. 12
0
/*
===============
IN_TranslateSDLToQ3Key
===============
*/
static fakeAscii_t IN_TranslateSDLToJKKey( SDL_Keysym *keysym, qboolean down )
{
	fakeAscii_t key = A_NULL;

	if( keysym->sym >= SDLK_BACKSPACE && keysym->sym < SDLK_DELETE )
	{
		// These happen to match the ASCII chars
		key = (fakeAscii_t)keysym->sym;
	}
	else
	{
		switch( keysym->sym )
		{
			case SDLK_PAGEUP:       key = A_PAGE_UP;          break;
			case SDLK_KP_9:         key = A_KP_9;       break;
			case SDLK_PAGEDOWN:     key = A_PAGE_DOWN;          break;
			case SDLK_KP_3:         key = A_KP_3;       break;
			case SDLK_KP_7:         key = A_KP_7;       break;
			case SDLK_HOME:         key = A_HOME;          break;
			case SDLK_KP_1:         key = A_KP_1;        break;
			case SDLK_END:          key = A_END;           break;
			case SDLK_KP_4:         key = A_KP_4;  break;
			case SDLK_LEFT:         key = A_CURSOR_LEFT;     break;
			case SDLK_KP_6:         key = A_KP_6;          break;
			case SDLK_RIGHT:        key = A_CURSOR_RIGHT;  break;
			case SDLK_KP_2:         key = A_KP_2;  		   break;
			case SDLK_DOWN:         key = A_CURSOR_DOWN;   break;
			case SDLK_KP_8:         key = A_KP_8;    	   break;
			case SDLK_UP:           key = A_CURSOR_UP;     break;
			case SDLK_ESCAPE:       key = A_ESCAPE;        break;
			case SDLK_KP_ENTER:     key = A_KP_ENTER;      break;
			case SDLK_RETURN:       key = A_ENTER;         break;
			case SDLK_TAB:          key = A_TAB;           break;
			case SDLK_F1:           key = A_F1;            break;
			case SDLK_F2:           key = A_F2;            break;
			case SDLK_F3:           key = A_F3;            break;
			case SDLK_F4:           key = A_F4;            break;
			case SDLK_F5:           key = A_F5;            break;
			case SDLK_F6:           key = A_F6;            break;
			case SDLK_F7:           key = A_F7;            break;
			case SDLK_F8:           key = A_F8;            break;
			case SDLK_F9:           key = A_F9;            break;
			case SDLK_F10:          key = A_F10;           break;
			case SDLK_F11:          key = A_F11;           break;
			case SDLK_F12:          key = A_F12;           break;
			/*case SDLK_F13:          key = A_F13;           break;
			case SDLK_F14:          key = A_F14;           break;
			case SDLK_F15:          key = A_F15;           break;*/

			case SDLK_BACKSPACE:    key = A_BACKSPACE;     break;
			case SDLK_KP_PERIOD:    key = A_KP_PERIOD;        break;
			case SDLK_DELETE:       key = A_DELETE;           break;
			case SDLK_PAUSE:        key = A_PAUSE;         break;

			case SDLK_LSHIFT:
			case SDLK_RSHIFT:       key = A_SHIFT;         break;

			case SDLK_LCTRL:
			case SDLK_RCTRL:        key = A_CTRL;          break;

			/*case SDLK_RGUI:
			case SDLK_LGUI:         key = A_COMMAND;       break;*/

			case SDLK_RALT:
			case SDLK_LALT:         key = A_ALT;           break;

			case SDLK_KP_5:         key = A_KP_5;          break;
			case SDLK_INSERT:       key = A_INSERT;           break;
			case SDLK_KP_0:         key = A_KP_0;        break;
			case SDLK_KP_MULTIPLY:  key = A_STAR;       break;
			case SDLK_KP_PLUS:      key = A_KP_PLUS;       break;
			case SDLK_KP_MINUS:     key = A_KP_MINUS;      break;
			case SDLK_KP_DIVIDE:    key = A_FORWARD_SLASH;      break;

			/*case SDLK_MODE:         key = A_MODE;          break;
			case SDLK_HELP:         key = A_HELP;          break;
			case SDLK_PRINTSCREEN:  key = A_PRINT;         break;
			case SDLK_SYSREQ:       key = A_SYSREQ;        break;
			case SDLK_MENU:         key = A_MENU;          break;
			case SDLK_POWER:        key = A_POWER;         break;
			case SDLK_UNDO:         key = A_UNDO;          break;*/
			case SDLK_SCROLLLOCK:   key = A_SCROLLLOCK;     break;
			case SDLK_CAPSLOCK:     key = A_CAPSLOCK;      break;

			default:
				break;
		}
	}

	if( in_keyboardDebug->integer )
		IN_PrintKey( keysym, key, down );

	if( IN_IsConsoleKey( key, 0 ) )
	{
		// Console keys can't be bound or generate characters
		key = A_CONSOLE;
	}

	return key;
}