X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcontrol%2Fkeyboard_manager.cpp;h=ca4e4617e7b68784be6d075d2e8863d8a87d0f27;hb=f58cb92fcd8ddfb7cf7e4cd429be06071b67c7c6;hp=32c947a438ab180e2f38c2fcbfb8d3d1658cf32f;hpb=be53843f506b5f2b1990452b07122e3775a54cde;p=supertux.git diff --git a/src/control/keyboard_manager.cpp b/src/control/keyboard_manager.cpp index 32c947a43..ca4e4617e 100644 --- a/src/control/keyboard_manager.cpp +++ b/src/control/keyboard_manager.cpp @@ -19,6 +19,7 @@ #include "control/controller.hpp" #include "control/joystick_manager.hpp" +#include "control/keyboard_config.hpp" #include "gui/menu_manager.hpp" #include "lisp/list_iterator.hpp" #include "supertux/console.hpp" @@ -27,31 +28,12 @@ #include "supertux/menu/menu_storage.hpp" #include "util/writer.hpp" -KeyboardManager::KeyboardManager(InputManager* parent) : +KeyboardManager::KeyboardManager(InputManager* parent, + KeyboardConfig& keyboard_config) : m_parent(parent), - keymap(), - jump_with_up_kbd(false), + m_keyboard_config(keyboard_config), wait_for_key(-1) { - // initialize default keyboard map - keymap[SDLK_LEFT] = Controller::LEFT; - keymap[SDLK_RIGHT] = Controller::RIGHT; - keymap[SDLK_UP] = Controller::UP; - keymap[SDLK_DOWN] = Controller::DOWN; - keymap[SDLK_SPACE] = Controller::JUMP; - keymap[SDLK_LCTRL] = Controller::ACTION; - keymap[SDLK_LALT] = Controller::ACTION; - keymap[SDLK_ESCAPE] = Controller::PAUSE_MENU; - keymap[SDLK_p] = Controller::PAUSE_MENU; - keymap[SDLK_PAUSE] = Controller::PAUSE_MENU; - keymap[SDLK_RETURN] = Controller::MENU_SELECT; - keymap[SDLK_KP_ENTER] = Controller::MENU_SELECT; - keymap[SDLK_CARET] = Controller::CONSOLE; - keymap[SDLK_DELETE] = Controller::PEEK_LEFT; - keymap[SDLK_PAGEDOWN] = Controller::PEEK_RIGHT; - keymap[SDLK_HOME] = Controller::PEEK_UP; - keymap[SDLK_END] = Controller::PEEK_DOWN; - keymap[SDLK_TAB] = Controller::CHEAT_MENU; } KeyboardManager::~KeyboardManager() @@ -61,10 +43,10 @@ KeyboardManager::~KeyboardManager() void KeyboardManager::process_key_event(const SDL_KeyboardEvent& event) { - KeyMap::iterator key_mapping = keymap.find(event.keysym.sym); + KeyboardConfig::KeyMap::iterator key_mapping = m_keyboard_config.keymap.find(event.keysym.sym); // if console key was pressed: toggle console - if (key_mapping != keymap.end() && + if (key_mapping != m_keyboard_config.keymap.end() && key_mapping->second == Controller::CONSOLE) { if (event.type == SDL_KEYDOWN) @@ -82,7 +64,7 @@ KeyboardManager::process_key_event(const SDL_KeyboardEvent& event) // if menu mode: send key there process_menu_key_event(event); } - else if (key_mapping == keymap.end()) + else if (key_mapping == m_keyboard_config.keymap.end()) { // default action: update controls //log_debug << "Key " << event.key.SDL_Keycode.sym << " is unbound" << std::endl; @@ -92,7 +74,7 @@ KeyboardManager::process_key_event(const SDL_KeyboardEvent& event) auto control = key_mapping->second; bool value = (event.type == SDL_KEYDOWN); m_parent->get_controller()->set_control(control, value); - if (jump_with_up_kbd && control == Controller::UP) + if (m_keyboard_config.jump_with_up_kbd && control == Controller::UP) { m_parent->get_controller()->set_control(Controller::JUMP, value); } @@ -166,7 +148,7 @@ KeyboardManager::process_menu_key_event(const SDL_KeyboardEvent& event) if (event.keysym.sym != SDLK_ESCAPE && event.keysym.sym != SDLK_PAUSE) { - bind_key(event.keysym.sym, static_cast(wait_for_key)); + m_keyboard_config.bind_key(event.keysym.sym, static_cast(wait_for_key)); } m_parent->reset(); MenuManager::instance().refresh(); @@ -208,8 +190,10 @@ KeyboardManager::process_menu_key_event(const SDL_KeyboardEvent& event) control = Controller::MENU_SELECT; break; case SDLK_ESCAPE: + control = Controller::ESCAPE; + break; case SDLK_PAUSE: - control = Controller::PAUSE_MENU; + control = Controller::START; break; default: return; @@ -220,90 +204,9 @@ KeyboardManager::process_menu_key_event(const SDL_KeyboardEvent& event) } void -KeyboardManager::bind_key(SDL_Keycode key, Controller::Control control) -{ - // remove all previous mappings for that control and for that key - for(KeyMap::iterator i = keymap.begin(); - i != keymap.end(); /* no ++i */) { - if (i->second == control) { - KeyMap::iterator e = i; - ++i; - keymap.erase(e); - } else { - ++i; - } - } - - KeyMap::iterator i = keymap.find(key); - if (i != keymap.end()) - keymap.erase(i); - - // add new mapping - keymap[key] = control; -} - -SDL_Keycode -KeyboardManager::reversemap_key(Controller::Control c) +KeyboardManager::bind_next_event_to(Controller::Control id) { - for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) - { - if (i->second == c) - { - return i->first; - } - } - - return SDLK_UNKNOWN; -} - -void -KeyboardManager::read(const lisp::Lisp* keymap_lisp) -{ - // keycode values changed between SDL1 and SDL2, so we skip old SDL1 - // based values and use the defaults instead on the first read of - // the config file - bool config_is_sdl2 = false; - keymap_lisp->get("sdl2", config_is_sdl2); - if (config_is_sdl2) - { - keymap.clear(); - keymap_lisp->get("jump-with-up", jump_with_up_kbd); - lisp::ListIterator iter(keymap_lisp); - while(iter.next()) { - if (iter.item() == "map") { - int key = -1; - std::string control; - const lisp::Lisp* map = iter.lisp(); - map->get("key", key); - - map->get("control", control); - - int i = 0; - for(i = 0; Controller::controlNames[i] != 0; ++i) { - if (control == Controller::controlNames[i]) - break; - } - if (Controller::controlNames[i] == 0) { - log_info << "Invalid control '" << control << "' in keymap" << std::endl; - continue; - } - keymap[static_cast(key)] = static_cast(i); - } - } - } -} - -void -KeyboardManager::write(Writer& writer) -{ - writer.write("sdl2", true); - writer.write("jump-with-up", jump_with_up_kbd); - for(KeyMap::iterator i = keymap.begin(); i != keymap.end(); ++i) { - writer.start_list("map"); - writer.write("key", (int) i->first); - writer.write("control", Controller::controlNames[i->second]); - writer.end_list("map"); - } + wait_for_key = id; } /* EOF */