mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-10-06 18:06:33 +00:00
terminal: introduce row bit for kitty virtual placeholders
This commit is contained in:
@@ -7,6 +7,7 @@ const std = @import("std");
|
|||||||
const Allocator = std.mem.Allocator;
|
const Allocator = std.mem.Allocator;
|
||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
const fastmem = @import("../fastmem.zig");
|
const fastmem = @import("../fastmem.zig");
|
||||||
|
const kitty = @import("kitty.zig");
|
||||||
const point = @import("point.zig");
|
const point = @import("point.zig");
|
||||||
const pagepkg = @import("page.zig");
|
const pagepkg = @import("page.zig");
|
||||||
const stylepkg = @import("style.zig");
|
const stylepkg = @import("style.zig");
|
||||||
@@ -1056,6 +1057,11 @@ const ReflowCursor = struct {
|
|||||||
self.page_cell.style_id = id;
|
self.page_cell.style_id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy Kitty virtual placeholder status
|
||||||
|
if (cell.codepoint() == kitty.graphics.unicode.placeholder) {
|
||||||
|
self.page_row.kitty_virtual_placeholder = true;
|
||||||
|
}
|
||||||
|
|
||||||
self.cursorForward();
|
self.cursorForward();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -984,6 +984,16 @@ pub fn clearCells(
|
|||||||
if (cells.len == self.pages.cols) row.styled = false;
|
if (cells.len == self.pages.cols) row.styled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (row.kitty_virtual_placeholder and
|
||||||
|
cells.len == self.pages.cols)
|
||||||
|
{
|
||||||
|
for (cells) |c| {
|
||||||
|
if (c.codepoint() == kitty.graphics.unicode.placeholder) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else row.kitty_virtual_placeholder = false;
|
||||||
|
}
|
||||||
|
|
||||||
@memset(cells, self.blankCell());
|
@memset(cells, self.blankCell());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -640,6 +640,12 @@ fn printCell(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If this is a Kitty unicode placeholder then we need to mark the
|
||||||
|
// row so that the renderer can lookup rows with these much faster.
|
||||||
|
if (c == kitty.graphics.unicode.placeholder) {
|
||||||
|
self.screen.cursor.page_row.kitty_virtual_placeholder = true;
|
||||||
|
}
|
||||||
|
|
||||||
// We check for an active hyperlink first because setHyperlink
|
// We check for an active hyperlink first because setHyperlink
|
||||||
// handles clearing the old hyperlink and an optimization if we're
|
// handles clearing the old hyperlink and an optimization if we're
|
||||||
// overwriting the same hyperlink.
|
// overwriting the same hyperlink.
|
||||||
|
@@ -826,6 +826,9 @@ pub const Page = struct {
|
|||||||
src_cell.style_id,
|
src_cell.style_id,
|
||||||
) orelse src_cell.style_id;
|
) orelse src_cell.style_id;
|
||||||
}
|
}
|
||||||
|
if (src_cell.codepoint() == kitty.graphics.unicode.placeholder) {
|
||||||
|
dst_row.kitty_virtual_placeholder = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -913,6 +916,9 @@ pub const Page = struct {
|
|||||||
dst.hyperlink = true;
|
dst.hyperlink = true;
|
||||||
dst_row.hyperlink = true;
|
dst_row.hyperlink = true;
|
||||||
}
|
}
|
||||||
|
if (src.codepoint() == kitty.graphics.unicode.placeholder) {
|
||||||
|
dst_row.kitty_virtual_placeholder = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -932,6 +938,7 @@ pub const Page = struct {
|
|||||||
src_row.grapheme = false;
|
src_row.grapheme = false;
|
||||||
src_row.hyperlink = false;
|
src_row.hyperlink = false;
|
||||||
src_row.styled = false;
|
src_row.styled = false;
|
||||||
|
src_row.kitty_virtual_placeholder = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1029,6 +1036,16 @@ pub const Page = struct {
|
|||||||
if (cells.len == self.size.cols) row.styled = false;
|
if (cells.len == self.size.cols) row.styled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (row.kitty_virtual_placeholder and
|
||||||
|
cells.len == self.size.cols)
|
||||||
|
{
|
||||||
|
for (cells) |c| {
|
||||||
|
if (c.codepoint() == kitty.graphics.unicode.placeholder) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else row.kitty_virtual_placeholder = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Zero the cells as u64s since empirically this seems
|
// Zero the cells as u64s since empirically this seems
|
||||||
// to be a bit faster than using @memset(cells, .{})
|
// to be a bit faster than using @memset(cells, .{})
|
||||||
@memset(@as([]u64, @ptrCast(cells)), 0);
|
@memset(@as([]u64, @ptrCast(cells)), 0);
|
||||||
@@ -1552,7 +1569,11 @@ pub const Row = packed struct(u64) {
|
|||||||
/// running program, or "unknown" if it was never set.
|
/// running program, or "unknown" if it was never set.
|
||||||
semantic_prompt: SemanticPrompt = .unknown,
|
semantic_prompt: SemanticPrompt = .unknown,
|
||||||
|
|
||||||
_padding: u24 = 0,
|
/// True if this row contains a virtual placeholder for the Kitty
|
||||||
|
/// graphics protocol. (U+10EEEE)
|
||||||
|
kitty_virtual_placeholder: bool = false,
|
||||||
|
|
||||||
|
_padding: u23 = 0,
|
||||||
|
|
||||||
/// Semantic prompt type.
|
/// Semantic prompt type.
|
||||||
pub const SemanticPrompt = enum(u3) {
|
pub const SemanticPrompt = enum(u3) {
|
||||||
|
Reference in New Issue
Block a user