terminal: add protected mode flag to cursor pen

This commit is contained in:
Mitchell Hashimoto
2023-09-25 09:38:42 -07:00
parent b67922c8ff
commit 2a390785f5
4 changed files with 44 additions and 0 deletions

View File

@ -232,6 +232,7 @@ pub const Cell = struct {
strikethrough: bool = false, strikethrough: bool = false,
underline: sgr.Attribute.Underline = .none, underline: sgr.Attribute.Underline = .none,
underline_color: bool = false, underline_color: bool = false,
protected: bool = false,
/// True if this is a wide character. This char takes up /// True if this is a wide character. This char takes up
/// two cells. The following cell ALWAYS is a space. /// two cells. The following cell ALWAYS is a space.

View File

@ -1728,6 +1728,24 @@ pub fn kittyGraphics(
return kitty.graphics.execute(alloc, self, cmd); return kitty.graphics.execute(alloc, self, cmd);
} }
/// Set the character protection mode for the terminal.
pub fn setProtectedMode(self: *Terminal, mode: ansi.ProtectedMode) void {
switch (mode) {
.off => {
self.screen.cursor.pen.attrs.protected = false;
},
// TODO: ISO/DEC have very subtle differences, so we should track that.
.iso => {
self.screen.cursor.pen.attrs.protected = true;
},
.dec => {
self.screen.cursor.pen.attrs.protected = true;
},
}
}
/// Full reset /// Full reset
pub fn fullReset(self: *Terminal, alloc: Allocator) void { pub fn fullReset(self: *Terminal, alloc: Allocator) void {
self.primaryScreen(alloc, .{ .clear_on_exit = true, .cursor_save = true }); self.primaryScreen(alloc, .{ .clear_on_exit = true, .cursor_save = true });
@ -2953,3 +2971,19 @@ test "Terminal: saveCursor with screen change" {
try testing.expect(t.screen.charset.gr == .G3); try testing.expect(t.screen.charset.gr == .G3);
try testing.expect(t.modes.get(.origin)); try testing.expect(t.modes.get(.origin));
} }
test "Terminal: setProtectedMode" {
const alloc = testing.allocator;
var t = try init(alloc, 3, 3);
defer t.deinit(alloc);
try testing.expect(!t.screen.cursor.pen.attrs.protected);
t.setProtectedMode(.off);
try testing.expect(!t.screen.cursor.pen.attrs.protected);
t.setProtectedMode(.iso);
try testing.expect(t.screen.cursor.pen.attrs.protected);
t.setProtectedMode(.dec);
try testing.expect(t.screen.cursor.pen.attrs.protected);
t.setProtectedMode(.off);
try testing.expect(!t.screen.cursor.pen.attrs.protected);
}

View File

@ -111,3 +111,11 @@ pub const ModifyKeyFormat = union(enum) {
function_keys: void, function_keys: void,
other_keys: enum { none, numeric_except, numeric }, other_keys: enum { none, numeric_except, numeric },
}; };
/// The protection modes that can be set for the terminal. See DECSCA and
/// ESC V, W.
pub const ProtectedMode = enum {
off,
iso, // ESC V, W
dec, // CSI Ps " q
};

View File

@ -28,6 +28,7 @@ pub const DeviceAttributeReq = ansi.DeviceAttributeReq;
pub const DeviceStatusReq = ansi.DeviceStatusReq; pub const DeviceStatusReq = ansi.DeviceStatusReq;
pub const Mode = modes.Mode; pub const Mode = modes.Mode;
pub const ModifyKeyFormat = ansi.ModifyKeyFormat; pub const ModifyKeyFormat = ansi.ModifyKeyFormat;
pub const ProtectedMode = ansi.ProtectedMode;
pub const StatusLineType = ansi.StatusLineType; pub const StatusLineType = ansi.StatusLineType;
pub const StatusDisplay = ansi.StatusDisplay; pub const StatusDisplay = ansi.StatusDisplay;
pub const EraseDisplay = csi.EraseDisplay; pub const EraseDisplay = csi.EraseDisplay;