diff --git a/kitty/boss.py b/kitty/boss.py index 130807e17..90298e879 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -97,23 +97,24 @@ class Boss: self.child_monitor.add_child(window.id, window.child.pid, window.child.child_fd, window.screen) self.window_id_map[window.id] = window - def peer_msg_received(self, msg): + def peer_messages_received(self, messages): import json - msg = json.loads(msg.decode('utf-8')) - if isinstance(msg, dict) and msg.get('cmd') == 'new_instance': - startup_id = msg.get('startup_id') - args, rest = parse_args(msg['args'][1:]) - args.args = rest - opts = create_opts(args) - session = create_session(opts, args) - os_window_id = self.add_os_window(session, wclass=args.cls, wname=args.name, size=initial_window_size(opts), visible=False) - if startup_id: - ctx = init_startup_notification(os_window_id, startup_id) - show_window(os_window_id) - if startup_id: - end_startup_notification(ctx) - else: - safe_print('Unknown message received from peer, ignoring') + for msg in messages: + msg = json.loads(msg.decode('utf-8')) + if isinstance(msg, dict) and msg.get('cmd') == 'new_instance': + startup_id = msg.get('startup_id') + args, rest = parse_args(msg['args'][1:]) + args.args = rest + opts = create_opts(args) + session = create_session(opts, args) + os_window_id = self.add_os_window(session, wclass=args.cls, wname=args.name, size=initial_window_size(opts), visible=False) + if startup_id: + ctx = init_startup_notification(os_window_id, startup_id) + show_window(os_window_id) + if startup_id: + end_startup_notification(ctx) + else: + safe_print('Unknown message received from peer, ignoring') def on_child_death(self, window_id): window = self.window_id_map.pop(window_id, None) diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index 909d5ea08..7cc6a085b 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -339,11 +339,15 @@ parse_input(ChildMonitor *self) { } if (UNLIKELY(self->messages_count)) { - while(self->messages_count) { - Message *m = self->messages + --self->messages_count; - msg = PyBytes_FromStringAndSize(m->data, m->sz); - free(m->data); m->data = NULL; m->sz = 0; - } + msg = PyTuple_New(self->messages_count); + if (msg) { + for (size_t i = 0; i < self->messages_count; i++) { + Message *m = self->messages + i; + PyTuple_SET_ITEM(msg, i, PyBytes_FromStringAndSize(m->data, m->sz)); + free(m->data); m->data = NULL; m->sz = 0; + } + self->messages_count = 0; + } else fatal("Out of memory"); } if (UNLIKELY(signal_received)) { @@ -357,7 +361,7 @@ parse_input(ChildMonitor *self) { } children_mutex(unlock); if (msg) { - call_boss(peer_msg_received, "O", msg); + call_boss(peer_messages_received, "(O)", msg); Py_CLEAR(msg); }