From 0f57fe6b92f0060378fac910521084c40e98ada4 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Fri, 4 Mar 2011 20:26:47 +0000 Subject: [PATCH] - additional work to allow for changing hotkeys in the keyboard options menu, currently changes are not saved to file, only on screen. --- source/glest_game/global/config.cpp | 123 ++++++++++++++++++ source/glest_game/global/config.h | 6 +- .../glest_game/menu/menu_state_keysetup.cpp | 52 +++++++- source/glest_game/menu/menu_state_keysetup.h | 3 + .../sources/platform/sdl/window.cpp | 62 +++++---- 5 files changed, 215 insertions(+), 31 deletions(-) diff --git a/source/glest_game/global/config.cpp b/source/glest_game/global/config.cpp index 0bcf3342..72153970 100644 --- a/source/glest_game/global/config.cpp +++ b/source/glest_game/global/config.cpp @@ -259,6 +259,129 @@ const string Config::getString(const string &key,const char *defaultValueIfNotFo return properties.first.getString(key,defaultValueIfNotFound); } +SDLKey Config::translateSpecialStringToSDLKey(char c) const { + SDLKey result; + if(c < 0) { + switch(c) { + case vkAdd: + result = SDLK_PLUS; + break; + case vkSubtract: + result = SDLK_MINUS; + break; + + case vkAlt: + result = SDLK_RALT; + break; + + case vkControl: + result = SDLK_RCTRL; + break; + + case vkShift: + result = SDLK_RSHIFT; + break; + + case vkEscape: + result = SDLK_ESCAPE; + break; + + case vkUp: + result = SDLK_UP; + break; + + case vkLeft: + result = SDLK_LEFT; + break; + + case vkRight: + result = SDLK_RIGHT; + break; + + case vkDown: + result = SDLK_DOWN; + break; + + case vkReturn: + result = SDLK_RETURN; + break; + + case vkBack: + result = SDLK_BACKSPACE; + break; + + case vkTab: + result = SDLK_TAB; + break; + + case vkF1: + result = SDLK_F1; + break; + + case vkF2: + result = SDLK_F2; + break; + + case vkF3: + result = SDLK_F3; + break; + + case vkF4: + result = SDLK_F4; + break; + + case vkF5: + result = SDLK_F5; + break; + + case vkF6: + result = SDLK_F6; + break; + + case vkF7: + result = SDLK_F7; + break; + + case vkF8: + result = SDLK_F8; + break; + + case vkF9: + result = SDLK_F9; + break; + + case vkF10: + result = SDLK_F10; + break; + + case vkF11: + result = SDLK_F11; + break; + + case vkF12: + result = SDLK_F12; + break; + + case vkDelete: + result = SDLK_DELETE; + break; + + case vkPrint: + result = SDLK_PRINT; + break; + + case vkPause: + result = SDLK_PAUSE; + break; + } + } + else { + result = static_cast(c); + } + + return result; +} + char Config::translateStringToCharKey(const string &value) const { char result = 0; diff --git a/source/glest_game/global/config.h b/source/glest_game/global/config.h index 167b5ae9..9742d673 100644 --- a/source/glest_game/global/config.h +++ b/source/glest_game/global/config.h @@ -15,6 +15,7 @@ #include "properties.h" #include #include "game_constants.h" +#include #include "leak_dumper.h" namespace Glest{ namespace Game{ @@ -50,8 +51,6 @@ protected: Config(); Config(std::pair type, std::pair file, std::pair fileMustExist); - char translateStringToCharKey(const string &value) const; - static void CopyAll(Config *src,Config *dest); vector > getPropertiesFromContainer(const Properties &propertiesObj) const; @@ -84,6 +83,9 @@ public: vector > getMasterProperties() const; vector > getUserProperties() const; + char translateStringToCharKey(const string &value) const; + SDLKey translateSpecialStringToSDLKey(char c) const; + string toString(); }; diff --git a/source/glest_game/menu/menu_state_keysetup.cpp b/source/glest_game/menu/menu_state_keysetup.cpp index 43fa8137..27c3da80 100644 --- a/source/glest_game/menu/menu_state_keysetup.cpp +++ b/source/glest_game/menu/menu_state_keysetup.cpp @@ -34,6 +34,9 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu): SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); containerName = "KeySetup"; + hotkeyIndex = -1; + hotkeyChar = 0; + Lang &lang= Lang::getInstance(); int buttonRowPos=80; // header @@ -78,13 +81,27 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu): userProperties=configKeys.getUserProperties(); for(int i = 0; i < mergedProperties.size(); ++i) { + + string keyName = mergedProperties[i].second; + if(keyName.length() > 0) { + SDLKey keysym = static_cast(configKeys.translateStringToCharKey(keyName)); + // SDL skips capital letters + if(keysym >= 65 && keysym <= 90) { + keysym = (SDLKey)((int)keysym + 32); + } + keyName = SDL_GetKeyName(keysym); + if(keyName == "unknown key") { + keyName = mergedProperties[i].second; + } + } + GraphicButton *button=new GraphicButton(); button->init(keyButtonsXBase, keyButtonsYBase, keyButtonsWidth,keyButtonsHeight); button->setText(mergedProperties[i].first); keyButtons.push_back(button); GraphicLabel *label=new GraphicLabel(); label->init(keyButtonsXBase+keyButtonsWidth+10,keyButtonsYBase,labelWidth,20); - label->setText(mergedProperties[i].second); + label->setText(keyName); labels.push_back(label); } @@ -161,6 +178,8 @@ void MenuStateKeysetup::mouseClick(int x, int y, MouseButton mouseButton){ for (int i = keyScrollBar.getVisibleStart(); i <= keyScrollBar.getVisibleEnd(); ++i) { if (keyButtons[i]->mouseClick(x, y)) { + hotkeyIndex = i; + hotkeyChar = 0; break; } } @@ -239,14 +258,39 @@ void MenuStateKeysetup::showMessageBox(const string &text, const string &header, void MenuStateKeysetup::keyDown(char key) { - //Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); + hotkeyChar = key; + + if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] hotkeyChar [%d]\n",__FILE__,__FUNCTION__,__LINE__,hotkeyChar); } void MenuStateKeysetup::keyPress(char c) { - } -void MenuStateKeysetup::keyUp(char key) { +void MenuStateKeysetup::keyUp(char key) { + //Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); + + if(hotkeyIndex >= 0 && hotkeyChar != 0) { + string keyName = SDL_GetKeyName(static_cast(hotkeyChar)); + + if(keyName == "unknown key") { + Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); + SDLKey keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar); + // SDL skips capital letters + if(keysym >= 65 && keysym <= 90) { + keysym = (SDLKey)((int)keysym + 32); + } + 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(keyName != "unknown key") { + GraphicLabel *label= labels[hotkeyIndex]; + label->setText(keyName); + } + hotkeyIndex = -1; + hotkeyChar = 0; + } } }}//end namespace diff --git a/source/glest_game/menu/menu_state_keysetup.h b/source/glest_game/menu/menu_state_keysetup.h index ef387c86..fb506274 100644 --- a/source/glest_game/menu/menu_state_keysetup.h +++ b/source/glest_game/menu/menu_state_keysetup.h @@ -49,6 +49,9 @@ private: vector > masterProperties; vector > userProperties; + int hotkeyIndex; + char hotkeyChar; + public: MenuStateKeysetup(Program *program, MainMenu *mainMenu); ~MenuStateKeysetup(); diff --git a/source/shared_lib/sources/platform/sdl/window.cpp b/source/shared_lib/sources/platform/sdl/window.cpp index 69e2584a..ab25e26d 100644 --- a/source/shared_lib/sources/platform/sdl/window.cpp +++ b/source/shared_lib/sources/platform/sdl/window.cpp @@ -636,6 +636,9 @@ 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)); + if(unicodeKey == 0) { + unicodeKey = keysym.sym; + } //string keyName = SDL_GetKeyName(keysym.sym); string keyName = SDL_GetKeyName(unicodeKey); @@ -662,15 +665,6 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) { return vkShift; } } - if(keyName == "plus sign" || keyName == "plus") { - return vkAdd; - } - if(keyName == "minus sign" || keyName == "minus") { - return vkSubtract; - } - if(keyName == "escape") { - return vkEscape; - } if(keyName == "up arrow" || keyName == "up") { return vkUp; } @@ -686,6 +680,15 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) { if(keyName == "return" || keyName == "enter") { return vkReturn; } + if(keyName == "plus sign" || keyName == "plus") { + return vkAdd; + } + if(keyName == "minus sign" || keyName == "minus") { + return vkSubtract; + } + if(keyName == "escape") { + return vkEscape; + } if(keyName == "tab") { return vkTab; } @@ -701,40 +704,47 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) { if(keyName == "pause") { return vkPause; } - if(keyName == "F1") { + if(keyName == "question mark" || keyName == "?") { + return '?'; + } + if(keyName == "space") { + return ' '; + } + + if(keyName == "f1") { return vkF1; } - if(keyName == "F2") { + if(keyName == "f2") { return vkF2; } - if(keyName == "F3") { + if(keyName == "f3") { return vkF3; } - if(keyName == "F4") { + if(keyName == "f4") { return vkF4; } - if(keyName == "F5") { + if(keyName == "f5") { return vkF5; } - if(keyName == "F6") { + if(keyName == "f6") { return vkF6; } - if(keyName == "F7") { + if(keyName == "f7") { return vkF7; } - if(keyName == "F8") { + if(keyName == "f8") { return vkF8; } - if(keyName == "F9") { + if(keyName == "f9") { return vkF9; } - if(keyName == "F10") { + if(keyName == "f10") { return vkF10; } - if(keyName == "F11") { + if(keyName == "f11") { return vkF11; } - if(keyName == "F12") { + if(keyName == "f12") { return vkF12; } if(keyName == "0") { @@ -767,9 +777,6 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) { if(keyName == "9") { return '9'; } - if(keyName == "question mark" || keyName == "?") { - return '?'; - } if(keyName == "a") { return 'A'; } @@ -849,6 +856,9 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) { return 'Z'; } + if(unicodeKey > 0 && unicodeKey <= 255) { + return unicodeKey; + } return 0; } @@ -920,7 +930,9 @@ char Window::getKey(SDL_keysym keysym,bool skipSpecialKeys) { } } - c = keysym.sym; + if(keysym.sym <= 255) { + c = keysym.sym; + } } SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %u] c = [%d]\n",__FILE__,__FUNCTION__,__LINE__,c);