mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 08:46:08 +03:00
terminal/new: resize tests
This commit is contained in:
@ -3,6 +3,10 @@
|
|||||||
//! on that grid. This also maintains the scrollback buffer.
|
//! on that grid. This also maintains the scrollback buffer.
|
||||||
const Terminal = @This();
|
const Terminal = @This();
|
||||||
|
|
||||||
|
// TODO on new terminal branch:
|
||||||
|
// - page splitting
|
||||||
|
// - resize tests when multiple pages are required
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
@ -1950,6 +1954,61 @@ pub fn printAttributes(self: *Terminal, buf: []u8) ![]const u8 {
|
|||||||
return stream.getWritten();
|
return stream.getWritten();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Resize the underlying terminal.
|
||||||
|
pub fn resize(
|
||||||
|
self: *Terminal,
|
||||||
|
alloc: Allocator,
|
||||||
|
cols: size.CellCountInt,
|
||||||
|
rows: size.CellCountInt,
|
||||||
|
) !void {
|
||||||
|
// If our cols/rows didn't change then we're done
|
||||||
|
if (self.cols == cols and self.rows == rows) return;
|
||||||
|
|
||||||
|
// Resize our tabstops
|
||||||
|
if (self.cols != cols) {
|
||||||
|
self.tabstops.deinit(alloc);
|
||||||
|
self.tabstops = try Tabstops.init(alloc, cols, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're making the screen smaller, dealloc the unused items.
|
||||||
|
if (self.active_screen == .primary) {
|
||||||
|
self.clearPromptForResize();
|
||||||
|
if (self.modes.get(.wraparound)) {
|
||||||
|
try self.screen.resize(rows, cols);
|
||||||
|
} else {
|
||||||
|
try self.screen.resizeWithoutReflow(rows, cols);
|
||||||
|
}
|
||||||
|
try self.secondary_screen.resizeWithoutReflow(rows, cols);
|
||||||
|
} else {
|
||||||
|
try self.screen.resizeWithoutReflow(rows, cols);
|
||||||
|
if (self.modes.get(.wraparound)) {
|
||||||
|
try self.secondary_screen.resize(rows, cols);
|
||||||
|
} else {
|
||||||
|
try self.secondary_screen.resizeWithoutReflow(rows, cols);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set our size
|
||||||
|
self.cols = cols;
|
||||||
|
self.rows = rows;
|
||||||
|
|
||||||
|
// Reset the scrolling region
|
||||||
|
self.scrolling_region = .{
|
||||||
|
.top = 0,
|
||||||
|
.bottom = rows - 1,
|
||||||
|
.left = 0,
|
||||||
|
.right = cols - 1,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If shell_redraws_prompt is true and we're on the primary screen,
|
||||||
|
/// then this will clear the screen from the cursor down if the cursor is
|
||||||
|
/// on a prompt in order to allow the shell to redraw the prompt.
|
||||||
|
fn clearPromptForResize(self: *Terminal) void {
|
||||||
|
// TODO
|
||||||
|
_ = self;
|
||||||
|
}
|
||||||
|
|
||||||
/// Options for switching to the alternate screen.
|
/// Options for switching to the alternate screen.
|
||||||
pub const AlternateScreenOptions = struct {
|
pub const AlternateScreenOptions = struct {
|
||||||
cursor_save: bool = false,
|
cursor_save: bool = false,
|
||||||
@ -7455,3 +7514,78 @@ test "Terminal: fullReset status display" {
|
|||||||
t.fullReset();
|
t.fullReset();
|
||||||
try testing.expect(t.status_display == .main);
|
try testing.expect(t.status_display == .main);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/mitchellh/ghostty/issues/272
|
||||||
|
// This is also tested in depth in screen resize tests but I want to keep
|
||||||
|
// this test around to ensure we don't regress at multiple layers.
|
||||||
|
test "Terminal: resize less cols with wide char then print" {
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
var t = try init(alloc, 3, 3);
|
||||||
|
defer t.deinit(alloc);
|
||||||
|
|
||||||
|
try t.print('x');
|
||||||
|
try t.print('😀'); // 0x1F600
|
||||||
|
try t.resize(alloc, 2, 3);
|
||||||
|
t.setCursorPos(1, 2);
|
||||||
|
try t.print('😀'); // 0x1F600
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/mitchellh/ghostty/issues/723
|
||||||
|
// This was found via fuzzing so its highly specific.
|
||||||
|
test "Terminal: resize with left and right margin set" {
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
const cols = 70;
|
||||||
|
const rows = 23;
|
||||||
|
var t = try init(alloc, cols, rows);
|
||||||
|
defer t.deinit(alloc);
|
||||||
|
|
||||||
|
t.modes.set(.enable_left_and_right_margin, true);
|
||||||
|
try t.print('0');
|
||||||
|
t.modes.set(.enable_mode_3, true);
|
||||||
|
try t.resize(alloc, cols, rows);
|
||||||
|
t.setLeftAndRightMargin(2, 0);
|
||||||
|
try t.printRepeat(1850);
|
||||||
|
_ = t.modes.restore(.enable_mode_3);
|
||||||
|
try t.resize(alloc, cols, rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/mitchellh/ghostty/issues/1343
|
||||||
|
test "Terminal: resize with wraparound off" {
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
const cols = 4;
|
||||||
|
const rows = 2;
|
||||||
|
var t = try init(alloc, cols, rows);
|
||||||
|
defer t.deinit(alloc);
|
||||||
|
|
||||||
|
t.modes.set(.wraparound, false);
|
||||||
|
try t.print('0');
|
||||||
|
try t.print('1');
|
||||||
|
try t.print('2');
|
||||||
|
try t.print('3');
|
||||||
|
const new_cols = 2;
|
||||||
|
try t.resize(alloc, new_cols, rows);
|
||||||
|
|
||||||
|
const str = try t.plainString(testing.allocator);
|
||||||
|
defer testing.allocator.free(str);
|
||||||
|
try testing.expectEqualStrings("01", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "Terminal: resize with wraparound on" {
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
const cols = 4;
|
||||||
|
const rows = 2;
|
||||||
|
var t = try init(alloc, cols, rows);
|
||||||
|
defer t.deinit(alloc);
|
||||||
|
|
||||||
|
t.modes.set(.wraparound, true);
|
||||||
|
try t.print('0');
|
||||||
|
try t.print('1');
|
||||||
|
try t.print('2');
|
||||||
|
try t.print('3');
|
||||||
|
const new_cols = 2;
|
||||||
|
try t.resize(alloc, new_cols, rows);
|
||||||
|
|
||||||
|
const str = try t.plainString(testing.allocator);
|
||||||
|
defer testing.allocator.free(str);
|
||||||
|
try testing.expectEqualStrings("01\n23", str);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user