From 980c5c41dc8e88ab3e7a5751348a92a0662a2ea4 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Mon, 21 Jul 2008 22:03:26 +0000 Subject: prepare keybinds for modifier keys, fix for the camera clipping issue --- src/client/keyboard.cc | 211 +++++++++++++++++++++++++++---------------------- 1 file changed, 116 insertions(+), 95 deletions(-) (limited to 'src/client/keyboard.cc') diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index 8295fce..170fbd1 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -15,7 +15,8 @@ #include "filesystem/filesystem.h" #include "sys/sys.h" -namespace client { +namespace client +{ /* Notes: @@ -29,25 +30,25 @@ Keyboard::Keyboard() 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("esc", 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("clear", SDLK_CLEAR); + add_key("enter", SDLK_RETURN); + add_key("pause", SDLK_PAUSE); + add_key("esc", 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(")", 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'); @@ -61,18 +62,18 @@ Keyboard::Keyboard() 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(";", 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'); @@ -112,7 +113,7 @@ Keyboard::Keyboard() add_key("kp7", SDLK_KP7); add_key("kp8", SDLK_KP8, 0, "+down"); 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"); @@ -120,7 +121,7 @@ Keyboard::Keyboard() 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"); @@ -147,7 +148,7 @@ Keyboard::Keyboard() 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); @@ -170,7 +171,7 @@ Keyboard::Keyboard() add_key("help", SDLK_HELP); add_key("print", SDLK_PRINT, 0, "screenshot"); add_key("sysrq", SDLK_SYSREQ); - add_key("breal", SDLK_BREAK); + add_key("break", SDLK_BREAK); add_key("menu", SDLK_MENU); add_key("power", SDLK_POWER); add_key("euro", SDLK_EURO); @@ -186,8 +187,8 @@ Keyboard::Keyboard() Keyboard::~Keyboard() { - for(iterator it = begin(); it != end(); it++) - delete (*it).second; + for (iterator it = begin(); it != end(); it++) + delete(*it).second; keys.clear(); } @@ -211,8 +212,8 @@ void Keyboard::save_binds() iterator it; for (it = begin(); it != end(); it++) { Key *key = (*it).second; - if (key->bind().size()) { - ofs << "bind " << key->name() << " " << key->bind() << std::endl; + if (key->bind(Key::None).size()) { + ofs << "bind " << key->name() << " " << key->bind(Key::None) << std::endl; } /* } else { @@ -241,7 +242,7 @@ void Keyboard::load_binds() if (line[0] && line[0] != '#' && line[0] != ';') core::cmd() << line << '\n'; } - + // execute commands in the buffer core::CommandBuffer::exec(); } @@ -251,7 +252,7 @@ Key * Keyboard::release(unsigned int sym) if (!key) { return 0; } - + key->pressed() = 0; return key; } @@ -262,7 +263,7 @@ Key * Keyboard::press(unsigned int sym) if (!key) { return 0; } - + if (!key->pressed()) key->pressed() = core::application()->time(); @@ -293,8 +294,7 @@ 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()); + key->assign(Key::None, str.c_str()); } else { con_print << "Key '" << name << "' not found." << std::endl; } @@ -304,12 +304,20 @@ void Keyboard::unbind(std::string const &name) { Key *key = find(name); if (key) { - key->bind().clear(); + key->clear(Key::None); } else { con_print << "Key '" << name << "' not found." << std::endl; } } +void Keyboard::unbindall() +{ + for (iterator it = begin(); it != end(); it++) { + Key *key = (*it).second; + key->clear(); + } +} + 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); @@ -318,7 +326,7 @@ void Keyboard::add_key(const char *name, const unsigned int keysym, const char a void Keyboard::list_keys() { for (iterator it = begin(); it != end(); it++) { - con_print << " " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind() << std::endl; + con_print << " " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::None) << std::endl; } con_print << keys.size() << " keys" << std::endl; } @@ -327,36 +335,49 @@ void Keyboard::list_binds() { size_t n =0; for (iterator it = begin(); it != end(); it++) { - if ((*it).second->bind().size()) { - con_print << " " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind() << std::endl; + if ((*it).second->bind(Key::None).size()) { + con_print << " " << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::None) << std::endl; n++; } + if ((*it).second->bind(Key::Shift).size()) { + con_print << " shift+" << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::Shift) << std::endl; + n++; + } + if ((*it).second->bind(Key::Ctrl).size()) { + con_print << " ctrl+" << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::Ctrl) << std::endl; + n++; + } + if ((*it).second->bind(Key::Alt).size()) { + con_print << " alt+" << aux::pad_left((*it).second->name(), 6) << " " << (*it).second->bind(Key::Alt) << std::endl; + n++; + } + } con_print << n << " binds" << std::endl; } void setkeyboardmode(bool input) { -/* if(input) - SDL_EnableKeyRepeat(250, SDL_DEFAULT_REPEAT_INTERVAL); - else - SDL_EnableKeyRepeat(10, SDL_DEFAULT_REPEAT_INTERVAL); -*/ + /* if(input) + SDL_EnableKeyRepeat(250, SDL_DEFAULT_REPEAT_INTERVAL); + else + SDL_EnableKeyRepeat(10, SDL_DEFAULT_REPEAT_INTERVAL); + */ } unsigned int translate_keysym(const SDL_keysym &keysym) { - + int key = keysym.sym; - bool shift = false; + bool shift = false; bool numlock = false; - + // keypad keys if (keysym.mod & KMOD_NUM) { numlock = true; - switch(key) { + switch (key) { case SDLK_KP0: return '0'; break; @@ -389,39 +410,39 @@ unsigned int translate_keysym(const SDL_keysym &keysym) break; } } else { - switch(key) { - case SDLK_KP0: - return SDLK_INSERT; - break; - case SDLK_KP1: - return SDLK_END; - break; - case SDLK_KP2: - return SDLK_DOWN; - break; - case SDLK_KP3: - return SDLK_PAGEDOWN; - break; - case SDLK_KP4: - return SDLK_LEFT; - break; - case SDLK_KP6: - return SDLK_RIGHT; - break; - case SDLK_KP7: - return SDLK_HOME; - break; - case SDLK_KP8: - return SDLK_UP; - break; - case SDLK_KP9: - return SDLK_PAGEUP; - break; + switch (key) { + case SDLK_KP0: + return SDLK_INSERT; + break; + case SDLK_KP1: + return SDLK_END; + break; + case SDLK_KP2: + return SDLK_DOWN; + break; + case SDLK_KP3: + return SDLK_PAGEDOWN; + break; + case SDLK_KP4: + return SDLK_LEFT; + break; + case SDLK_KP6: + return SDLK_RIGHT; + break; + case SDLK_KP7: + return SDLK_HOME; + break; + case SDLK_KP8: + return SDLK_UP; + break; + case SDLK_KP9: + return SDLK_PAGEUP; + break; } } // special keys - switch(key) { + switch (key) { case SDLK_ESCAPE: return SDLK_ESCAPE; break; @@ -431,19 +452,19 @@ unsigned int translate_keysym(const SDL_keysym &keysym) case SDLK_KP_PERIOD: return '.'; break; - case SDLK_KP_DIVIDE: + case SDLK_KP_DIVIDE: return '/'; break; - case SDLK_KP_MULTIPLY: + case SDLK_KP_MULTIPLY: return '*'; break; - case SDLK_KP_MINUS: + case SDLK_KP_MINUS: return '-'; break; - case SDLK_KP_PLUS: + case SDLK_KP_PLUS: return '+'; break; - case SDLK_KP_EQUALS: + case SDLK_KP_EQUALS: return '='; break; } @@ -461,7 +482,7 @@ unsigned int translate_keysym(const SDL_keysym &keysym) if ((key >= 'a' && key <= 'z')) { key = key + 'A' - 'a'; return key; - } + } switch (key) { case '`': @@ -503,7 +524,7 @@ unsigned int translate_keysym(const SDL_keysym &keysym) case '=': key = '+'; break; - // second row + // second row case '[': key = '{'; break; @@ -513,14 +534,14 @@ unsigned int translate_keysym(const SDL_keysym &keysym) case '|': key = '\\'; break; - // third row + // third row case ';': key = ':'; break; case '\'': key = '"'; break; - // fourth row + // fourth row case ',': key = '<'; break; -- cgit v1.2.3