mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
core: configurable scrollback limit
This commit is contained in:
2
TODO.md
2
TODO.md
@ -25,5 +25,3 @@ paged-terminal branch:
|
|||||||
|
|
||||||
- tests and logic for overflowing page capacities:
|
- tests and logic for overflowing page capacities:
|
||||||
* graphemes
|
* graphemes
|
||||||
* styles
|
|
||||||
- configurable scrollback size
|
|
||||||
|
@ -427,6 +427,27 @@ command: ?[]const u8 = null,
|
|||||||
/// command.
|
/// command.
|
||||||
@"abnormal-command-exit-runtime": u32 = 250,
|
@"abnormal-command-exit-runtime": u32 = 250,
|
||||||
|
|
||||||
|
/// The size of the scrollback buffer in bytes. This also includes the active
|
||||||
|
/// screen. No matter what this is set to, enough memory will always be
|
||||||
|
/// allocated for the visible screen and anything leftover is the limit for
|
||||||
|
/// the scrollback.
|
||||||
|
///
|
||||||
|
/// When this limit is reached, the oldest lines are removed from the
|
||||||
|
/// scrollback.
|
||||||
|
///
|
||||||
|
/// Scrollback currently exists completely in memory. This means that the
|
||||||
|
/// larger this value, the larger potential memory usage. Scrollback is
|
||||||
|
/// allocated lazily up to this limit, so if you set this to a very large
|
||||||
|
/// value, it will not immediately consume a lot of memory.
|
||||||
|
///
|
||||||
|
/// This size is per terminal surface, not for the entire application.
|
||||||
|
///
|
||||||
|
/// It is not currently possible to set an unlimited scrollback buffer.
|
||||||
|
/// This is a future planned feature.
|
||||||
|
///
|
||||||
|
/// This can be changed at runtime but will only affect new terminal surfaces.
|
||||||
|
@"scrollback-limit": u32 = 10_000,
|
||||||
|
|
||||||
/// Match a regular expression against the terminal text and associate clicking
|
/// Match a regular expression against the terminal text and associate clicking
|
||||||
/// it with an action. This can be used to match URLs, file paths, etc. Actions
|
/// it with an action. This can be used to match URLs, file paths, etc. Actions
|
||||||
/// can be opening using the system opener (i.e. `open` or `xdg-open`) or
|
/// can be opening using the system opener (i.e. `open` or `xdg-open`) or
|
||||||
|
@ -63,7 +63,7 @@ pub fn cursorStyle(
|
|||||||
test "cursor: default uses configured style" {
|
test "cursor: default uses configured style" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var term = try terminal.Terminal.init(alloc, 10, 10);
|
var term = try terminal.Terminal.init(alloc, .{ .cols = 10, .rows = 10 });
|
||||||
defer term.deinit(alloc);
|
defer term.deinit(alloc);
|
||||||
|
|
||||||
term.screen.cursor.cursor_style = .bar;
|
term.screen.cursor.cursor_style = .bar;
|
||||||
@ -84,7 +84,7 @@ test "cursor: default uses configured style" {
|
|||||||
test "cursor: blinking disabled" {
|
test "cursor: blinking disabled" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var term = try terminal.Terminal.init(alloc, 10, 10);
|
var term = try terminal.Terminal.init(alloc, .{ .cols = 10, .rows = 10 });
|
||||||
defer term.deinit(alloc);
|
defer term.deinit(alloc);
|
||||||
|
|
||||||
term.screen.cursor.cursor_style = .bar;
|
term.screen.cursor.cursor_style = .bar;
|
||||||
@ -105,7 +105,7 @@ test "cursor: blinking disabled" {
|
|||||||
test "cursor: explictly not visible" {
|
test "cursor: explictly not visible" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var term = try terminal.Terminal.init(alloc, 10, 10);
|
var term = try terminal.Terminal.init(alloc, .{ .cols = 10, .rows = 10 });
|
||||||
defer term.deinit(alloc);
|
defer term.deinit(alloc);
|
||||||
|
|
||||||
term.screen.cursor.cursor_style = .bar;
|
term.screen.cursor.cursor_style = .bar;
|
||||||
@ -127,7 +127,7 @@ test "cursor: explictly not visible" {
|
|||||||
test "cursor: always block with preedit" {
|
test "cursor: always block with preedit" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var term = try terminal.Terminal.init(alloc, 10, 10);
|
var term = try terminal.Terminal.init(alloc, .{ .cols = 10, .rows = 10 });
|
||||||
defer term.deinit(alloc);
|
defer term.deinit(alloc);
|
||||||
|
|
||||||
var state: State = .{
|
var state: State = .{
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -645,7 +645,7 @@ fn trackPin(
|
|||||||
test "storage: add placement with zero placement id" {
|
test "storage: add placement with zero placement id" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 100, 100);
|
var t = try terminal.Terminal.init(alloc, .{ .cols = 100, .rows = 100 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
t.width_px = 100;
|
t.width_px = 100;
|
||||||
t.height_px = 100;
|
t.height_px = 100;
|
||||||
@ -674,7 +674,7 @@ test "storage: add placement with zero placement id" {
|
|||||||
test "storage: delete all placements and images" {
|
test "storage: delete all placements and images" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 3, 3);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 3, .cols = 3 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
const tracked = t.screen.pages.countTrackedPins();
|
const tracked = t.screen.pages.countTrackedPins();
|
||||||
|
|
||||||
@ -697,7 +697,7 @@ test "storage: delete all placements and images" {
|
|||||||
test "storage: delete all placements and images preserves limit" {
|
test "storage: delete all placements and images preserves limit" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 3, 3);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 3, .cols = 3 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
const tracked = t.screen.pages.countTrackedPins();
|
const tracked = t.screen.pages.countTrackedPins();
|
||||||
|
|
||||||
@ -722,7 +722,7 @@ test "storage: delete all placements and images preserves limit" {
|
|||||||
test "storage: delete all placements" {
|
test "storage: delete all placements" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 3, 3);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 3, .cols = 3 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
const tracked = t.screen.pages.countTrackedPins();
|
const tracked = t.screen.pages.countTrackedPins();
|
||||||
|
|
||||||
@ -745,7 +745,7 @@ test "storage: delete all placements" {
|
|||||||
test "storage: delete all placements by image id" {
|
test "storage: delete all placements by image id" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 3, 3);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 3, .cols = 3 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
const tracked = t.screen.pages.countTrackedPins();
|
const tracked = t.screen.pages.countTrackedPins();
|
||||||
|
|
||||||
@ -768,7 +768,7 @@ test "storage: delete all placements by image id" {
|
|||||||
test "storage: delete all placements by image id and unused images" {
|
test "storage: delete all placements by image id and unused images" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 3, 3);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 3, .cols = 3 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
const tracked = t.screen.pages.countTrackedPins();
|
const tracked = t.screen.pages.countTrackedPins();
|
||||||
|
|
||||||
@ -791,7 +791,7 @@ test "storage: delete all placements by image id and unused images" {
|
|||||||
test "storage: delete placement by specific id" {
|
test "storage: delete placement by specific id" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 3, 3);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 3, .cols = 3 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
const tracked = t.screen.pages.countTrackedPins();
|
const tracked = t.screen.pages.countTrackedPins();
|
||||||
|
|
||||||
@ -819,7 +819,7 @@ test "storage: delete placement by specific id" {
|
|||||||
test "storage: delete intersecting cursor" {
|
test "storage: delete intersecting cursor" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 100, 100);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 100, .cols = 100 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
t.width_px = 100;
|
t.width_px = 100;
|
||||||
t.height_px = 100;
|
t.height_px = 100;
|
||||||
@ -851,7 +851,7 @@ test "storage: delete intersecting cursor" {
|
|||||||
test "storage: delete intersecting cursor plus unused" {
|
test "storage: delete intersecting cursor plus unused" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 100, 100);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 100, .cols = 100 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
t.width_px = 100;
|
t.width_px = 100;
|
||||||
t.height_px = 100;
|
t.height_px = 100;
|
||||||
@ -883,7 +883,7 @@ test "storage: delete intersecting cursor plus unused" {
|
|||||||
test "storage: delete intersecting cursor hits multiple" {
|
test "storage: delete intersecting cursor hits multiple" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 100, 100);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 100, .cols = 100 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
t.width_px = 100;
|
t.width_px = 100;
|
||||||
t.height_px = 100;
|
t.height_px = 100;
|
||||||
@ -909,7 +909,7 @@ test "storage: delete intersecting cursor hits multiple" {
|
|||||||
test "storage: delete by column" {
|
test "storage: delete by column" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 100, 100);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 100, .cols = 100 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
t.width_px = 100;
|
t.width_px = 100;
|
||||||
t.height_px = 100;
|
t.height_px = 100;
|
||||||
@ -942,7 +942,7 @@ test "storage: delete by column" {
|
|||||||
test "storage: delete by row" {
|
test "storage: delete by row" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
var t = try terminal.Terminal.init(alloc, 100, 100);
|
var t = try terminal.Terminal.init(alloc, .{ .rows = 100, .cols = 100 });
|
||||||
defer t.deinit(alloc);
|
defer t.deinit(alloc);
|
||||||
t.width_px = 100;
|
t.width_px = 100;
|
||||||
t.height_px = 100;
|
t.height_px = 100;
|
||||||
|
@ -128,11 +128,11 @@ pub const DerivedConfig = struct {
|
|||||||
/// process.
|
/// process.
|
||||||
pub fn init(alloc: Allocator, opts: termio.Options) !Exec {
|
pub fn init(alloc: Allocator, opts: termio.Options) !Exec {
|
||||||
// Create our terminal
|
// Create our terminal
|
||||||
var term = try terminal.Terminal.init(
|
var term = try terminal.Terminal.init(alloc, .{
|
||||||
alloc,
|
.cols = opts.grid_size.columns,
|
||||||
opts.grid_size.columns,
|
.rows = opts.grid_size.rows,
|
||||||
opts.grid_size.rows,
|
.max_scrollback = opts.full_config.@"scrollback-limit",
|
||||||
);
|
});
|
||||||
errdefer term.deinit(alloc);
|
errdefer term.deinit(alloc);
|
||||||
term.default_palette = opts.config.palette;
|
term.default_palette = opts.config.palette;
|
||||||
term.color_palette.colors = opts.config.palette;
|
term.color_palette.colors = opts.config.palette;
|
||||||
|
Reference in New Issue
Block a user