diff --git a/kitty/boss.py b/kitty/boss.py index 76fbe7b13..522a1f9fe 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -271,12 +271,13 @@ class Boss(Thread): @callback def on_text_input(self, window, codepoint, mods): - data = interpret_text_event(codepoint, mods) - if data: - w = self.active_window + w = self.active_window + if w is not None: + yield w if w is not None: - yield w - w.write_to_child(data) + data = interpret_text_event(codepoint, mods, w) + if data: + w.write_to_child(data) @callback def on_key(self, window, key, scancode, action, mods): diff --git a/kitty/keys.py b/kitty/keys.py index dd957e67f..4bcb6f6af 100644 --- a/kitty/keys.py +++ b/kitty/keys.py @@ -59,6 +59,7 @@ alt_codes = { range(defines.GLFW_KEY_SPACE, defines.GLFW_KEY_RIGHT_BRACKET + 1) ) } +alt_mods = (defines.GLFW_MOD_ALT, defines.GLFW_MOD_SHIFT | defines.GLFW_MOD_ALT) rmkx_key_map = smkx_key_map.copy() rmkx_key_map.update({ @@ -143,9 +144,9 @@ def interpret_key_event(key, scancode, mods, window, action): if mods == defines.GLFW_MOD_CONTROL and key in control_codes: # Map Ctrl-key to ascii control code data.extend(control_codes[key]) - elif mods == defines.GLFW_MOD_ALT and key in alt_codes: - # Map Alt+key to Esc-key - data.extend(alt_codes[key]) + elif mods in alt_mods and key in alt_codes: + # Handled by interpret text event + pass else: key_map = get_key_map(screen) x = key_map.get(key) @@ -156,8 +157,13 @@ def interpret_key_event(key, scancode, mods, window, action): return bytes(data) -def interpret_text_event(codepoint, mods): +def interpret_text_event(codepoint, mods, window): + screen = window.screen if mods > defines.GLFW_MOD_SHIFT: + if mods in alt_mods and not screen.extended_keyboard: + data = chr(codepoint).encode('utf-8') + if len(data) == 1: + return b'\x1b' + data return b'' # Handled by interpret_key_event above data = chr(codepoint).encode('utf-8') return data