/*! * Handle keyboard events */ static void inputHandleKeyEvent(SDL_KeyboardEvent *keyEvent) { UDWORD code = 0, vk = 0; switch (keyEvent->type) { case SDL_KEYDOWN: switch (keyEvent->keysym.sym) { // our "editing" keys for text case SDLK_LEFT: vk = INPBUF_LEFT; break; case SDLK_RIGHT: vk = INPBUF_RIGHT; break; case SDLK_UP: vk = INPBUF_UP; break; case SDLK_DOWN: vk = INPBUF_DOWN; break; case SDLK_HOME: vk = INPBUF_HOME; break; case SDLK_END: vk = INPBUF_END; break; case SDLK_INSERT: vk = INPBUF_INS; break; case SDLK_DELETE: vk = INPBUF_DEL; break; case SDLK_PAGEUP: vk = INPBUF_PGUP; break; case SDLK_PAGEDOWN: vk = INPBUF_PGDN; break; case KEY_BACKSPACE: vk = INPBUF_BKSPACE; break; case KEY_TAB: vk = INPBUF_TAB; break; case KEY_RETURN: vk = INPBUF_CR; break; case KEY_ESC: vk = INPBUF_ESC; break; default: break; } // Keycodes without character representations are determined by their scancode bitwise OR-ed with 1<<30 (0x40000000). CurrentKey = keyEvent->keysym.sym; if (vk) { // Take care of 'editing' keys that were pressed inputAddBuffer(vk, 0); debug(LOG_INPUT, "Editing key: 0x%x, %d SDLkey=[%s] pressed", vk, vk, SDL_GetKeyName(CurrentKey)); } else { // add everything else inputAddBuffer(CurrentKey, 0); } debug(LOG_INPUT, "Key Code (pressed): 0x%x, %d, [%c] SDLkey=[%s]", CurrentKey, CurrentKey, (CurrentKey < 128) && (CurrentKey > 31) ? (char)CurrentKey : '?', SDL_GetKeyName(CurrentKey)); code = sdlKeyToKeyCode(CurrentKey); if (code >= KEY_MAXSCAN) { break; } if (aKeyState[code].state == KEY_UP || aKeyState[code].state == KEY_RELEASED || aKeyState[code].state == KEY_PRESSRELEASE) { // whether double key press or not aKeyState[code].state = KEY_PRESSED; aKeyState[code].lastdown = 0; } break; case SDL_KEYUP: code = keyEvent->keysym.sym; debug(LOG_INPUT, "Key Code (*Depressed*): 0x%x, %d, [%c] SDLkey=[%s]", code, code, (code < 128) && (code > 31) ? (char)code : '?', SDL_GetKeyName(code)); code = sdlKeyToKeyCode(keyEvent->keysym.sym); if (code >= KEY_MAXSCAN) { break; } if (aKeyState[code].state == KEY_PRESSED) { aKeyState[code].state = KEY_PRESSRELEASE; } else if (aKeyState[code].state == KEY_DOWN) { aKeyState[code].state = KEY_RELEASED; } break; default: break; } }
/*! * Handle keyboard events */ void inputHandleKeyEvent(SDL_KeyboardEvent * keyEvent) { UDWORD code, vk; utf_32_char unicode = keyEvent->keysym.unicode; switch (keyEvent->type) { case SDL_KEYDOWN: switch (keyEvent->keysym.sym) { case SDLK_LEFT: vk = INPBUF_LEFT; break; case SDLK_RIGHT: vk = INPBUF_RIGHT; break; case SDLK_UP: vk = INPBUF_UP; break; case SDLK_DOWN: vk = INPBUF_DOWN; break; case SDLK_HOME: vk = INPBUF_HOME; break; case SDLK_END: vk = INPBUF_END; break; case SDLK_INSERT: vk = INPBUF_INS; break; case SDLK_DELETE: vk = INPBUF_DEL; break; case SDLK_PAGEUP: vk = INPBUF_PGUP; break; case SDLK_PAGEDOWN: vk = INPBUF_PGDN; break; default: vk = keyEvent->keysym.sym; break; } debug( LOG_INPUT, "Key Code (pressed): 0x%x, %d, [%c] SDLkey=[%s]", vk, vk, (vk < 128) && (vk > 31) ? (char) vk : '?' , SDL_GetKeyName(keyCodeToSDLKey((KEY_CODE)keyEvent->keysym.sym))); if (unicode < 32) { unicode = 0; } inputAddBuffer(vk, unicode); code = sdlKeyToKeyCode(keyEvent->keysym.sym); if ( aKeyState[code].state == KEY_UP || aKeyState[code].state == KEY_RELEASED || aKeyState[code].state == KEY_PRESSRELEASE ) { //whether double key press or not aKeyState[code].state = KEY_PRESSED; aKeyState[code].lastdown = 0; } break; case SDL_KEYUP: code = sdlKeyToKeyCode(keyEvent->keysym.sym); if (aKeyState[code].state == KEY_PRESSED) { aKeyState[code].state = KEY_PRESSRELEASE; } else if (aKeyState[code].state == KEY_DOWN ) { aKeyState[code].state = KEY_RELEASED; } break; default: break; } }