From 1ff0d5c4e57538463081c774dc40a6f8323e6cb9 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sun, 4 Jan 2015 22:39:21 -0300 Subject: [PATCH] -attempt to be friendlier on non english keyboards --- core/os/keyboard.cpp | 102 +++++++++- modules/gridmap/grid_map_editor_plugin.cpp | 6 +- platform/osx/os_osx.mm | 4 +- scene/gui/text_edit.cpp | 178 +++++++++--------- .../plugins/canvas_item_editor_plugin.cpp | 2 +- tools/editor/plugins/script_editor_plugin.cpp | 2 +- .../editor/plugins/spatial_editor_plugin.cpp | 12 +- 7 files changed, 203 insertions(+), 103 deletions(-) diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp index c9979d19214..e2a992ecb9a 100644 --- a/core/os/keyboard.cpp +++ b/core/os/keyboard.cpp @@ -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; } diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp index e621a5e061b..f2afffd3214 100644 --- a/modules/gridmap/grid_map_editor_plugin.cpp +++ b/modules/gridmap/grid_map_editor_plugin.cpp @@ -1222,9 +1222,9 @@ GridMapEditor::GridMapEditor(EditorNode *p_editor) { options->get_popup()->add_item("Cursor Rotate X",MENU_OPTION_CURSOR_ROTATE_X,KEY_A); options->get_popup()->add_item("Cursor Rotate Y",MENU_OPTION_CURSOR_ROTATE_Y,KEY_S); options->get_popup()->add_item("Cursor Rotate Z",MENU_OPTION_CURSOR_ROTATE_Z,KEY_D); - options->get_popup()->add_item("Cursor Back Rotate X",MENU_OPTION_CURSOR_ROTATE_X,KEY_ALT+KEY_A); - options->get_popup()->add_item("Cursor Back Rotate Y",MENU_OPTION_CURSOR_ROTATE_Y,KEY_ALT+KEY_S); - options->get_popup()->add_item("Cursor Back Rotate Z",MENU_OPTION_CURSOR_ROTATE_Z,KEY_ALT+KEY_D); + options->get_popup()->add_item("Cursor Back Rotate X",MENU_OPTION_CURSOR_ROTATE_X,KEY_MASK_SHIFT+KEY_A); + options->get_popup()->add_item("Cursor Back Rotate Y",MENU_OPTION_CURSOR_ROTATE_Y,KEY_MASK_SHIFT+KEY_S); + options->get_popup()->add_item("Cursor Back Rotate Z",MENU_OPTION_CURSOR_ROTATE_Z,KEY_MASK_SHIFT+KEY_D); options->get_popup()->add_item("Cursor Clear Rotation",MENU_OPTION_CURSOR_CLEAR_ROTATION,KEY_W); options->get_popup()->add_separator(); options->get_popup()->add_check_item("Duplicate Selects",MENU_OPTION_DUPLICATE_SELECTS); diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 643c287c958..1703ae4c492 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -694,7 +694,7 @@ static int translateKey(unsigned int key) ev.type=InputEvent::KEY; ev.key.pressed=true; ev.key.mod=translateFlags([event modifierFlags]); - ev.key.scancode = translateKey([event keyCode]); + ev.key.scancode = latin_keyboard_keycode_convert(translateKey([event keyCode])); ev.key.echo = [event isARepeat]; NSString* characters = [event characters]; @@ -740,7 +740,7 @@ static int translateKey(unsigned int key) ev.type=InputEvent::KEY; ev.key.pressed=false; ev.key.mod=translateFlags([event modifierFlags]); - ev.key.scancode = translateKey([event keyCode]); + ev.key.scancode = latin_keyboard_keycode_convert(translateKey([event keyCode])); OS_OSX::singleton->push_input(ev); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 50a440e91cf..d589b930492 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1293,106 +1293,108 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { break; bool valid=true; - if (k.mod.command || k.mod.alt || k.mod.meta) + if (k.mod.command || k.mod.meta) valid=false; if (valid) { - if (k.scancode==KEY_UP) { - - if (completion_index>0) { - completion_index--; + if (!k.mod.alt) { + if (k.scancode==KEY_UP) { + + if (completion_index>0) { + completion_index--; + completion_current=completion_options[completion_index]; + update(); + } + accept_event(); + return; + } + + + if (k.scancode==KEY_DOWN) { + + if (completion_index=completion_options.size()) + completion_index=completion_options.size()-1; completion_current=completion_options[completion_index]; update(); + accept_event(); + return; } - accept_event(); - return; - } - - if (k.scancode==KEY_PAGEUP) { - - completion_index-=get_constant("completion_lines"); - if (completion_index<0) + + if (k.scancode==KEY_HOME) { + completion_index=0; - completion_current=completion_options[completion_index]; - update(); - accept_event(); - return; - } - - - if (k.scancode==KEY_PAGEDOWN) { - - completion_index+=get_constant("completion_lines"); - if (completion_index>=completion_options.size()) - completion_index=completion_options.size()-1; - completion_current=completion_options[completion_index]; - update(); - accept_event(); - return; - } - - if (k.scancode==KEY_HOME) { - - completion_index=0; - completion_current=completion_options[completion_index]; - update(); - accept_event(); - return; - } - - if (k.scancode==KEY_END) { - - completion_index=completion_options.size()-1; - completion_current=completion_options[completion_index]; - update(); - accept_event(); - return; - } - - - if (k.scancode==KEY_DOWN) { - - if (completion_index32) { @@ -1972,7 +1974,7 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { } break; case KEY_U:{ - if (!k.mod.command || k.mod.shift || k.mod.alt) { + if (!k.mod.command || k.mod.shift) { scancode_handled=false; break; } @@ -2018,7 +2020,7 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { } } */ - if (!scancode_handled && !k.mod.command && !k.mod.alt) { //for german kbds + if (!scancode_handled && !k.mod.command) { //for german kbds if (k.unicode>=32) { diff --git a/tools/editor/plugins/canvas_item_editor_plugin.cpp b/tools/editor/plugins/canvas_item_editor_plugin.cpp index 482340ca00b..43ebebeb22a 100644 --- a/tools/editor/plugins/canvas_item_editor_plugin.cpp +++ b/tools/editor/plugins/canvas_item_editor_plugin.cpp @@ -2888,7 +2888,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { p->add_separator(); p->add_item("Copy Pose",ANIM_COPY_POSE); p->add_item("Paste Pose",ANIM_PASTE_POSE); - p->add_item("Clear Pose",ANIM_CLEAR_POSE,KEY_MASK_ALT|KEY_K); + p->add_item("Clear Pose",ANIM_CLEAR_POSE,KEY_MASK_SHIFT|KEY_K); value_dialog = memnew( AcceptDialog ); value_dialog->set_title("Set a Value"); diff --git a/tools/editor/plugins/script_editor_plugin.cpp b/tools/editor/plugins/script_editor_plugin.cpp index 439d8273c7d..55957887dcd 100644 --- a/tools/editor/plugins/script_editor_plugin.cpp +++ b/tools/editor/plugins/script_editor_plugin.cpp @@ -1578,7 +1578,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { menu_hb->add_child(file_menu); file_menu->set_text("File"); file_menu->get_popup()->add_item("Open",FILE_OPEN); - file_menu->get_popup()->add_item("Save",FILE_SAVE,KEY_MASK_ALT|KEY_S); + file_menu->get_popup()->add_item("Save",FILE_SAVE,KEY_MASK_ALT|KEY_MASK_CMD|KEY_S); file_menu->get_popup()->add_item("Save As..",FILE_SAVE_AS); file_menu->get_popup()->add_item("Save All",FILE_SAVE_ALL,KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_S); file_menu->get_popup()->connect("item_pressed", this,"_menu_option"); diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp index 0960a961ecd..87bd8105af6 100644 --- a/tools/editor/plugins/spatial_editor_plugin.cpp +++ b/tools/editor/plugins/spatial_editor_plugin.cpp @@ -3650,12 +3650,12 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { p->add_check_item("Use Default sRGB",MENU_VIEW_USE_DEFAULT_SRGB); p->add_separator(); - p->add_check_item("1 Viewport",MENU_VIEW_USE_1_VIEWPORT,KEY_MASK_ALT+KEY_1); - p->add_check_item("2 Viewports",MENU_VIEW_USE_2_VIEWPORTS,KEY_MASK_ALT+KEY_2); - p->add_check_item("2 Viewports (Alt)",MENU_VIEW_USE_2_VIEWPORTS_ALT,KEY_MASK_SHIFT+KEY_MASK_ALT+KEY_2); - p->add_check_item("3 Viewports",MENU_VIEW_USE_3_VIEWPORTS,KEY_MASK_ALT+KEY_3); - p->add_check_item("3 Viewports (Alt)",MENU_VIEW_USE_3_VIEWPORTS_ALT,KEY_MASK_SHIFT+KEY_MASK_ALT+KEY_3); - p->add_check_item("4 Viewports",MENU_VIEW_USE_4_VIEWPORTS,KEY_MASK_ALT+KEY_4); + p->add_check_item("1 Viewport",MENU_VIEW_USE_1_VIEWPORT,KEY_MASK_CMD+KEY_1); + p->add_check_item("2 Viewports",MENU_VIEW_USE_2_VIEWPORTS,KEY_MASK_CMD+KEY_2); + p->add_check_item("2 Viewports (Alt)",MENU_VIEW_USE_2_VIEWPORTS_ALT,KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_2); + p->add_check_item("3 Viewports",MENU_VIEW_USE_3_VIEWPORTS,KEY_MASK_CMD+KEY_3); + p->add_check_item("3 Viewports (Alt)",MENU_VIEW_USE_3_VIEWPORTS_ALT,KEY_MASK_SHIFT+KEY_MASK_CMD+KEY_3); + p->add_check_item("4 Viewports",MENU_VIEW_USE_4_VIEWPORTS,KEY_MASK_CMD+KEY_4); p->add_separator(); p->add_check_item("Display Normal",MENU_VIEW_DISPLAY_NORMAL);