Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/keyboard.cc')
-rw-r--r--src/client/keyboard.cc334
1 files changed, 330 insertions, 4 deletions
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 <iostream>
+#include <iomanip>
+#include <fstream>
+
+#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;