diff --git a/README.asciidoc b/README.asciidoc index 17b88f3be..83ff26689 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -11,6 +11,7 @@ :sc_first_window: pass:quotes[`ctrl+shift+1`] :sc_fourth_window: pass:quotes[`ctrl+shift+4`] :sc_increase_font_size: pass:quotes[`ctrl+shift+equal`] +:sc_input_unicode_character: pass:quotes[`ctrl+shift+u`] :sc_move_tab_backward: pass:quotes[`ctrl+shift+,`] :sc_move_tab_forward: pass:quotes[`ctrl+shift+.`] :sc_move_window_backward: pass:quotes[`ctrl+shift+b`] @@ -226,6 +227,7 @@ windows are: |Decrease font size | {sc_decrease_font_size} |Restore font size | {sc_restore_font_size} |Toggle fullscreen | {sc_toggle_fullscreen} +|Input unicode character | {sc_input_unicode_character} |Pass current selection to program | {sc_pass_selection_to_program} |=== diff --git a/kittens/unicode_input/main.py b/kittens/unicode_input/main.py index 8d1e217ef..868cd2881 100644 --- a/kittens/unicode_input/main.py +++ b/kittens/unicode_input/main.py @@ -88,5 +88,5 @@ def main(args=sys.argv): handler = UnicodeInput() loop.loop(handler) if handler.current_char and loop.return_code == 0: - print(hex(ord(handler.current_char))[2:]) + print('OK:', hex(ord(handler.current_char))[2:]) raise SystemExit(loop.return_code) diff --git a/kitty/boss.py b/kitty/boss.py index fda25acf5..5c8c62155 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -3,6 +3,7 @@ # License: GPL v3 Copyright: 2016, Kovid Goyal import re +from functools import partial from gettext import gettext as _ from weakref import WeakValueDictionary @@ -196,6 +197,12 @@ def on_child_death(self, window_id): window = self.window_id_map.pop(window_id, None) if window is None: return + if window.action_on_close: + try: + window.action_on_close(window) + except Exception: + import traceback + traceback.print_exc() os_window_id = window.os_window_id window.destroy() tm = self.os_window_map.get(os_window_id) @@ -366,6 +373,29 @@ def display_scrollback(self, window, data): SpecialWindow( self.opts.scrollback_pager, data, _('History'), overlay_for=window.id)) + def input_unicode_character(self): + w = self.active_window + tab = self.active_tab + if w is not None and tab is not None and w.overlay_for is None: + overlay_window = tab.new_special_window( + SpecialWindow( + ['kitty', '+runpy', 'from kittens.unicode_input.main import main; main()'], + overlay_for=w.id)) + overlay_window.action_on_close = partial(self.send_unicode_character, w.id) + + def send_unicode_character(self, target_window_id, source_window): + w = self.window_id_map.get(target_window_id) + if w is not None: + output = str(source_window.screen.linebuf.line(0)) + if output.startswith('OK: '): + try: + text = chr(int(output.partition(' ')[2], 16)) + except Exception: + import traceback + traceback.print_exc() + else: + w.paste(text) + def switch_focus_to(self, window_idx): tab = self.active_tab tab.set_active_window_idx(window_idx) @@ -491,6 +521,8 @@ def new_window(self, *args): def new_window_with_cwd(self, *args): w = self.active_window + if w is None: + return self.new_window(*args) cwd_from = w.child.pid if w is not None else None self._new_window(args, cwd_from=cwd_from) diff --git a/kitty/kitty.conf b/kitty/kitty.conf index c69a4c1d8..ae51f9735 100644 --- a/kitty/kitty.conf +++ b/kitty/kitty.conf @@ -328,6 +328,7 @@ map ctrl+shift+equal increase_font_size map ctrl+shift+minus decrease_font_size map ctrl+shift+backspace restore_font_size map ctrl+shift+f11 toggle_fullscreen +map ctrl+shift+u input_unicode_character # Sending arbitrary text on shortcut key presses # You can tell kitty to send arbitrary (UTF-8) encoded text to diff --git a/kitty/window.py b/kitty/window.py index 16318f2b3..c0553f7bf 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -87,6 +87,7 @@ def setup_colors(screen, opts): class Window: def __init__(self, tab, child, opts, args, override_title=None): + self.action_on_close = None self.override_title = override_title self.overlay_window_id = None self.overlay_for = None