Fix GUIKeyChangeMenu so that '/' can be inserted on a finnish keyboard
authorPerttu Ahola <celeron55@gmail.com>
Sat, 1 Sep 2012 15:02:29 +0000 (18:02 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 1 Sep 2012 15:03:50 +0000 (18:03 +0300)
src/guiKeyChangeMenu.cpp
src/guiKeyChangeMenu.h
src/keycode.cpp
src/keycode.h

index a7dbc8c6f798de0b7bcc664ed0e5b5acb0b1dbc7..49b292df400837690ef028abafba27b9cb43bf4f 100644 (file)
@@ -60,6 +60,7 @@ GUIKeyChangeMenu::GUIKeyChangeMenu(gui::IGUIEnvironment* env,
                                gui::IGUIElement* parent, s32 id, IMenuManager *menumgr) :
 GUIModalMenu(env, parent, id, menumgr)
 {
+       shift_down = false;
        activeKey = -1;
        this->key_used_text = NULL;
        init_keys();
@@ -204,7 +205,15 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
                && event.KeyInput.PressedDown)
        {
                changeCtype("");
-               KeyPress kp(event.KeyInput);
+               bool prefer_character = shift_down;
+               KeyPress kp(event.KeyInput, prefer_character);
+               
+               bool shift_went_down = false;
+               if(!shift_down &&
+                               (event.KeyInput.Key == irr::KEY_SHIFT ||
+                               event.KeyInput.Key == irr::KEY_LSHIFT ||
+                               event.KeyInput.Key == irr::KEY_RSHIFT))
+                       shift_went_down = true;
 
                // Remove Key already in use message
                if(this->key_used_text)
@@ -240,8 +249,14 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
                        this->key_used.push_back(kp);
 
                        changeCtype("C");
-                       activeKey = -1;
-                       return true;
+                       // Allow characters made with shift
+                       if(shift_went_down){
+                               shift_down = true;
+                               return false;
+                       }else{
+                               activeKey = -1;
+                               return true;
+                       }
                }
        }
        if (event.EventType == EET_GUI_EVENT)
@@ -287,6 +302,7 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
                                        assert(k);
 
                                        resetMenu();
+                                       shift_down = false;
                                        activeKey = event.GUIEvent.Caller->getID();
                                        k->button->setText(wgettext("press key"));
                                        this->key_used.erase(std::remove(this->key_used.begin(),
index b81866983bc6b5612de9ba2e3217b36d934c19c5..beb4f0b6fcb52a04b7272a56b44ab3e7f030dc86 100644 (file)
@@ -66,6 +66,8 @@ private:
 
        void add_key(int id, std::string setting_name, std::string button_name);
 
+       bool shift_down;
+       
        s32 activeKey;
        
        std::vector<KeyPress> key_used;
index 5a8df0db4792269974c0189d8c66381784fc1a96..cdf3c6062dde7aad2e5c7a0d77c8ce4c1b6bc2d6 100644 (file)
@@ -288,16 +288,27 @@ KeyPress::KeyPress(const char *name)
        m_name = name[0];
 }
 
-KeyPress::KeyPress(const irr::SEvent::SKeyInput &in)
+KeyPress::KeyPress(const irr::SEvent::SKeyInput &in, bool prefer_character)
 {
        Key = in.Key;
        Char = in.Char;
+
+       if(prefer_character){
+               m_name.resize(MB_CUR_MAX+1, '\0');
+               int written = wctomb(&m_name[0], Char);
+               if(written > 0){
+                       infostream<<"KeyPress: Preferring character for "<<m_name<<std::endl;
+                       Key = irr::KEY_KEY_CODES_COUNT;
+                       return;
+               }
+       }
+
        if (valid_kcode(Key)) {
                m_name = KeyNames[Key];
        } else {
                m_name.resize(MB_CUR_MAX+1, '\0');
                int written = wctomb(&m_name[0], Char);
-               if(written >= 0){
+               if(written < 0){
                        std::string hexstr = hex_encode((const char*)&Char, sizeof(Char));
                        errorstream<<"KeyPress: Unexpected multibyte character "<<hexstr<<std::endl;
                }
index 4105d43b8a3c1f117626bbcfacb6175465560cf0..a0b1e3553f939b9cf8f9b42b3d34d23aeb43b35b 100644 (file)
@@ -33,7 +33,7 @@ public:
        KeyPress();
        KeyPress(const char *name);
 
-       KeyPress(const irr::SEvent::SKeyInput &in);
+       KeyPress(const irr::SEvent::SKeyInput &in, bool prefer_character=false);
 
        bool operator==(const KeyPress &o) const
        {