diff options
author | 2016-09-12 13:40:32 -0400 | |
---|---|---|
committer | 2016-09-12 13:40:32 -0400 | |
commit | 4608dab901e67bd41bd99b9ea6625353bd4af75d (patch) | |
tree | dc9414cd5ff3c73bc3fcb2dc8a51f2851b20c7c1 | |
parent | 3368b8c11fd15798fc1eac0f5b5a20f643345997 (diff) | |
download | textadept-4608dab901e67bd41bd99b9ea6625353bd4af75d.tar.gz textadept-4608dab901e67bd41bd99b9ea6625353bd4af75d.zip |
Better handling of key bindings on international keyboards.
Try to ensure the default bindings work on international keyboards (e.g.
`Ctrl+я` should be `Ctrl+Z` on a Russian keyboard).
Thanks to Heck Fy.
-rw-r--r-- | THANKS.md | 1 | ||||
-rw-r--r-- | src/textadept.c | 15 |
2 files changed, 13 insertions, 3 deletions
@@ -37,6 +37,7 @@ private contract work related to Textadept. * Gabriel Dubatti * Gilles Grégoire * Giovanni Salmeri +* Heck Fy * Ivan Baidakou * Jay Gould * Jeff Stone diff --git a/src/textadept.c b/src/textadept.c index d9b1ce66..72446196 100644 --- a/src/textadept.c +++ b/src/textadept.c @@ -596,7 +596,6 @@ static int lce_focus(lua_State *L) { /** `ui.dialog()` Lua function. */ static int lui_dialog(lua_State *L) { - GTDialogType type = gtdialog_type(luaL_checkstring(L, 1)); int i, j, k, n = lua_gettop(L) - 1, argc = n; for (i = 2; i < n + 2; i++) if (lua_istable(L, i)) argc += lua_rawlen(L, i) - 1; @@ -611,7 +610,7 @@ static int lui_dialog(lua_State *L) { } } else argv[i++] = luaL_checkstring(L, j); argv[argc] = NULL; - char *out = gtdialog(type, argc, argv); + char *out = gtdialog(gtdialog_type(luaL_checkstring(L, 1)), argc, argv); lua_pushstring(L, out); free(out), free(argv); #if (CURSES && _WIN32) @@ -1941,8 +1940,18 @@ static void s_notify(Scintilla *view, int _, void *lParam, void*__) { } #if GTK -/** Signal for a Scintilla keypress. */ +/** + * Signal for a Scintilla keypress. + * Translate Ctrl-, Alt-, or Meta-modified keys to their group 0 key values + * (which are typically ASCII values) as necessary in order for bindings like + * Ctrl+Z to work on international keyboards. + */ static int s_keypress(GtkWidget*_, GdkEventKey *event, void*__) { + if (event->group > 0 && + (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_META_MASK))) + gdk_keymap_translate_keyboard_state(gdk_keymap_get_default(), + event->hardware_keycode, 0, 0, + &event->keyval, NULL, NULL, NULL); return lL_event(lua, "keypress", LUA_TNUMBER, event->keyval, event_mod(SHIFT), event_mod(CONTROL), event_mod(MOD1), event_mod(META), event_mod(LOCK), -1); |