fix: attempt to gracefully recover if we get stuck in a bracketed paste

This commit is contained in:
CJ van den Berg 2024-03-20 22:23:31 +01:00
parent 0c1815a946
commit 7f506a160e

View file

@ -636,8 +636,11 @@ fn send_mouse_drag(self: *Self, from: tp.pid_ref, m: tp.message) error{Exit}!boo
fn send_input(self: *Self, from: tp.pid_ref, m: tp.message) void { fn send_input(self: *Self, from: tp.pid_ref, m: tp.message) void {
tp.trace(tp.channel.input, m); tp.trace(tp.channel.input, m);
if (self.bracketed_paste) { if (self.bracketed_paste and self.handle_bracketed_paste_input(m) catch |e| {
self.handle_bracketed_paste_input(m) catch |e| self.logger.err("bracketed paste input handler", e); self.bracketed_paste_buffer.clearAndFree();
self.bracketed_paste = false;
return self.logger.err("bracketed paste input handler", e);
}) {
return; return;
} }
self.input_listeners.send(from, m) catch {}; self.input_listeners.send(from, m) catch {};
@ -961,19 +964,24 @@ fn handle_bracketed_paste_begin(self: *Self) tp.result {
self.bracketed_paste = true; self.bracketed_paste = true;
} }
fn handle_bracketed_paste_input(self: *Self, m: tp.message) tp.result { fn handle_bracketed_paste_input(self: *Self, m: tp.message) !bool {
var keypress: u32 = undefined; var keypress: u32 = undefined;
var egc: u32 = undefined; var egc: u32 = undefined;
if (try m.match(.{ "I", tp.number, tp.extract(&keypress), tp.extract(&egc), tp.string, tp.number })) { if (try m.match(.{ "I", tp.number, tp.extract(&keypress), tp.extract(&egc), tp.string, 0 })) {
switch (keypress) { switch (keypress) {
nc.key.ENTER => self.bracketed_paste_buffer.appendSlice("\n") catch |e| return tp.exit_error(e), nc.key.ENTER => try self.bracketed_paste_buffer.appendSlice("\n"),
else => if (!nc.key.synthesized_p(keypress)) { else => if (!nc.key.synthesized_p(keypress)) {
var buf: [6]u8 = undefined; var buf: [6]u8 = undefined;
const bytes = nc.ucs32_to_utf8(&[_]u32{egc}, &buf) catch |e| return tp.exit_error(e); const bytes = try nc.ucs32_to_utf8(&[_]u32{egc}, &buf);
self.bracketed_paste_buffer.appendSlice(buf[0..bytes]) catch |e| return tp.exit_error(e); try self.bracketed_paste_buffer.appendSlice(buf[0..bytes]);
} else {
try self.handle_bracketed_paste_end();
return false;
}, },
} }
return true;
} }
return false;
} }
fn handle_bracketed_paste_end(self: *Self) tp.result { fn handle_bracketed_paste_end(self: *Self) tp.result {