termio: use new formatter, palette helper for kitty color protocol

This commit is contained in:
Mitchell Hashimoto
2024-08-20 23:36:34 -04:00
parent e12cfe80b0
commit e15db88656

View File

@ -1272,43 +1272,37 @@ pub const StreamHandler = struct {
pub fn sendKittyColorReport(self: *StreamHandler, request: terminal.osc.Command.KittyColorProtocol) !void { pub fn sendKittyColorReport(self: *StreamHandler, request: terminal.osc.Command.KittyColorProtocol) !void {
var buf = std.ArrayList(u8).init(self.alloc); var buf = std.ArrayList(u8).init(self.alloc);
errdefer buf.deinit(); defer buf.deinit();
const writer = buf.writer(); const writer = buf.writer();
try writer.writeAll("\x1b[21"); try writer.writeAll("\x1b[21");
for (request.list.items) |item| { for (request.list.items) |item| {
switch (item) { switch (item) {
.query => |key| { .query => |key| {
const i = @intFromEnum(key);
const color = switch (key) { const color = switch (key) {
.foreground => self.foreground_color, .foreground => self.foreground_color,
.background => self.background_color, .background => self.background_color,
.cursor => self.cursor_color, .cursor => self.cursor_color,
else => color: { else => if (key.palette()) |idx|
if (i > 255) { self.terminal.color_palette.colors[idx]
log.warn("ignoring unsupported kitty color protocol key: {s}", .{@tagName(key)}); else {
continue; log.warn("ignoring unsupported kitty color protocol key: {}", .{key});
} continue;
break :color self.terminal.color_palette.colors[i];
}, },
} orelse { } orelse {
log.warn("no color configured for: {s}", .{@tagName(key)}); log.warn("no color configured for: {s}", .{@tagName(key)});
continue; continue;
}; };
if (i <= 255)
try writer.print( try writer.print(
";{d}=rgb:{x:0>2}/{x:0>2}/{x:0>2}", ";{}=rgb:{x:0>2}/{x:0>2}/{x:0>2}",
.{ i, color.r, color.g, color.b }, .{ key, color.r, color.g, color.b },
) );
else
try writer.print(
";{s}=rgb:{x:0>2}/{x:0>2}/{x:0>2}",
.{ @tagName(key), color.r, color.g, color.b },
);
}, },
.set => |v| switch (v.key) { .set => |v| switch (v.key) {
.foreground => { .foreground => {
self.foreground_color = v.color; self.foreground_color = v.color;
// See messageWriter which has similar logic and // See messageWriter which has similar logic and
// explains why we may have to do this. // explains why we may have to do this.
const msg: renderer.Message = .{ const msg: renderer.Message = .{
@ -1322,6 +1316,7 @@ pub const StreamHandler = struct {
}, },
.background => { .background => {
self.background_color = v.color; self.background_color = v.color;
// See messageWriter which has similar logic and // See messageWriter which has similar logic and
// explains why we may have to do this. // explains why we may have to do this.
const msg: renderer.Message = .{ const msg: renderer.Message = .{
@ -1332,12 +1327,10 @@ pub const StreamHandler = struct {
defer self.renderer_state.mutex.lock(); defer self.renderer_state.mutex.lock();
_ = self.renderer_mailbox.push(msg, .{ .forever = {} }); _ = self.renderer_mailbox.push(msg, .{ .forever = {} });
} }
_ = self.renderer_mailbox.push(.{
.background_color = v.color,
}, .{ .forever = {} });
}, },
.cursor => { .cursor => {
self.cursor_color = v.color; self.cursor_color = v.color;
// See messageWriter which has similar logic and // See messageWriter which has similar logic and
// explains why we may have to do this. // explains why we may have to do this.
const msg: renderer.Message = .{ const msg: renderer.Message = .{
@ -1349,20 +1342,23 @@ pub const StreamHandler = struct {
_ = self.renderer_mailbox.push(msg, .{ .forever = {} }); _ = self.renderer_mailbox.push(msg, .{ .forever = {} });
} }
}, },
else => {
const i = @intFromEnum(v.key); else => if (v.key.palette()) |i| {
if (i > 255) {
log.warn("ignoring unsupported kitty color protocol key: {s}", .{@tagName(v.key)});
continue;
}
self.terminal.flags.dirty.palette = true; self.terminal.flags.dirty.palette = true;
self.terminal.color_palette.colors[i] = v.color; self.terminal.color_palette.colors[i] = v.color;
self.terminal.color_palette.mask.unset(i); self.terminal.color_palette.mask.unset(i);
} else {
log.warn(
"ignoring unsupported kitty color protocol key: {}",
.{v.key},
);
continue;
}, },
}, },
.reset => |key| switch (key) { .reset => |key| switch (key) {
.foreground => { .foreground => {
self.foreground_color = self.default_foreground_color; self.foreground_color = self.default_foreground_color;
// See messageWriter which has similar logic and // See messageWriter which has similar logic and
// explains why we may have to do this. // explains why we may have to do this.
const msg: renderer.Message = .{ const msg: renderer.Message = .{
@ -1376,6 +1372,7 @@ pub const StreamHandler = struct {
}, },
.background => { .background => {
self.background_color = self.default_background_color; self.background_color = self.default_background_color;
// See messageWriter which has similar logic and // See messageWriter which has similar logic and
// explains why we may have to do this. // explains why we may have to do this.
const msg: renderer.Message = .{ const msg: renderer.Message = .{
@ -1389,6 +1386,7 @@ pub const StreamHandler = struct {
}, },
.cursor => { .cursor => {
self.cursor_color = self.default_cursor_color; self.cursor_color = self.default_cursor_color;
// See messageWriter which has similar logic and // See messageWriter which has similar logic and
// explains why we may have to do this. // explains why we may have to do this.
const msg: renderer.Message = .{ const msg: renderer.Message = .{
@ -1400,15 +1398,17 @@ pub const StreamHandler = struct {
_ = self.renderer_mailbox.push(msg, .{ .forever = {} }); _ = self.renderer_mailbox.push(msg, .{ .forever = {} });
} }
}, },
else => {
const i = @intFromEnum(key); else => if (key.palette()) |i| {
if (i > 255) {
log.warn("ignoring unsupported kitty color protocol key: {s}", .{@tagName(key)});
continue;
}
self.terminal.flags.dirty.palette = true; self.terminal.flags.dirty.palette = true;
self.terminal.color_palette.colors[i] = self.terminal.default_palette[i]; self.terminal.color_palette.colors[i] = self.terminal.default_palette[i];
self.terminal.color_palette.mask.unset(i); self.terminal.color_palette.mask.unset(i);
} else {
log.warn(
"ignoring unsupported kitty color protocol key: {}",
.{key},
);
continue;
}, },
}, },
} }
@ -1416,13 +1416,11 @@ pub const StreamHandler = struct {
try writer.writeAll(request.terminator.string()); try writer.writeAll(request.terminator.string());
const msg = termio.Message{ self.messageWriter(.{
.write_alloc = .{ .write_alloc = .{
.alloc = self.alloc, .alloc = self.alloc,
.data = try buf.toOwnedSlice(), .data = try buf.toOwnedSlice(),
}, },
}; });
self.messageWriter(msg);
} }
}; };