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>2008-02-22 22:36:23 +0000
committerStijn Buys <ingar@osirion.org>2008-02-22 22:36:23 +0000
commit82c06412ef39522c4deab457ce7a3e78160d8a19 (patch)
tree80a656d624c1d979df956a6982fb2246b81b6c69 /src/client/keyboard.cc
parent9b041ac2e075bfb3a30397a8acdc5432860d2c84 (diff)
keypad and numlock support
Diffstat (limited to 'src/client/keyboard.cc')
-rw-r--r--src/client/keyboard.cc164
1 files changed, 131 insertions, 33 deletions
diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc
index 45e9284..8566ded 100644
--- a/src/client/keyboard.cc
+++ b/src/client/keyboard.cc
@@ -18,95 +18,193 @@ void setkeyboardmode(bool input)
SDL_EnableKeyRepeat(10, SDL_DEFAULT_REPEAT_INTERVAL);
}
-char keysym_to_char(const SDL_keysym &keysym)
+int translate_keysym(const SDL_keysym &keysym)
{
- char c = (char) keysym.sym;
- bool shiftstate = false;
+
+ int key = keysym.sym;
+ bool shift = false;
+ bool numlock = false;
+
+
+ // keypad keys
+ if (keysym.mod & KMOD_NUM) {
+ numlock = true;
+ switch(key) {
+ case SDLK_KP0:
+ return '0';
+ break;
+ case SDLK_KP1:
+ return '1';
+ break;
+ case SDLK_KP2:
+ return '2';
+ break;
+ case SDLK_KP3:
+ return '3';
+ break;
+ case SDLK_KP4:
+ return '4';
+ break;
+ case SDLK_KP5:
+ return '5';
+ break;
+ case SDLK_KP6:
+ return '6';
+ break;
+ case SDLK_KP7:
+ return '7';
+ break;
+ case SDLK_KP8:
+ return '8';
+ break;
+ case SDLK_KP9:
+ return '9';
+ 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;
+ }
+ }
+
+ // special keys
+ switch(key) {
+ case SDLK_KP_ENTER:
+ return SDLK_RETURN;
+ break;
+ case SDLK_KP_PERIOD:
+ return '.';
+ break;
+ case SDLK_KP_DIVIDE:
+ return '/';
+ break;
+ case SDLK_KP_MULTIPLY:
+ return '*';
+ break;
+ case SDLK_KP_MINUS:
+ return '-';
+ break;
+ case SDLK_KP_PLUS:
+ return '+';
+ break;
+ case SDLK_KP_EQUALS:
+ return '=';
+ break;
+ }
+
+ // caps lock
if (keysym.mod & KMOD_CAPS)
- shiftstate = true;
+ shift = true;
+ // left/right shift
if ((keysym.mod & KMOD_LSHIFT) || (keysym.mod & KMOD_RSHIFT)) {
- shiftstate = !shiftstate;
+ shift = !shift;
}
- if (!shiftstate)
- return c;
+ if (shift) {
+ if ((key >= 'a' && key <= 'z')) {
+ key = key + 'A' - 'a';
+ return key;
+ }
- if ((c >= 'a' && c <= 'z')) {
- c = c + 'A' - 'a';
- } else {
- switch (c) {
+ switch (key) {
case '`':
- c = '~';
+ key = '~';
break;
case '1':
- c = '!';
+ key = '!';
break;
case '2':
- c = '@';
+ key = '@';
break;
case '3':
- c = '#';
+ key = '#';
break;
case '4':
- c = '$';
+ key = '$';
break;
case '5':
- c = '%';
+ key = '%';
break;
case '6':
- c = '^';
+ key = '^';
break;
case '7':
- c = '&';
+ key = '&';
break;
case '8':
- c = '*';
+ key = '*';
break;
case '9':
- c = '(';
+ key = '(';
break;
case '0':
- c = ')';
+ key = ')';
break;
case '-':
- c = '_';
+ key = '_';
break;
case '=':
- c = '+';
+ key = '+';
break;
// second row
case '[':
- c = '{';
+ key = '{';
break;
case ']':
- c = '}';
+ key = '}';
break;
case '|':
- c = '\\';
+ key = '\\';
break;
// third row
case ';':
- c = ':';
+ key = ':';
break;
case '\'':
- c = '"';
+ key = '"';
break;
// fourth row
case ',':
- c = '<';
+ key = '<';
break;
case '.':
- c = '>';
+ key = '>';
break;
case '/':
- c = '?';
+ key = '?';
break;
}
}
- return c;
+ return key;
}
} // namespace client