From dedaf6caf765db6e0e0fd10d872da973e439716c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 12 Jan 2017 10:17:21 +0530 Subject: [PATCH] Fix Ctrl/Alt+key not working on systems with alternate keyboard layouts Fixes #17 --- kitty/data-types.c | 9 +-------- kitty/glfw.c | 7 +++++++ kitty/glfw.h | 13 +++++++++++++ kitty/keys.py | 11 +++++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/kitty/data-types.c b/kitty/data-types.c index 4b886e70233..87313948abc 100644 --- a/kitty/data-types.c +++ b/kitty/data-types.c @@ -27,14 +27,7 @@ static PyMethodDef module_methods[] = { {"parse_bytes_dump", (PyCFunction)parse_bytes_dump, METH_VARARGS, ""}, {"read_bytes", (PyCFunction)read_bytes, METH_VARARGS, ""}, {"read_bytes_dump", (PyCFunction)read_bytes_dump, METH_VARARGS, ""}, - {"glfw_set_error_callback", (PyCFunction)glfw_set_error_callback, METH_O, ""}, - {"glfw_init", (PyCFunction)glfw_init, METH_NOARGS, ""}, - {"glfw_terminate", (PyCFunction)glfw_terminate, METH_NOARGS, ""}, - {"glfw_window_hint", (PyCFunction)glfw_window_hint, METH_VARARGS, ""}, - {"glfw_swap_interval", (PyCFunction)glfw_swap_interval, METH_VARARGS, ""}, - {"glfw_wait_events", (PyCFunction)glfw_wait_events, METH_VARARGS, ""}, - {"glfw_post_empty_event", (PyCFunction)glfw_post_empty_event, METH_NOARGS, ""}, - {"glfw_get_physical_dpi", (PyCFunction)glfw_get_physical_dpi, METH_NOARGS, ""}, + GLFW_FUNC_WRAPPERS {NULL, NULL, 0, NULL} /* Sentinel */ }; diff --git a/kitty/glfw.c b/kitty/glfw.c index d77d1c41c6d..8024c5952fd 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -192,6 +192,13 @@ glfw_get_physical_dpi(PyObject UNUSED *self) { return Py_BuildValue("ff", dpix, dpiy); } +PyObject* +glfw_get_key_name(PyObject UNUSED *self, PyObject *args) { + int key, scancode; + if (!PyArg_ParseTuple(args, "ii", &key, &scancode)) return NULL; + return Py_BuildValue("s", glfwGetKeyName(key, scancode)); +} + // }}} static void diff --git a/kitty/glfw.h b/kitty/glfw.h index e807d2d4009..e6b1f25300e 100644 --- a/kitty/glfw.h +++ b/kitty/glfw.h @@ -16,3 +16,16 @@ PyObject* glfw_swap_interval(PyObject UNUSED *self, PyObject *args); PyObject* glfw_wait_events(PyObject UNUSED *self, PyObject*); PyObject* glfw_post_empty_event(PyObject UNUSED *self); PyObject* glfw_get_physical_dpi(PyObject UNUSED *self); +PyObject* glfw_get_key_name(PyObject UNUSED *self); + +#define GLFW_FUNC_WRAPPERS \ + {"glfw_set_error_callback", (PyCFunction)glfw_set_error_callback, METH_O, ""}, \ + {"glfw_init", (PyCFunction)glfw_init, METH_NOARGS, ""}, \ + {"glfw_terminate", (PyCFunction)glfw_terminate, METH_NOARGS, ""}, \ + {"glfw_window_hint", (PyCFunction)glfw_window_hint, METH_VARARGS, ""}, \ + {"glfw_swap_interval", (PyCFunction)glfw_swap_interval, METH_VARARGS, ""}, \ + {"glfw_wait_events", (PyCFunction)glfw_wait_events, METH_VARARGS, ""}, \ + {"glfw_post_empty_event", (PyCFunction)glfw_post_empty_event, METH_NOARGS, ""}, \ + {"glfw_get_physical_dpi", (PyCFunction)glfw_get_physical_dpi, METH_NOARGS, ""}, \ + {"glfw_get_key_name", (PyCFunction)glfw_get_key_name, METH_VARARGS, ""}, \ + diff --git a/kitty/keys.py b/kitty/keys.py index bea6db165a7..2dba8c73bcc 100644 --- a/kitty/keys.py +++ b/kitty/keys.py @@ -49,8 +49,19 @@ alt_codes = {k: (0x1b, k) for i, k in enumerate(range(defines.GLFW_KEY_SPACE, defines.GLFW_KEY_RIGHT_BRACKET + 1))} +valid_localized_key_names = { + k: getattr(defines, 'GLFW_KEY_' + k) for k in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' +} + + +def get_localized_key(key, scancode): + name = defines.glfw_get_key_name(key, scancode) + return valid_localized_key_names.get((name or '').upper(), key) + + def interpret_key_event(key, scancode, mods): data = bytearray() + key = get_localized_key(key, scancode) if mods == defines.GLFW_MOD_CONTROL and key in control_codes: # Map Ctrl-key to ascii control code data.extend(control_codes[key])