diff --git a/kitty/kittens.c b/kitty/kittens.c index be54d80ba..96618d5e8 100644 --- a/kitty/kittens.c +++ b/kitty/kittens.c @@ -54,6 +54,7 @@ read_response(int fd, monotonic_t timeout, PyObject *ans) { switch(state) { case START: if (ch == 0x1b) state = STARTING_ESC; + if (ch == 0x03) { PyErr_SetString(PyExc_KeyboardInterrupt, "User pressed Ctrl-c"); return false; } break; #define CASE(curr, q, next) case curr: state = ch == q ? next : START; break; CASE(STARTING_ESC, 'P', P); diff --git a/kitty/remote_control.py b/kitty/remote_control.py index 6d9677d0c..33c2a141b 100644 --- a/kitty/remote_control.py +++ b/kitty/remote_control.py @@ -467,8 +467,15 @@ def main(args: List[str]) -> None: original_send_cmd['cancel_async'] = True if encrypter is not None: send = encrypter(original_send_cmd) - do_io(global_opts.to, send, True, 10) + try: + do_io(global_opts.to, send, True, 10) + except KeyboardInterrupt: + sys.excepthook = lambda *a: print('Interrupted by user', file=sys.stderr) + raise raise SystemExit(f'Timed out after {response_timeout} seconds waiting for response from kitty') + except KeyboardInterrupt: + sys.excepthook = lambda *a: print('Interrupted by user', file=sys.stderr) + raise if no_response: return if not response.get('ok'):