From 8c17868585e2a12f947ec387947c4521ef21d775 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Mon, 2 Jun 2008 16:20:47 +0000 Subject: keyboard binds --- src/client/keyboard.cc | 334 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 330 insertions(+), 4 deletions(-) (limited to 'src/client/keyboard.cc') diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index 8566ded..f9be4f5 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -4,21 +4,344 @@ the terms and conditions of the GNU General Public License version 2 */ -#include "client/keyboard.h" - #include +#include +#include + +#include "auxiliary/functions.h" +#include "client/keyboard.h" +#include "core/application.h" +#include "core/commandbuffer.h" +#include "filesystem/filesystem.h" +#include "sys/sys.h" namespace client { +/* +Notes: +http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlkey.html +*/ + +Keyboard::Keyboard() +{ + numlock = false; + capslock = false; + + add_key("backspace", SDLK_BACKSPACE); + add_key("tab", SDLK_TAB); + add_key("clear", SDLK_CLEAR); + add_key("enter", SDLK_RETURN); + add_key("pause", SDLK_PAUSE); + add_key("escape", SDLK_ESCAPE); + add_key("space", SDLK_SPACE, ' ', "ui_control"); + add_key("!", SDLK_EXCLAIM, '!'); + add_key("\"", SDLK_QUOTEDBL, '"'); + add_key("#", SDLK_HASH, '#'); + add_key("$", SDLK_DOLLAR, '$'); + add_key("&", SDLK_AMPERSAND, '&'); + add_key("'", SDLK_QUOTE, '\''); + add_key("(", SDLK_LEFTPAREN, '('); + add_key(")", SDLK_RIGHTPAREN, ')'); + add_key("*", SDLK_ASTERISK, '*'); + add_key("+", SDLK_PLUS, '+'); + add_key(",", SDLK_COMMA, ','); + add_key("-", SDLK_MINUS, '-'); + add_key(".", SDLK_PERIOD, '.'); + add_key("/", SDLK_SLASH, '/'); + + add_key("0", SDLK_0, '0'); + add_key("1", SDLK_1, '1'); + add_key("2", SDLK_2, '2'); + add_key("3", SDLK_3, '3'); + add_key("4", SDLK_4, '4'); + add_key("5", SDLK_5, '5'); + add_key("6", SDLK_6, '6'); + add_key("7", SDLK_7, '7'); + add_key("8", SDLK_8, '8'); + add_key("9", SDLK_9, '9'); + + add_key(":", SDLK_COLON, ':'); + add_key(";", SDLK_SEMICOLON, ';'); + add_key("<", SDLK_LESS, '<'); + add_key("=", SDLK_EQUALS, '='); + add_key(">", SDLK_GREATER, '>'); + add_key("?", SDLK_QUESTION, '?'); + add_key("@", SDLK_AT, '@'); + add_key("[", SDLK_LEFTBRACKET, '['); + add_key("\\", SDLK_BACKSLASH, '\\'); + add_key("]", SDLK_RIGHTBRACKET, ']'); + add_key("^", SDLK_CARET, '^'); + add_key("_", SDLK_UNDERSCORE, '_'); + add_key("`", SDLK_BACKQUOTE, '`', "ui_console"); + + add_key("a", SDLK_a, 'a'); + add_key("b", SDLK_b, 'b'); + add_key("c", SDLK_c, 'c'); + add_key("d", SDLK_d, 'd'); + add_key("e", SDLK_e, 'e'); + add_key("f", SDLK_f, 'f'); + add_key("g", SDLK_g, 'g'); + add_key("h", SDLK_h, 'h'); + add_key("i", SDLK_i, 'i'); + add_key("j", SDLK_j, 'j'); + add_key("k", SDLK_k, 'k'); + add_key("l", SDLK_l, 'l'); + add_key("m", SDLK_m, 'm'); + add_key("n", SDLK_n, 'n'); + add_key("o", SDLK_o, 'o'); + add_key("p", SDLK_p, 'p'); + add_key("q", SDLK_q, 'q'); + add_key("r", SDLK_r, 'r'); + add_key("s", SDLK_s, 's'); + add_key("t", SDLK_t, 't', "ui_chat"); + add_key("u", SDLK_u, 'u'); + add_key("v", SDLK_v, 'v', "ui_view"); + add_key("w", SDLK_w, 'w'); + add_key("x", SDLK_x, 'x'); + add_key("y", SDLK_y, 'y'); + add_key("z", SDLK_z, 'z'); + + add_key("del", SDLK_DELETE); + add_key("kp0", SDLK_KP0); + add_key("kp1", SDLK_KP1); + add_key("kp2", SDLK_KP2, 0, "+down"); + add_key("kp3", SDLK_KP3); + add_key("kp4", SDLK_KP4, 0, "+left"); + add_key("kp5", SDLK_KP5); + add_key("kp6", SDLK_KP6, 0, "+right"); + add_key("kp7", SDLK_KP7); + add_key("kp8", SDLK_KP8, 0, "+up"); + add_key("kp9", SDLK_KP9); + + add_key("kpperiod", SDLK_KP_PERIOD, '.'); + add_key("kpdiv", SDLK_KP_DIVIDE, '/', "+rollleft"); + add_key("kpmul", SDLK_KP_MULTIPLY, '*', "+rollright"); + add_key("kpmin", SDLK_KP_MINUS, '-', "-thrust"); + add_key("kpplus", SDLK_KP_PLUS, '+', "+thrust"); + add_key("kpenter", SDLK_KP_ENTER, '\n'); + add_key("kpequal", SDLK_KP_EQUALS, '='); + + add_key("up", SDLK_UP, 0, "+camup"); + add_key("down", SDLK_DOWN, 0, "+camdown"); + add_key("right", SDLK_RIGHT, 0, "+camright"); + add_key("left", SDLK_LEFT, 0, "+camleft"); + + add_key("insert", SDLK_INSERT); + add_key("home", SDLK_HOME); + add_key("end", SDLK_END); + add_key("pageup", SDLK_PAGEUP); + add_key("pagedown", SDLK_PAGEDOWN); + + add_key("f1", SDLK_F1); + add_key("f2", SDLK_F2); + add_key("f3", SDLK_F3); + add_key("f4", SDLK_F4); + add_key("f5", SDLK_F5); + add_key("f6", SDLK_F6); + add_key("f7", SDLK_F7); + add_key("f8", SDLK_F8); + add_key("f9", SDLK_F9); + add_key("f10", SDLK_F11); + add_key("f11", SDLK_F11); + add_key("f12", SDLK_F12); + add_key("f13", SDLK_F13); + add_key("f14", SDLK_F14); + add_key("f15", SDLK_F15); + + add_key("numlock", SDLK_NUMLOCK); + add_key("capslock", SDLK_CAPSLOCK); + add_key("scrollock", SDLK_SCROLLOCK); + + add_key("rshift", SDLK_RSHIFT); + add_key("lshift", SDLK_LSHIFT); + + add_key("rctrl", SDLK_RCTRL); + add_key("lctrl", SDLK_LCTRL); + + add_key("ralt", SDLK_RALT); + add_key("lalt", SDLK_LALT); + + add_key("rmeta", SDLK_RMETA); + add_key("lmeta", SDLK_LMETA); + add_key("lwin", SDLK_LSUPER); + add_key("rwin", SDLK_RSUPER); + add_key("mode", SDLK_MODE); + + add_key("help", SDLK_HELP); + add_key("print", SDLK_PRINT, 0, "screenshot"); + add_key("sysrq", SDLK_SYSREQ); + add_key("breal", SDLK_BREAK); + add_key("menu", SDLK_MENU); + add_key("power", SDLK_POWER); + add_key("euro", SDLK_EURO); + + // mouse key aliases + add_key("lmb", 512 + SDL_BUTTON_LEFT, 0, "+control"); + add_key("rmb", 512 + SDL_BUTTON_RIGHT); + add_key("mmb", 512 + SDL_BUTTON_MIDDLE); + + add_key("mwup", 512 + SDL_BUTTON_WHEELUP, 0, "+thrust"); + add_key("mwdown", 512 + SDL_BUTTON_WHEELDOWN, 0, "-thrust"); +} + +Keyboard::~Keyboard() +{ + for(iterator it = begin(); it != end(); it++) + delete (*it).second; + + keys.clear(); +} + +void Keyboard::save_binds() +{ + std::string filename(filesystem::writedir); + filename.append("binds.cfg"); + std::ofstream ofs(filename.c_str()); + + if (!ofs.is_open()) { + con_warn << "Could not write " << filename << std::endl; + return; + } + + con_print << " writing keyboard binds to " << filename << std::endl; + + ofs << "# binds.cfg - osirion keyboard binds" << std::endl; + ofs << "# this file is automaticly generated" << std::endl; + + iterator it; + for (it = begin(); it != end(); it++) { + Key *key = (*it).second; + if (key->bind().size()) { + ofs << "bind " << key->name() << " " << key->bind() << std::endl; + } else { + ofs << "unbind " << key->name() << std::endl; + } + } + ofs.close(); +} + +void Keyboard::load_binds() +{ + std::string filename(filesystem::writedir); + filename.append("binds.cfg"); + std::ifstream ifs(filename.c_str(), std::ifstream::in); + + if (!ifs.is_open()) { + con_warn << "Could not read " << filename << std::endl; + return; + } + + con_print << " reading keyboard binds from " << filename << std::endl; + + char line[MAXCMDSIZE]; + while (ifs.getline(line, MAXCMDSIZE-1)) { + if (line[0] && line[0] != '#' && line[0] != ';') + core::cmd() << line << '\n'; + } + + // execute commands in the buffer + core::CommandBuffer::exec(); +} +Key * Keyboard::release(unsigned int sym) +{ + Key *key = find(sym); + if (!key) { + return 0; + } + + key->pressed() = 0; + return key; +} + +Key * Keyboard::press(unsigned int sym) +{ + Key *key = find(sym); + if (!key) { + return 0; + } + + if (!key->pressed()) + key->pressed() = core::application()->time(); + + return key; +} + +Key *Keyboard::find(std::string const & name) +{ + Key *key = 0; + for (iterator it = begin(); it != end() && !key; it++) { + if ((*it).second->name().compare(name) == 0) { + key = (*it).second; + } + } + return key; +} + +Key *Keyboard::find(unsigned int keysym) +{ + iterator it = keys.find(keysym); + if (it == end()) + return 0; + else + return (*it).second; +} + +void Keyboard::bind(std::string const &name, const std::string str) +{ + Key *key = find(name); + if (key) { + key->bind().assign(str); + aux::trim(key->bind()); + } else { + con_print << "Key '" << name << "' not found." << std::endl; + } +} + +void Keyboard::unbind(std::string const &name) +{ + Key *key = find(name); + if (key) { + key->bind().clear(); + } else { + con_print << "Key '" << name << "' not found." << std::endl; + } +} + +void Keyboard::add_key(const char *name, const unsigned int keysym, const char ascii, const char *bind) +{ + keys[keysym] = new Key(name, keysym, ascii, bind); +} + +void Keyboard::list_keys() +{ + for (iterator it = begin(); it != end(); it++) { + con_print << " " << aux::spaces((*it).second->name(), 6) << " " << (*it).second->bind() << std::endl; + } + con_print << keys.size() << " keys" << std::endl; +} + +void Keyboard::list_binds() +{ + size_t n =0; + for (iterator it = begin(); it != end(); it++) { + if ((*it).second->bind().size()) { + con_print << " " << aux::spaces((*it).second->name(), 6) << " " << (*it).second->bind() << std::endl; + n++; + } + } + con_print << n << " binds" << std::endl; +} + void setkeyboardmode(bool input) { - if(input) +/* if(input) SDL_EnableKeyRepeat(250, SDL_DEFAULT_REPEAT_INTERVAL); else SDL_EnableKeyRepeat(10, SDL_DEFAULT_REPEAT_INTERVAL); +*/ } -int translate_keysym(const SDL_keysym &keysym) +unsigned int translate_keysym(const SDL_keysym &keysym) { int key = keysym.sym; @@ -96,6 +419,9 @@ int translate_keysym(const SDL_keysym &keysym) // special keys switch(key) { + case SDLK_ESCAPE: + return SDLK_ESCAPE; + break; case SDLK_KP_ENTER: return SDLK_RETURN; break; -- cgit v1.2.3