/* =============== 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; }
/** * @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; }
/* =============== 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; }
/* =============== 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; }
/* =============== 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; }
/* =============== 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; }
/* * @brief translates SDL keyboard identifier to its Q3 counterpart */ static const char *IN_TranslateSDLToQ3Key(SDL_Keysym *keysym, keyNum_t *key, qboolean down) { static unsigned char buf[2] = { '\0', '\0' }; if (keysym->sym >= SDLK_SPACE && keysym->sym < SDLK_DELETE) { // These happen to match the ASCII chars *key = (int)keysym->sym; // SDL2 depreciates unicode... no shifted chars buf[0] = keysym->sym; if ( keysym->mod & (KMOD_RSHIFT | KMOD_LSHIFT) ) { if (keysym->sym >= 'a' && 'z' >= keysym->sym) buf[0] -= 0x20; else if (keysym->sym = 0x2d) buf[0] = 0x5f; // "-" to "_" } } else { buf[0] = 0; 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; buf[0] = 8; 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_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_SYSREQ: *key = K_SYSREQ; break; case SDLK_MENU: *key = K_MENU; break; case SDLK_UNDO: *key = K_UNDO; break; case SDLK_CAPSLOCK: *key = K_CAPSLOCK; break; default: *key = 0; break; } } if (in_keyboardDebug->integer) { IN_PrintKey(keysym, *key, down); } return (char *)buf; }
/** * @brief Handle input events like keys presses and joystick movement as well * as window events * @sa CL_Frame * @sa IN_Parse * @sa IN_JoystickMove */ void IN_Frame (void) { int mouse_buttonstate; unsigned short unicode; unsigned int key; SDL_Event event; IN_Parse(); IN_JoystickMove(); if (vid_grabmouse->modified) { vid_grabmouse->modified = qfalse; if (!vid_grabmouse->integer) { /* ungrab the pointer */ Com_Printf("Switch grab input off\n"); SDL_WM_GrabInput(SDL_GRAB_OFF); /* don't allow grabbing the input in fullscreen mode */ } else if (!vid_fullscreen->integer) { /* grab the pointer */ Com_Printf("Switch grab input on\n"); SDL_WM_GrabInput(SDL_GRAB_ON); } else { Com_Printf("No input grabbing in fullscreen mode\n"); Cvar_SetValue("vid_grabmouse", 0); } } oldMousePosX = mousePosX; oldMousePosY = mousePosY; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: switch (event.button.button) { case SDL_BUTTON_LEFT: mouse_buttonstate = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: mouse_buttonstate = K_MOUSE3; break; case SDL_BUTTON_RIGHT: mouse_buttonstate = K_MOUSE2; break; case SDL_BUTTON_WHEELUP: mouse_buttonstate = K_MWHEELUP; break; case SDL_BUTTON_WHEELDOWN: mouse_buttonstate = K_MWHEELDOWN; break; case 6: mouse_buttonstate = K_MOUSE4; break; case 7: mouse_buttonstate = K_MOUSE5; break; default: mouse_buttonstate = K_AUX1 + (event.button.button - 8) % 16; break; } IN_EventEnqueue(mouse_buttonstate, 0, (event.type == SDL_MOUSEBUTTONDOWN)); break; case SDL_MOUSEMOTION: SDL_GetMouseState(&mousePosX, &mousePosY); mousePosX /= viddef.rx; mousePosY /= viddef.ry; break; case SDL_KEYDOWN: IN_PrintKey(&event, 1); #ifndef _WIN32 if ((event.key.keysym.mod & KMOD_ALT) && event.key.keysym.sym == SDLK_RETURN) { SDL_Surface *surface = SDL_GetVideoSurface(); if (!SDL_WM_ToggleFullScreen(surface)) { int flags = surface->flags ^= SDL_FULLSCREEN; SDL_SetVideoMode(surface->w, surface->h, 0, flags); } if (surface->flags & SDL_FULLSCREEN) { Cvar_SetValue("vid_fullscreen", 1); /* make sure, that input grab is deactivated in fullscreen mode */ Cvar_SetValue("vid_grabmouse", 0); } else { Cvar_SetValue("vid_fullscreen", 0); } vid_fullscreen->modified = qfalse; /* we just changed it with SDL. */ break; /* ignore this key */ } #endif if ((event.key.keysym.mod & KMOD_CTRL) && event.key.keysym.sym == SDLK_g) { SDL_GrabMode gm = SDL_WM_GrabInput(SDL_GRAB_QUERY); Cvar_SetValue("vid_grabmouse", (gm == SDL_GRAB_ON) ? 0 : 1); break; /* ignore this key */ } /* console key is hardcoded, so the user can never unbind it */ if ((event.key.keysym.mod & KMOD_SHIFT) && event.key.keysym.sym == SDLK_ESCAPE) { Con_ToggleConsole_f(); break; } IN_TranslateKey(&event.key.keysym, &key, &unicode); IN_EventEnqueue(key, unicode, qtrue); break; case SDL_VIDEOEXPOSE: break; case SDL_KEYUP: IN_PrintKey(&event, 0); IN_TranslateKey(&event.key.keysym, &key, &unicode); IN_EventEnqueue(key, unicode, qfalse); break; case SDL_ACTIVEEVENT: /* make sure menu no more capture input when the game window lose the focus */ if (event.active.state == SDL_APPINPUTFOCUS && event.active.gain == 0) UI_ReleaseInput(); break; case SDL_QUIT: Cmd_ExecuteString("quit"); break; case SDL_VIDEORESIZE: /* make sure that SDL_SetVideoMode is called again after we changed the size * otherwise the mouse will make problems */ vid_mode->modified = qtrue; break; } } }
/* =============== 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) { 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 ); return key; }