From 860209e968f0a2438280dba989586b9e691ba022 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 20 Jun 2023 09:37:58 -0700 Subject: [PATCH] terminal: track underline color on cell --- src/terminal/Screen.zig | 9 ++++++++- src/terminal/Terminal.zig | 14 ++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/terminal/Screen.zig b/src/terminal/Screen.zig index 03dece7c6..6bacf9ded 100644 --- a/src/terminal/Screen.zig +++ b/src/terminal/Screen.zig @@ -182,6 +182,12 @@ pub const Cell = struct { fg: color.RGB = .{}, bg: color.RGB = .{}, + /// Underline color. + /// NOTE(mitchellh): This is very rarely set so ideally we wouldn't waste + /// cell space for this. For now its on this struct because it is convenient + /// but we should consider a lookaside table for this. + underline_fg: color.RGB = .{}, + /// On/off attributes that can be set attrs: packed struct { has_bg: bool = false, @@ -194,6 +200,7 @@ pub const Cell = struct { inverse: bool = false, strikethrough: bool = false, underline: sgr.Attribute.Underline = .none, + underline_color: bool = false, /// True if this is a wide character. This char takes up /// two cells. The following cell ALWAYS is a space. @@ -265,7 +272,7 @@ pub const Cell = struct { test { //log.warn("CELL={} bits={} {}", .{ @sizeOf(Cell), @bitSizeOf(Cell), @alignOf(Cell) }); - try std.testing.expectEqual(12, @sizeOf(Cell)); + try std.testing.expectEqual(16, @sizeOf(Cell)); } }; diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index 5a7622bae..0f0fef511 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -461,8 +461,18 @@ pub fn setAttribute(self: *Terminal, attr: sgr.Attribute) !void { self.screen.cursor.pen.attrs.underline = .none; }, - // TODO - .underline_color, .reset_underline_color => {}, + .underline_color => |rgb| { + self.screen.cursor.pen.attrs.underline_color = true; + self.screen.cursor.pen.underline_fg = .{ + .r = rgb.r, + .g = rgb.g, + .b = rgb.b, + }; + }, + + .reset_underline_color => { + self.screen.cursor.pen.attrs.underline_color = false; + }, .blink => { log.warn("blink requested, but not implemented", .{});