aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2016-09-12 13:40:32 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2016-09-12 13:40:32 -0400
commit4608dab901e67bd41bd99b9ea6625353bd4af75d (patch)
treedc9414cd5ff3c73bc3fcb2dc8a51f2851b20c7c1 /src
parent3368b8c11fd15798fc1eac0f5b5a20f643345997 (diff)
downloadtextadept-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.
Diffstat (limited to 'src')
-rw-r--r--src/textadept.c15
1 files changed, 12 insertions, 3 deletions
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);