Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2010-02-21 19:45:50 +0000
committerStijn Buys <ingar@osirion.org>2010-02-21 19:45:50 +0000
commitfe229598d7437a85988eb9255cd0f6bdb6e07cb7 (patch)
treedb45ca0f0732f3dbb3fd2546dc5881a1aec6ae61 /src/client/keyboard.cc
parent730c452ff5896ed66114e6b2153add9379edef5c (diff)
optimized keyboard input handling routines
Diffstat (limited to 'src/client/keyboard.cc')
-rw-r--r--src/client/keyboard.cc87
1 files changed, 55 insertions, 32 deletions
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<Action *>::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;
}