mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 00:36:07 +03:00
Merge pull request #2175 from qwerasd205/pagelist-fix
fix(terminal/PageList): update self.cols at start of resizeCols
This commit is contained in:
@ -563,6 +563,10 @@ fn resizeCols(
|
|||||||
) !void {
|
) !void {
|
||||||
assert(cols != self.cols);
|
assert(cols != self.cols);
|
||||||
|
|
||||||
|
// Update our cols. We have to do this early because grow() that we
|
||||||
|
// may call below relies on this to calculate the proper page size.
|
||||||
|
self.cols = cols;
|
||||||
|
|
||||||
// If we have a cursor position (x,y), then we try under any col resizing
|
// If we have a cursor position (x,y), then we try under any col resizing
|
||||||
// to keep the same number remaining active rows beneath it. This is a
|
// to keep the same number remaining active rows beneath it. This is a
|
||||||
// very special case if you can imagine clearing the screen (i.e.
|
// very special case if you can imagine clearing the screen (i.e.
|
||||||
@ -675,9 +679,6 @@ fn resizeCols(
|
|||||||
req_rows -= 1;
|
req_rows -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update our cols
|
|
||||||
self.cols = cols;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We use a cursor to track where we are in the src/dst. This is very
|
// We use a cursor to track where we are in the src/dst. This is very
|
||||||
@ -6152,6 +6153,70 @@ test "PageList resize reflow more cols wrapped rows" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "PageList resize reflow more cols creates multiple pages" {
|
||||||
|
const testing = std.testing;
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
|
||||||
|
// We want a wide viewport so our row limit is rather small. This will
|
||||||
|
// force the reflow below to create multiple pages, which we assert.
|
||||||
|
const cap = cap: {
|
||||||
|
var current: size.CellCountInt = 100;
|
||||||
|
while (true) : (current += 100) {
|
||||||
|
const cap = try std_capacity.adjust(.{ .cols = current });
|
||||||
|
if (cap.rows < 100) break :cap cap;
|
||||||
|
}
|
||||||
|
unreachable;
|
||||||
|
};
|
||||||
|
|
||||||
|
var s = try init(alloc, cap.cols, cap.rows, null);
|
||||||
|
defer s.deinit();
|
||||||
|
|
||||||
|
// Wrap every other row so every line is wrapped for reflow
|
||||||
|
{
|
||||||
|
try testing.expect(s.pages.first == s.pages.last);
|
||||||
|
const page = &s.pages.first.?.data;
|
||||||
|
for (0..s.rows) |y| {
|
||||||
|
if (y % 2 == 0) {
|
||||||
|
const rac = page.getRowAndCell(0, y);
|
||||||
|
rac.row.wrap = true;
|
||||||
|
} else {
|
||||||
|
const rac = page.getRowAndCell(0, y);
|
||||||
|
rac.row.wrap_continuation = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rac = page.getRowAndCell(0, y);
|
||||||
|
rac.cell.* = .{
|
||||||
|
.content_tag = .codepoint,
|
||||||
|
.content = .{ .codepoint = 'A' },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resize
|
||||||
|
const newcap = try cap.adjust(.{ .cols = cap.cols + 100 });
|
||||||
|
try testing.expect(newcap.rows < cap.rows);
|
||||||
|
try s.resize(.{ .cols = newcap.cols, .reflow = true });
|
||||||
|
try testing.expectEqual(@as(usize, newcap.cols), s.cols);
|
||||||
|
try testing.expectEqual(@as(usize, cap.rows), s.totalRows());
|
||||||
|
|
||||||
|
{
|
||||||
|
var count: usize = 0;
|
||||||
|
var it = s.pages.first;
|
||||||
|
while (it) |page| : (it = page.next) {
|
||||||
|
count += 1;
|
||||||
|
|
||||||
|
// All pages should have the new capacity
|
||||||
|
try testing.expectEqual(newcap.cols, page.data.capacity.cols);
|
||||||
|
try testing.expectEqual(newcap.rows, page.data.capacity.rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We should have more than one page, meaning we created at least
|
||||||
|
// one page. This is the critical aspect of this test so if this
|
||||||
|
// ever goes false we need to adjust this test.
|
||||||
|
try testing.expect(count > 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
test "PageList resize reflow more cols wrap across page boundary" {
|
test "PageList resize reflow more cols wrap across page boundary" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
|
Reference in New Issue
Block a user