From 82c06412ef39522c4deab457ce7a3e78160d8a19 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Fri, 22 Feb 2008 22:36:23 +0000 Subject: keypad and numlock support --- src/client/keyboard.cc | 164 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 131 insertions(+), 33 deletions(-) (limited to 'src/client/keyboard.cc') 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 -- cgit v1.2.3