use packed struct for modes

This commit is contained in:
Mitchell Hashimoto
2022-07-15 09:18:54 -07:00
parent fa2dcb683c
commit 1f12577b8c
2 changed files with 18 additions and 16 deletions

View File

@ -607,7 +607,7 @@ fn renderTimerCallback(t: *libuv.Timer) void {
win.grid.background = bg; win.grid.background = bg;
win.grid.foreground = fg; win.grid.foreground = fg;
} }
if (win.terminal.mode_reverse_colors) { if (win.terminal.modes.reverse_colors == 1) {
win.grid.background = fg; win.grid.background = fg;
win.grid.foreground = bg; win.grid.foreground = bg;
} }
@ -618,7 +618,7 @@ fn renderTimerCallback(t: *libuv.Timer) void {
g: f32, g: f32,
b: f32, b: f32,
a: f32, a: f32,
} = if (win.terminal.mode_reverse_colors) .{ } = if (win.terminal.modes.reverse_colors == 1) .{
.r = @intToFloat(f32, fg.r) / 255, .r = @intToFloat(f32, fg.r) / 255,
.g = @intToFloat(f32, fg.g) / 255, .g = @intToFloat(f32, fg.g) / 255,
.b = @intToFloat(f32, fg.b) / 255, .b = @intToFloat(f32, fg.b) / 255,
@ -699,12 +699,12 @@ pub fn setCursorUp(self: *Window, amount: u16) !void {
} }
pub fn setCursorCol(self: *Window, col: u16) !void { pub fn setCursorCol(self: *Window, col: u16) !void {
if (self.terminal.mode_origin) unreachable; // TODO if (self.terminal.modes.origin == 1) unreachable; // TODO
self.terminal.setCursorPos(self.terminal.cursor.y + 1, col); self.terminal.setCursorPos(self.terminal.cursor.y + 1, col);
} }
pub fn setCursorRow(self: *Window, row: u16) !void { pub fn setCursorRow(self: *Window, row: u16) !void {
if (self.terminal.mode_origin) unreachable; // TODO if (self.terminal.modes.origin == 1) unreachable; // TODO
self.terminal.setCursorPos(row, self.terminal.cursor.x + 1); self.terminal.setCursorPos(row, self.terminal.cursor.x + 1);
} }
@ -756,19 +756,19 @@ pub fn setTopAndBottomMargin(self: *Window, top: u16, bot: u16) !void {
pub fn setMode(self: *Window, mode: terminal.Mode, enabled: bool) !void { pub fn setMode(self: *Window, mode: terminal.Mode, enabled: bool) !void {
switch (mode) { switch (mode) {
.reverse_colors => { .reverse_colors => {
self.terminal.mode_reverse_colors = enabled; self.terminal.modes.reverse_colors = @boolToInt(enabled);
// Schedule a render since we changed colors // Schedule a render since we changed colors
try self.render_timer.schedule(); try self.render_timer.schedule();
}, },
.origin => { .origin => {
self.terminal.mode_origin = enabled; self.terminal.modes.origin = @boolToInt(enabled);
self.terminal.setCursorPos(1, 1); self.terminal.setCursorPos(1, 1);
}, },
.autowrap => { .autowrap => {
self.terminal.mode_autowrap = enabled; self.terminal.modes.autowrap = @boolToInt(enabled);
}, },
.bracketed_paste => self.bracketed_paste = true, .bracketed_paste => self.bracketed_paste = true,
@ -812,7 +812,7 @@ pub fn deviceStatusReport(
const pos: struct { const pos: struct {
x: usize, x: usize,
y: usize, y: usize,
} = if (self.terminal.mode_origin) .{ } = if (self.terminal.modes.origin == 1) .{
// TODO: what do we do if cursor is outside scrolling region? // TODO: what do we do if cursor is outside scrolling region?
.x = self.terminal.cursor.x, .x = self.terminal.cursor.x,
.y = self.terminal.cursor.y -| self.terminal.scrolling_region.top, .y = self.terminal.cursor.y -| self.terminal.scrolling_region.top,

View File

@ -41,11 +41,13 @@ cols: usize,
/// The current scrolling region. /// The current scrolling region.
scrolling_region: ScrollingRegion, scrolling_region: ScrollingRegion,
/// Modes /// Modes - This isn't exhaustive, since some modes (i.e. cursor origin)
// TODO: turn into a bitset probably /// are applied to the cursor and others aren't boolean yes/no.
mode_origin: bool = false, modes: packed struct {
mode_autowrap: bool = true, reverse_colors: u1 = 0, // 5,
mode_reverse_colors: bool = false, origin: u1 = 0, // 6
autowrap: u1 = 1, // 7
} = .{},
/// Scrolling region is the area of the screen designated where scrolling /// Scrolling region is the area of the screen designated where scrolling
/// occurs. Wen scrolling the screen, only this viewport is scrolled. /// occurs. Wen scrolling the screen, only this viewport is scrolled.
@ -207,7 +209,7 @@ pub fn print(self: *Terminal, c: u21) !void {
if (!self.screen.displayIsBottom()) self.screen.scroll(.{ .bottom = {} }); if (!self.screen.displayIsBottom()) self.screen.scroll(.{ .bottom = {} });
// If we're soft-wrapping, then handle that first. // If we're soft-wrapping, then handle that first.
if (self.cursor.pending_wrap and self.mode_autowrap) { if (self.cursor.pending_wrap and self.modes.autowrap == 1) {
// Mark that the cell is wrapped, which guarantees that there is // Mark that the cell is wrapped, which guarantees that there is
// at least one cell after it in the next row. // at least one cell after it in the next row.
const cell = self.screen.getCell(self.cursor.y, self.cursor.x); const cell = self.screen.getCell(self.cursor.y, self.cursor.x);
@ -329,7 +331,7 @@ pub fn setCursorPos(self: *Terminal, row: usize, col: usize) void {
y_offset: usize = 0, y_offset: usize = 0,
x_max: usize, x_max: usize,
y_max: usize, y_max: usize,
} = if (self.mode_origin) .{ } = if (self.modes.origin == 1) .{
.x_offset = 0, // TODO: left/right margins .x_offset = 0, // TODO: left/right margins
.x_max = self.cols, // TODO: left/right margins .x_max = self.cols, // TODO: left/right margins
.y_offset = self.scrolling_region.top + 1, .y_offset = self.scrolling_region.top + 1,
@ -904,7 +906,7 @@ test "Terminal: setCursorPosition" {
try testing.expect(!t.cursor.pending_wrap); try testing.expect(!t.cursor.pending_wrap);
// Origin mode // Origin mode
t.mode_origin = true; t.modes.origin = 1;
// No change without a scroll region // No change without a scroll region
t.setCursorPos(81, 81); t.setCursorPos(81, 81);