-attempt to be friendlier on non english keyboards

This commit is contained in:
Juan Linietsky
2015-01-04 22:39:21 -03:00
parent 8c4dd8de39
commit 1ff0d5c4e5
7 changed files with 203 additions and 103 deletions

View File

@ -27,7 +27,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "keyboard.h"
#include "os/os.h"
struct _KeyCodeText {
int code;
@ -354,7 +354,105 @@ int find_keycode(const String& p_code) {
}
int latin_keyboard_keycode_convert(int p_keycode){
struct _KeyCodeReplace {
int from;
int to;
};
static const _KeyCodeReplace _keycode_replace_qwertz[]={
{KEY_Y,KEY_Z},
{KEY_Z,KEY_Y},
{0,0}
};
static const _KeyCodeReplace _keycode_replace_azerty[]={
{KEY_W,KEY_Z},
{KEY_Z,KEY_W},
{KEY_A,KEY_Q},
{KEY_Q,KEY_A},
{KEY_SEMICOLON,KEY_M},
{KEY_M,KEY_SEMICOLON},
{0,0}
};
static const _KeyCodeReplace _keycode_replace_qzerty[]={
{KEY_W,KEY_Z},
{KEY_Z,KEY_W},
{KEY_SEMICOLON,KEY_M},
{KEY_M,KEY_SEMICOLON},
{0,0}
};
static const _KeyCodeReplace _keycode_replace_dvorak[]={
{KEY_UNDERSCORE,KEY_BRACELEFT},
{KEY_EQUAL,KEY_BRACERIGHT},
{KEY_Q,KEY_APOSTROPHE},
{KEY_W,KEY_COMMA},
{KEY_E,KEY_PERIOD},
{KEY_R,KEY_P},
{KEY_T,KEY_Y},
{KEY_Y,KEY_F},
{KEY_U,KEY_G},
{KEY_I,KEY_C},
{KEY_O,KEY_R},
{KEY_P,KEY_L},
{KEY_BRACELEFT,KEY_SLASH},
{KEY_BRACERIGHT,KEY_EQUAL},
{KEY_A,KEY_A},
{KEY_S,KEY_O},
{KEY_D,KEY_E},
{KEY_F,KEY_U},
{KEY_G,KEY_I},
{KEY_H,KEY_D},
{KEY_J,KEY_H},
{KEY_K,KEY_T},
{KEY_L,KEY_N},
{KEY_SEMICOLON,KEY_S},
{KEY_APOSTROPHE,KEY_UNDERSCORE},
{KEY_Z,KEY_SEMICOLON},
{KEY_X,KEY_Q},
{KEY_C,KEY_J},
{KEY_V,KEY_K},
{KEY_B,KEY_X},
{KEY_N,KEY_B},
{KEY_M,KEY_M},
{KEY_COMMA,KEY_W},
{KEY_PERIOD,KEY_V},
{KEY_SLASH,KEY_Z},
{0,0}
};
static const _KeyCodeReplace _keycode_replace_neo[]={
{0,0}
};
int latin_keyboard_keycode_convert(int p_keycode) {
const _KeyCodeReplace *kcr=NULL;
switch(OS::get_singleton()->get_latin_keyboard_variant()) {
case OS::LATIN_KEYBOARD_QWERTY: return p_keycode; break;
case OS::LATIN_KEYBOARD_QWERTZ: kcr=_keycode_replace_qwertz; break;
case OS::LATIN_KEYBOARD_AZERTY: kcr=_keycode_replace_azerty; break;
case OS::LATIN_KEYBOARD_QZERTY: kcr=_keycode_replace_qzerty; break;
case OS::LATIN_KEYBOARD_DVORAK: kcr=_keycode_replace_dvorak; break;
case OS::LATIN_KEYBOARD_NEO: kcr=_keycode_replace_neo; break;
default: return p_keycode;
}
if (!kcr) {
return p_keycode;
}
while(kcr->from) {
if (kcr->from==p_keycode)
return kcr->to;
kcr++;
}
return p_keycode;
}