ProcessInputEvent (const SDL_Event *Event) { if (!InputInitialized) return; ProcessMouseEvent (Event); VControl_HandleEvent (Event); if (Event->type == SDL_KEYDOWN || Event->type == SDL_KEYUP) { // process character input event, if any SDLKey k = Event->key.keysym.sym; wchar_t map_key = Event->key.keysym.unicode; if (k < 0 || k > num_keys) k = num_keys; // for unknown keys if (Event->type == SDL_KEYDOWN) { int newtail; // dont care about the non-printable, non-char if (!map_key) return; kbdstate[k]++; newtail = (kbdtail + 1) & (KBDBUFSIZE - 1); // ignore the char if the buffer is full if (newtail != kbdhead) { kbdbuf[kbdtail] = map_key; kbdtail = newtail; lastchar = map_key; ImmediateInputState.menu[KEY_MENU_ANY]++; } } else if (Event->type == SDL_KEYUP) { if (kbdstate[k] == 0) { // something is fishy -- better to reset the // repeatable state to avoid big problems ImmediateInputState.menu[KEY_MENU_ANY] = 0; } else { kbdstate[k]--; if (ImmediateInputState.menu[KEY_MENU_ANY] > 0) ImmediateInputState.menu[KEY_MENU_ANY]--; } } } }