terminal: request mode

This commit is contained in:
Mitchell Hashimoto
2025-10-23 20:17:23 -07:00
parent b6ac4c764f
commit 25eee9379d
2 changed files with 39 additions and 11 deletions

View File

@@ -73,6 +73,8 @@ pub const Action = union(Key) {
reset_mode: Mode,
save_mode: Mode,
restore_mode: Mode,
request_mode: Mode,
request_mode_unknown: RawMode,
modify_key_format: ansi.ModifyKeyFormat,
pub const Key = lib.Enum(
@@ -121,6 +123,8 @@ pub const Action = union(Key) {
"reset_mode",
"save_mode",
"restore_mode",
"request_mode",
"request_mode_unknown",
"modify_key_format",
},
);
@@ -180,6 +184,11 @@ pub const Action = union(Key) {
return @bitCast(self.mode);
}
};
pub const RawMode = extern struct {
mode: u16,
ansi: bool,
};
};
/// Returns a type that can process a stream of tty control characters.
@@ -1242,9 +1251,16 @@ pub fn Stream(comptime Handler: type) type {
break :decrqm;
}
if (@hasDecl(T, "requestMode")) {
try self.handler.requestMode(input.params[0], ansi_mode);
} else log.warn("unimplemented DECRQM callback: {f}", .{input});
const mode_raw = input.params[0];
const mode = modes.modeFromInt(mode_raw, ansi_mode);
if (mode) |m| {
try self.handler.vt(.request_mode, .{ .mode = m });
} else {
try self.handler.vt(.request_mode_unknown, .{
.mode = mode_raw,
.ansi = ansi_mode,
});
}
},
else => log.warn(