aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/src/terminal/device_status.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/device_status.zig
parent55c138263e190a1e79d4b997bfb9397306c0ec1f (diff)
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/src/terminal/device_status.zig')
-rw-r--r--vendor/libghostty-vt/src/terminal/device_status.zig74
1 files changed, 74 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/terminal/device_status.zig b/vendor/libghostty-vt/src/terminal/device_status.zig
new file mode 100644
index 00000000..42b4bf01
--- /dev/null
+++ b/vendor/libghostty-vt/src/terminal/device_status.zig
@@ -0,0 +1,74 @@
+const std = @import("std");
+const lib = @import("lib.zig");
+
+/// The color scheme reported in response to a CSI ? 996 n query.
+pub const ColorScheme = lib.Enum(lib.target, &.{
+ "light",
+ "dark",
+});
+
+/// An enum(u16) of the available device status requests.
+pub const Request = dsr_enum: {
+ const EnumField = std.builtin.Type.EnumField;
+ var fields: [entries.len]EnumField = undefined;
+ for (entries, 0..) |entry, i| {
+ fields[i] = .{
+ .name = entry.name,
+ .value = @as(Tag.Backing, @bitCast(Tag{
+ .value = entry.value,
+ .question = entry.question,
+ })),
+ };
+ }
+
+ break :dsr_enum @Type(.{ .@"enum" = .{
+ .tag_type = Tag.Backing,
+ .fields = &fields,
+ .decls = &.{},
+ .is_exhaustive = true,
+ } });
+};
+
+/// The tag type for our enum is a u16 but we use a packed struct
+/// in order to pack the question bit into the tag. The "u16" size is
+/// chosen somewhat arbitrarily to match the largest expected size
+/// we see as a multiple of 8 bits.
+pub const Tag = packed struct(u16) {
+ pub const Backing = @typeInfo(@This()).@"struct".backing_integer.?;
+ value: u15,
+ question: bool = false,
+
+ test "order" {
+ const t: Tag = .{ .value = 1 };
+ const int: Backing = @bitCast(t);
+ try std.testing.expectEqual(@as(Backing, 1), int);
+ }
+};
+
+pub fn reqFromInt(v: u16, question: bool) ?Request {
+ inline for (entries) |entry| {
+ if (entry.value == v and entry.question == question) {
+ const tag: Tag = .{ .question = question, .value = entry.value };
+ const int: Tag.Backing = @bitCast(tag);
+ return @enumFromInt(int);
+ }
+ }
+
+ return null;
+}
+
+/// A single entry of a possible device status request we support. The
+/// "question" field determines if it is valid with or without the "?"
+/// prefix.
+const Entry = struct {
+ name: [:0]const u8,
+ value: comptime_int,
+ question: bool = false, // "?" request
+};
+
+/// The full list of device status request entries.
+const entries: []const Entry = &.{
+ .{ .name = "operating_status", .value = 5 },
+ .{ .name = "cursor_position", .value = 6 },
+ .{ .name = "color_scheme", .value = 996, .question = true },
+};