aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/src/terminal/c/modes.zig
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-04-04 19:22:04 +0300
committerCan Celik <ogulcancelik@gmail.com>2026-04-05 01:23:06 +0300
commit41dd733ca7123c9ac4bfc6c781697a660e95b052 (patch)
tree3fc91815ca139ef2e0b281bba0abda4ef15175f4 /vendor/libghostty-vt/src/terminal/c/modes.zig
parent55c138263e190a1e79d4b997bfb9397306c0ec1f (diff)
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/src/terminal/c/modes.zig')
-rw-r--r--vendor/libghostty-vt/src/terminal/c/modes.zig104
1 files changed, 104 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/terminal/c/modes.zig b/vendor/libghostty-vt/src/terminal/c/modes.zig
new file mode 100644
index 00000000..449ce63e
--- /dev/null
+++ b/vendor/libghostty-vt/src/terminal/c/modes.zig
@@ -0,0 +1,104 @@
+const std = @import("std");
+const lib = @import("../lib.zig");
+const modes = @import("../modes.zig");
+const Result = @import("result.zig").Result;
+
+/// C: GhosttyModeReportState
+pub const ReportState = enum(c_int) {
+ _,
+
+ fn toZig(self: ReportState) ?modes.Report.State {
+ return std.meta.intToEnum(
+ modes.Report.State,
+ @intFromEnum(self),
+ ) catch null;
+ }
+};
+
+pub fn report_encode(
+ tag: modes.ModeTag.Backing,
+ state: ReportState,
+ out_: ?[*]u8,
+ out_len: usize,
+ out_written: *usize,
+) callconv(lib.calling_conv) Result {
+ const mode_tag: modes.ModeTag = @bitCast(tag);
+ const report: modes.Report = .{
+ .tag = mode_tag,
+ .state = state.toZig() orelse return .invalid_value,
+ };
+
+ var writer: std.Io.Writer = .fixed(if (out_) |out| out[0..out_len] else &.{});
+ report.encode(&writer) catch |err| switch (err) {
+ error.WriteFailed => {
+ var discarding: std.Io.Writer.Discarding = .init(&.{});
+ report.encode(&discarding.writer) catch unreachable;
+ out_written.* = @intCast(discarding.count);
+ return .out_of_space;
+ },
+ };
+
+ out_written.* = writer.end;
+ return .success;
+}
+
+test "encode DEC mode set" {
+ var buf: [modes.Report.max_size]u8 = undefined;
+ var written: usize = 0;
+ const tag: modes.ModeTag.Backing = @bitCast(modes.ModeTag{ .value = 1, .ansi = false });
+ const result = report_encode(tag, @enumFromInt(1), &buf, buf.len, &written);
+ try std.testing.expectEqual(.success, result);
+ try std.testing.expectEqualStrings("\x1B[?1;1$y", buf[0..written]);
+}
+
+test "encode DEC mode reset" {
+ var buf: [modes.Report.max_size]u8 = undefined;
+ var written: usize = 0;
+ const tag: modes.ModeTag.Backing = @bitCast(modes.ModeTag{ .value = 1, .ansi = false });
+ const result = report_encode(tag, @enumFromInt(2), &buf, buf.len, &written);
+ try std.testing.expectEqual(.success, result);
+ try std.testing.expectEqualStrings("\x1B[?1;2$y", buf[0..written]);
+}
+
+test "encode ANSI mode" {
+ var buf: [modes.Report.max_size]u8 = undefined;
+ var written: usize = 0;
+ const tag: modes.ModeTag.Backing = @bitCast(modes.ModeTag{ .value = 4, .ansi = true });
+ const result = report_encode(tag, @enumFromInt(1), &buf, buf.len, &written);
+ try std.testing.expectEqual(.success, result);
+ try std.testing.expectEqualStrings("\x1B[4;1$y", buf[0..written]);
+}
+
+test "encode not recognized" {
+ var buf: [modes.Report.max_size]u8 = undefined;
+ var written: usize = 0;
+ const tag: modes.ModeTag.Backing = @bitCast(modes.ModeTag{ .value = 9999, .ansi = false });
+ const result = report_encode(tag, @enumFromInt(0), &buf, buf.len, &written);
+ try std.testing.expectEqual(.success, result);
+ try std.testing.expectEqualStrings("\x1B[?9999;0$y", buf[0..written]);
+}
+
+test "encode with insufficient buffer" {
+ var buf: [1]u8 = undefined;
+ var written: usize = 0;
+ const tag: modes.ModeTag.Backing = @bitCast(modes.ModeTag{ .value = 1, .ansi = false });
+ const result = report_encode(tag, @enumFromInt(1), &buf, buf.len, &written);
+ try std.testing.expectEqual(.out_of_space, result);
+ try std.testing.expect(written > 1);
+}
+
+test "encode with invalid state" {
+ var buf: [modes.Report.max_size]u8 = undefined;
+ var written: usize = 0;
+ const tag: modes.ModeTag.Backing = @bitCast(modes.ModeTag{ .value = 1, .ansi = false });
+ const result = report_encode(tag, @enumFromInt(99), &buf, buf.len, &written);
+ try std.testing.expectEqual(.invalid_value, result);
+}
+
+test "encode with null buffer" {
+ var written: usize = 0;
+ const tag: modes.ModeTag.Backing = @bitCast(modes.ModeTag{ .value = 1, .ansi = false });
+ const result = report_encode(tag, @enumFromInt(1), null, 0, &written);
+ try std.testing.expectEqual(.out_of_space, result);
+ try std.testing.expect(written > 0);
+}