mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-15 00:06:09 +03:00
termio: use new formatter, palette helper for kitty color protocol
This commit is contained in:
@ -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);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user