From f07b7a3603cfb2c20507d531b6673ee7ea9633c7 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sun, 6 Mar 2011 23:45:46 +0000 Subject: [PATCH] - more keyboard bugfixes so some special keys above 255 work --- source/glest_game/global/config.cpp | 88 ++++++++++++++++++- .../glest_game/menu/menu_state_keysetup.cpp | 32 +++++-- .../sources/platform/sdl/window.cpp | 31 ++++--- 3 files changed, 129 insertions(+), 22 deletions(-) diff --git a/source/glest_game/global/config.cpp b/source/glest_game/global/config.cpp index 18bfc3d3..70e389ec 100644 --- a/source/glest_game/global/config.cpp +++ b/source/glest_game/global/config.cpp @@ -457,7 +457,6 @@ char Config::translateStringToCharKey(const string &value) const { else if(value == "vkPause") { result = vkPause; } - else { string sError = "Unsupported key translation [" + value + "]"; throw runtime_error(sError.c_str()); @@ -468,7 +467,92 @@ char Config::translateStringToCharKey(const string &value) const { result = value[1]; } else { - result = value[0]; + bool foundKey = false; + if(value.length() > 1) { + for(int i = SDLK_UNKNOWN; i < SDLK_LAST; ++i) { + SDLKey key = static_cast(i); + string keyName = SDL_GetKeyName(key); + if(value == keyName) { + if(key > 255) { + if(value == "left") { + result = vkLeft; + } + else if(value == "right") { + result = vkRight; + } + else if(value == "up") { + result = vkUp; + } + else if(value == "down") { + result = vkDown; + } + else if(value == "add") { + result = vkAdd; + } + else if(value == "subtract") { + result = vkSubtract; + } + else if(value == "escape") { + result = vkEscape; + } + else if(value == "f1") { + result = vkF1; + } + else if(value == "f2") { + result = vkF2; + } + else if(value == "f3") { + result = vkF3; + } + else if(value == "f4") { + result = vkF4; + } + else if(value == "f5") { + result = vkF5; + } + else if(value == "f6") { + result = vkF6; + } + else if(value == "f7") { + result = vkF7; + } + else if(value == "f8") { + result = vkF8; + } + else if(value == "f9") { + result = vkF9; + } + else if(value == "f10") { + result = vkF10; + } + else if(value == "f11") { + result = vkF11; + } + else if(value == "f12") { + result = vkF12; + } + else if(value == "print-screen") { + result = vkPrint; + } + else if(value == "pause") { + result = vkPause; + } + else { + result = -key; + } + } + else { + result = key; + } + foundKey = true; + break; + } + } + } + + if(foundKey == false) { + result = value[0]; + } } } else { diff --git a/source/glest_game/menu/menu_state_keysetup.cpp b/source/glest_game/menu/menu_state_keysetup.cpp index c1c197f0..2bec00c0 100644 --- a/source/glest_game/menu/menu_state_keysetup.cpp +++ b/source/glest_game/menu/menu_state_keysetup.cpp @@ -331,20 +331,28 @@ void MenuStateKeysetup::keyUp(char key) { if(hotkeyIndex >= 0) { if(hotkeyChar != 0) { string keyName = SDL_GetKeyName(static_cast(hotkeyChar)); - key = hotkeyChar; + + if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] keyName [%s] char [%d][%d]\n",__FILE__,__FUNCTION__,__LINE__,keyName.c_str(),hotkeyChar,key); + + SDLKey keysym = SDLK_UNKNOWN; if(keyName == "unknown key") { Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); - SDLKey keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar); + keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar); + + if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] keysym [%d]\n",__FILE__,__FUNCTION__,__LINE__,keysym); + // SDL skips capital letters if(keysym >= 65 && keysym <= 90) { keysym = (SDLKey)((int)keysym + 32); } - key = keysym; + if(keysym < 255) { + key = keysym; + } keyName = SDL_GetKeyName(keysym); } - if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] keyName [%s] char [%d]\n",__FILE__,__FUNCTION__,__LINE__,keyName.c_str(),hotkeyChar); + if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] keyName [%s] char [%d][%d]\n",__FILE__,__FUNCTION__,__LINE__,keyName.c_str(),hotkeyChar,key); if(keyName != "unknown key") { GraphicLabel *label= labels[hotkeyIndex]; @@ -355,15 +363,25 @@ void MenuStateKeysetup::keyUp(char key) { for(int i = 0; i < userProperties.size(); ++i) { string hotKeyName = userProperties[i].first; if(nameValuePair.first == hotKeyName) { - userProperties[i].second = ""; - userProperties[i].second.push_back(key); + if(keysym > 255) { + userProperties[i].second = keyName; + } + else { + userProperties[i].second = ""; + userProperties[i].second.push_back(key); + } isNewUserKeyEntry = false; break; } } if(isNewUserKeyEntry == true) { pair newNameValuePair = nameValuePair; - newNameValuePair.second = key; + if(keysym > 255) { + newNameValuePair.second = keyName; + } + else { + newNameValuePair.second = key; + } userProperties.push_back(newNameValuePair); } } diff --git a/source/shared_lib/sources/platform/sdl/window.cpp b/source/shared_lib/sources/platform/sdl/window.cpp index 9c6d535f..ffe6262a 100644 --- a/source/shared_lib/sources/platform/sdl/window.cpp +++ b/source/shared_lib/sources/platform/sdl/window.cpp @@ -633,7 +633,12 @@ char Window::getRawKey(SDL_keysym keysym) { char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] keysym.sym [%d] skipSpecialKeys = %d.\n",__FILE__,__FUNCTION__,__LINE__,keysym.sym,skipSpecialKeys); - SDLKey unicodeKey = static_cast(getRawKey(keysym)); + //SDLKey unicodeKey = static_cast(getRawKey(keysym)); + char c = getRawKey(keysym); + SDLKey unicodeKey; + if(c > SDLK_UNKNOWN && c < SDLK_LAST) { + unicodeKey = static_cast(c); + } if(unicodeKey == 0) { unicodeKey = keysym.sym; } @@ -709,40 +714,40 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) { return ' '; } - if(keyName == "f1") { + if(keyName == "f1" || keyName == "F1") { return vkF1; } - if(keyName == "f2") { + if(keyName == "f2" || keyName == "F2") { return vkF2; } - if(keyName == "f3") { + if(keyName == "f3" || keyName == "F3") { return vkF3; } - if(keyName == "f4") { + if(keyName == "f4" || keyName == "F4") { return vkF4; } - if(keyName == "f5") { + if(keyName == "f5" || keyName == "F5") { return vkF5; } - if(keyName == "f6") { + if(keyName == "f6" || keyName == "F6") { return vkF6; } - if(keyName == "f7") { + if(keyName == "f7" || keyName == "F7") { return vkF7; } - if(keyName == "f8") { + if(keyName == "f8" || keyName == "F8") { return vkF8; } - if(keyName == "f9") { + if(keyName == "f9" || keyName == "F9") { return vkF9; } - if(keyName == "f10") { + if(keyName == "f10" || keyName == "F10") { return vkF10; } - if(keyName == "f11") { + if(keyName == "f11" || keyName == "F11") { return vkF11; } - if(keyName == "f12") { + if(keyName == "f12" || keyName == "F12") { return vkF12; } if(keyName == "0") {