diff --git a/kitty/parser.c b/kitty/parser.c index 97be57c9b..a5fa03544 100644 --- a/kitty/parser.c +++ b/kitty/parser.c @@ -1080,11 +1080,22 @@ dispatch_dcs(Screen *screen, PyObject DUMP_UNUSED *dump_callback) { screen_handle_print(screen, msg); Py_DECREF(msg); } else PyErr_Clear(); +#undef PRINT_PREFIX +#define ECHO_PREFIX "kitty-echo|" + } else if (startswith(screen->parser_buf + 1, screen->parser_buf_pos - 1, ECHO_PREFIX)) { + const size_t pp_size = sizeof(ECHO_PREFIX); + PyObject *msg = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, screen->parser_buf + pp_size, screen->parser_buf_pos - pp_size); + if (msg != NULL) { + REPORT_OSC2(screen_handle_echo, (char)screen->parser_buf[0], msg); + screen_handle_echo(screen, msg); + Py_DECREF(msg); + } else PyErr_Clear(); +#undef ECHO_PREFIX + } else { REPORT_ERROR("Unrecognized DCS @ code: 0x%x", screen->parser_buf[1]); } break; -#undef PRINT_PREFIX default: REPORT_ERROR("Unrecognized DCS code: 0x%x", screen->parser_buf[0]); break; diff --git a/kitty/screen.c b/kitty/screen.c index 85414fa9e..453608721 100644 --- a/kitty/screen.c +++ b/kitty/screen.c @@ -2104,6 +2104,13 @@ screen_handle_print(Screen *self, PyObject *msg) { CALLBACK("handle_remote_print", "O", msg); } +void +screen_handle_echo(Screen *self, PyObject *msg) { + Py_ssize_t sz; + const char *bytes = PyUnicode_AsUTF8AndSize(msg, &sz); + write_to_child(self, bytes, sz); +} + void screen_request_capabilities(Screen *self, char c, PyObject *q) { static char buf[128]; diff --git a/kitty/screen.h b/kitty/screen.h index f557b71e2..baca3e7f8 100644 --- a/kitty/screen.h +++ b/kitty/screen.h @@ -208,6 +208,7 @@ void screen_push_colors(Screen *, unsigned int); void screen_pop_colors(Screen *, unsigned int); void screen_report_color_stack(Screen *); void screen_handle_print(Screen *, PyObject *cmd); +void screen_handle_echo(Screen *, PyObject *cmd); void screen_designate_charset(Screen *, uint32_t which, uint32_t as); void screen_use_latin1(Screen *, bool); void set_title(Screen *self, PyObject*);