+JoystickKeyboardController::process_key_event(const SDL_Event& event)
+{
+ KeyMap::iterator key_mapping = keymap.find(event.key.keysym.sym);
+
+ // if console key was pressed: toggle console
+ if ((key_mapping != keymap.end()) && (key_mapping->second == CONSOLE)) {
+ if (event.type != SDL_KEYDOWN) return;
+ Console::instance->toggle();
+ return;
+ }
+
+ // if console is open: send key there
+ if (Console::instance->hasFocus()) {
+ process_console_key_event(event);
+ return;
+ }
+
+ // if menu mode: send key there
+ if (Menu::current()) {
+ process_menu_key_event(event);
+ return;
+ }
+
+ // default action: update controls
+ if(key_mapping == keymap.end()) {
+ log_debug << "Key " << event.key.keysym.sym << " is unbound" << std::endl;
+ return;
+ }
+ Control control = key_mapping->second;
+ controls[control] = event.type == SDL_KEYDOWN ? true : false;
+}
+
+void
+JoystickKeyboardController::process_console_key_event(const SDL_Event& event)
+{
+ if (event.type != SDL_KEYDOWN) return;
+
+ switch (event.key.keysym.sym) {
+ case SDLK_RETURN:
+ Console::instance->input << std::endl;
+ break;
+ case SDLK_BACKSPACE:
+ Console::instance->backspace();
+ break;
+ case SDLK_TAB:
+ Console::instance->autocomplete();
+ break;
+ case SDLK_PAGEUP:
+ Console::instance->scroll(-1);
+ break;
+ case SDLK_PAGEDOWN:
+ Console::instance->scroll(+1);
+ break;
+ case SDLK_END:
+ Console::instance->scroll(+65535);
+ break;
+ case SDLK_UP:
+ Console::instance->show_history(-1);
+ break;
+ case SDLK_DOWN:
+ Console::instance->show_history(+1);
+ break;
+ default:
+ int c = event.key.keysym.unicode;
+ if ((c >= 32) && (c <= 126)) {
+ Console::instance->input << (char)c;
+ }
+ break;
+ }
+}
+
+void