From 95fc1d64c89f90aa72cc45aa6617b50121f1a4e5 Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Sat, 11 Jan 2025 17:24:13 +0100 Subject: [PATCH 1/2] parse ConEmu OSC9;5 --- src/terminal/osc.zig | 38 ++++++++++++++++++++++++++++++++++++++ src/terminal/stream.zig | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 33d753c9f..01f017731 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -178,6 +178,9 @@ pub const Command = union(enum) { progress: ?u8 = null, }, + /// Wait input (OSC 9;5) + wait_input: void, + pub const ColorKind = union(enum) { palette: u8, foreground, @@ -377,6 +380,7 @@ pub const Parser = struct { conemu_progress_state, conemu_progress_prevalue, conemu_progress_value, + conemu_wait, }; /// This must be called to clean up any allocated memory. @@ -811,6 +815,11 @@ pub const Parser = struct { '4' => { self.state = .conemu_progress_prestate; }, + '5' => { + self.state = .conemu_wait; + self.command = .{ .wait_input = {} }; + self.complete = true; + }, // Todo: parse out other ConEmu operating system commands. // Even if we don't support them we probably don't want @@ -943,6 +952,11 @@ pub const Parser = struct { }, }, + .conemu_wait => { + self.state = .invalid; + self.complete = false; + }, + .query_fg_color => switch (c) { '?' => { self.command = .{ .report_color = .{ .kind = .foreground } }; @@ -2096,6 +2110,30 @@ test "OSC: OSC9 progress pause with progress" { try testing.expect(cmd.progress.progress == 100); } +test "OSC: OSC9 conemu wait input" { + const testing = std.testing; + + var p: Parser = .{}; + + const input = "9;5"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .wait_input); +} + +test "OSC: OSC9 conemu wait invalid input" { + const testing = std.testing; + + var p: Parser = .{}; + + const input = "9;5;"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b'); + try testing.expect(cmd == null); +} + test "OSC: empty param" { const testing = std.testing; diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index f75d86c0a..5657d63f4 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -1605,7 +1605,7 @@ pub fn Stream(comptime Handler: type) type { } else log.warn("unimplemented OSC callback: {}", .{cmd}); }, - .progress, .sleep, .show_message_box, .change_conemu_tab_title => { + .progress, .sleep, .show_message_box, .change_conemu_tab_title, .wait_input => { log.warn("unimplemented OSC callback: {}", .{cmd}); }, } From fc99c99b74f72776ac39ba8c3d9028e38f4db07d Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Sat, 11 Jan 2025 22:19:42 +0100 Subject: [PATCH 2/2] code review --- src/terminal/osc.zig | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 01f017731..10ba5b5e7 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -380,7 +380,6 @@ pub const Parser = struct { conemu_progress_state, conemu_progress_prevalue, conemu_progress_value, - conemu_wait, }; /// This must be called to clean up any allocated memory. @@ -816,7 +815,7 @@ pub const Parser = struct { self.state = .conemu_progress_prestate; }, '5' => { - self.state = .conemu_wait; + self.state = .swallow; self.command = .{ .wait_input = {} }; self.complete = true; }, @@ -952,11 +951,6 @@ pub const Parser = struct { }, }, - .conemu_wait => { - self.state = .invalid; - self.complete = false; - }, - .query_fg_color => switch (c) { '?' => { self.command = .{ .report_color = .{ .kind = .foreground } }; @@ -2122,16 +2116,16 @@ test "OSC: OSC9 conemu wait input" { try testing.expect(cmd == .wait_input); } -test "OSC: OSC9 conemu wait invalid input" { +test "OSC: OSC9 conemu wait ignores trailing characters" { const testing = std.testing; var p: Parser = .{}; - const input = "9;5;"; + const input = "9;5;foo"; for (input) |ch| p.next(ch); - const cmd = p.end('\x1b'); - try testing.expect(cmd == null); + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .wait_input); } test "OSC: empty param" {