mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 00:36:07 +03:00
handle graphemes with more than 1 joiner
This commit is contained in:
@ -1497,6 +1497,7 @@ pub fn testWriteString(self: *Screen, text: []const u8) !void {
|
|||||||
// Get our row
|
// Get our row
|
||||||
var row = self.getRow(.{ .active = y });
|
var row = self.getRow(.{ .active = y });
|
||||||
|
|
||||||
|
// If we have a previous cell, we check if we're part of a grapheme.
|
||||||
if (grapheme.cell) |prev_cell| {
|
if (grapheme.cell) |prev_cell| {
|
||||||
const grapheme_break = brk: {
|
const grapheme_break = brk: {
|
||||||
var state: i32 = 0;
|
var state: i32 = 0;
|
||||||
|
@ -474,22 +474,21 @@ pub fn print(self: *Terminal, c: u21) !void {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
var state: i32 = 0;
|
const grapheme_break = brk: {
|
||||||
const grapheme_break = if (!prev.cell.attrs.grapheme)
|
var state: i32 = 0;
|
||||||
utf8proc.graphemeBreakStateful(@intCast(u21, prev.cell.char), c, &state)
|
var cp1 = @intCast(u21, prev.cell.char);
|
||||||
else brk: {
|
if (prev.cell.attrs.grapheme) {
|
||||||
// We need to rebuild the state by processing the grapheme breaks
|
var it = row.codepointIterator(prev.x);
|
||||||
// for all the codepoints up to this point. This MUST exist because
|
while (it.next()) |cp2| {
|
||||||
// grapheme is only true iff this exists.
|
assert(!utf8proc.graphemeBreakStateful(
|
||||||
const points = self.screen.graphemes.getEntry(row.getId() + prev.x + 1).?;
|
cp1,
|
||||||
const cp1 = switch (points.value_ptr.*) {
|
cp2,
|
||||||
.one => |v| one: {
|
&state,
|
||||||
assert(!utf8proc.graphemeBreakStateful(@intCast(u21, prev.cell.char), v, &state));
|
));
|
||||||
break :one v;
|
|
||||||
},
|
|
||||||
|
|
||||||
else => @panic("NO"),
|
cp1 = cp2;
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break :brk utf8proc.graphemeBreakStateful(cp1, c, &state);
|
break :brk utf8proc.graphemeBreakStateful(cp1, c, &state);
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user