From fe229598d7437a85988eb9255cd0f6bdb6e07cb7 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 21 Feb 2010 19:45:50 +0000 Subject: optimized keyboard input handling routines --- src/client/keyboard.cc | 87 +++++++++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 32 deletions(-) (limited to 'src/client/keyboard.cc') diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index bf08db1..f3d2181 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -31,37 +31,34 @@ Keyboard::Keyboard() // ------------------ ACTIONS // FIXME actions should be state keys and not use key repeat + add_action("+console", Action::Console, "console key"); - add_action("+left", Action::None, "rotate left"); - add_action("+right", Action::None, "rotate right"); - add_action("+up", Action::None, "rotate up"); - add_action("+down", Action::None, "rotate down"); + add_action("+left", Action::Left, "rotate left"); + add_action("+right", Action::Right, "rotate right"); + add_action("+up", Action::Up, "rotate up"); + add_action("+down", Action::Down, "rotate down"); - add_action("+rollleft", Action::None, "roll left"); - add_action("+rollright", Action::None, "roll right"); + add_action("+rollleft", Action::RollLeft, "roll left"); + add_action("+rollright", Action::RollRight, "roll right"); - add_action("+camleft", Action::None, "rotate camera left"); - add_action("+camright", Action::None, "rotate camera right"); - add_action("+camup", Action::None, "rotate camera up"); - add_action("+camdown", Action::None, "rotate camera down"); + add_action("+camleft", Action::CamLeft, "rotate camera left"); + add_action("+camright", Action::CamRight, "rotate camera right"); + add_action("+camup", Action::CamUp, "rotate camera up"); + add_action("+camdown", Action::CamDown, "rotate camera down"); - add_action("+zoomin", Action::None, "zoom camera in"); - add_action("+zoomout", Action::None, "zoom camera out"); + add_action("+zoomin", Action::ZoomIn, "zoom camera in"); + add_action("+zoomout", Action::ZoomOut, "zoom camera out"); - add_action("+thrustup", Action::None, "increase thruster"); - add_action("+thrustdown", Action::None, "decrease thruster"); + add_action("+thrustup", Action::ThrustUp, "increase thruster"); + add_action("+thrustdown", Action::ThrustDown, "decrease thruster"); - add_action("+strafeleft", Action::None, "strafe left"); - add_action("+straferight", Action::None, "strafe right"); + add_action("+strafeleft", Action::StrafeLeft, "strafe left"); + add_action("+straferight", Action::StrafeRight, "strafe right"); - add_action("+afterburner", Action::None, "afterburner"); - add_action("+reverse", Action::None, "reverse engine"); + add_action("+afterburner", Action::Afterburner, "afterburner"); + add_action("+reverse", Action::Reverse, "reverse engine"); - add_action("+control", Action::None, "enable mouse control while pressed"); - - // TODO the @ is a hack for functions that take the current entity as param - - add_action("@dock", Action::None, "send docking request to target"); + add_action("+control", Action::Control, "enable mouse control while pressed"); // ------------------ KEYS Key *key = 0; @@ -112,7 +109,7 @@ Keyboard::Keyboard() add_key("]", SDLK_RIGHTBRACKET, ']'); add_key("^", SDLK_CARET, '^'); add_key("_", SDLK_UNDERSCORE, '_'); - add_key("`", SDLK_BACKQUOTE, '`', "ui_console"); + add_key("`", SDLK_BACKQUOTE, '`', "+console"); add_key("a", SDLK_a, 'a', "+strafeleft"); add_key("b", SDLK_b, 'b'); @@ -407,20 +404,41 @@ void Keyboard::bind(std::string const &name, const std::string str) Key *key = find(keyname); if (key) { - if (str.size()) - key->assign(modifier, str.c_str()); + // assign new bind of requested + if (str.size()) { + Action *action = 0; + for (std::list::iterator it = actions.begin(); it != actions.end(); it++) { + if ((*it)->name().compare(str) == 0) { + action = (*it); + } + } + + if (action && (modifier != Key::None)) { + if (modifier == Key::Shift) { + con_warn << "Key with modifier 'shift+" << key->name() << "' can not be bound to action '" << action->name() << "'!" << std::endl; + } else if (modifier == Key::Ctrl) { + con_warn << "Key with modifier 'ctrl+" << key->name() << "' can not be bound to action '" << action->name() << "'!" << std::endl; + } else if (modifier == Key::Alt) { + con_warn << "Key with modifier 'alt+" << key->name() << "' can not be bound to action '" << action->name() << "'!" << std::endl; + } + return; + } + key->assign(modifier, str.c_str(), action); + } + // print current bind to console, even when no new bind was assigned if (modifier == Key::None) { - con_debug << " " << aux::pad_right(key->name(), 6) << " " << key->bind(Key::None) << std::endl; + con_print << " " << aux::pad_right(key->name(), 6) << " " << key->bind(Key::None) << std::endl; } else if (modifier == Key::Shift) { - con_debug << " shift+" << aux::pad_right(key->name(), 6) << " " << key->bind(Key::Shift) << std::endl; + con_print << " shift+" << aux::pad_right(key->name(), 6) << " " << key->bind(Key::Shift) << std::endl; } else if (modifier == Key::Ctrl) { - con_debug << " ctrl+" << aux::pad_right(key->name(), 6) << " " << key->bind(Key::Ctrl) << std::endl; + con_print << " ctrl+" << aux::pad_right(key->name(), 6) << " " << key->bind(Key::Ctrl) << std::endl; } else if (modifier == Key::Alt) { - con_debug << " alt+" << aux::pad_right(key->name(), 6) << " " << key->bind(Key::Alt) << std::endl; + con_print << " alt+" << aux::pad_right(key->name(), 6) << " " << key->bind(Key::Alt) << std::endl; } + } else { - con_print << "Key '" << name << "' not found." << std::endl; + con_warn << "Key '" << name << "' not found!" << std::endl; } } @@ -468,8 +486,13 @@ void Keyboard::unbindall() Key * Keyboard::add_key(const char *name, const unsigned int keysym, const char ascii, const char *bind) { - Key *newkey = new Key(name, keysym, ascii, bind); + Key *newkey = new Key(name, keysym, ascii); keys[keysym] = newkey; + if (bind) { + std::string bindstr(bind); + this->bind(newkey->name(), bindstr); + } + return newkey; } -- cgit v1.2.3