mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 15:56:13 +03:00
only update cells in the render call
This commit is contained in:
@ -258,6 +258,9 @@ pub fn demoCells(self: *Grid) !void {
|
|||||||
/// updateCells updates our GPU cells from the current terminal view.
|
/// updateCells updates our GPU cells from the current terminal view.
|
||||||
/// The updated cells will take effect on the next render.
|
/// The updated cells will take effect on the next render.
|
||||||
pub fn updateCells(self: *Grid, term: Terminal) !void {
|
pub fn updateCells(self: *Grid, term: Terminal) !void {
|
||||||
|
const t = trace(@src());
|
||||||
|
defer t.end();
|
||||||
|
|
||||||
// For now, we just ensure that we have enough cells for all the lines
|
// For now, we just ensure that we have enough cells for all the lines
|
||||||
// we have plus a full width. This is very likely too much but its
|
// we have plus a full width. This is very likely too much but its
|
||||||
// the probably close enough while guaranteeing no more allocations.
|
// the probably close enough while guaranteeing no more allocations.
|
||||||
|
@ -260,9 +260,6 @@ fn sizeCallback(window: glfw.Window, width: i32, height: i32) void {
|
|||||||
// Update the size of our terminal state
|
// Update the size of our terminal state
|
||||||
win.terminal.resize(win.grid.size.columns, win.grid.size.rows);
|
win.terminal.resize(win.grid.size.columns, win.grid.size.rows);
|
||||||
|
|
||||||
// TODO: this is not the right place for this
|
|
||||||
win.grid.updateCells(win.terminal) catch unreachable;
|
|
||||||
|
|
||||||
// Update the size of our pty
|
// Update the size of our pty
|
||||||
win.pty.setSize(.{
|
win.pty.setSize(.{
|
||||||
.ws_row = @intCast(u16, win.grid.size.rows),
|
.ws_row = @intCast(u16, win.grid.size.rows),
|
||||||
@ -376,7 +373,6 @@ fn focusCallback(window: glfw.Window, focused: bool) void {
|
|||||||
} else {
|
} else {
|
||||||
win.grid.cursor_visible = true;
|
win.grid.cursor_visible = true;
|
||||||
win.grid.cursor_style = .box_hollow;
|
win.grid.cursor_style = .box_hollow;
|
||||||
win.grid.updateCells(win.terminal) catch unreachable;
|
|
||||||
win.cursor_timer.stop() catch unreachable;
|
win.cursor_timer.stop() catch unreachable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -387,7 +383,6 @@ fn cursorTimerCallback(t: *libuv.Timer) void {
|
|||||||
|
|
||||||
const win = t.getData(Window) orelse return;
|
const win = t.getData(Window) orelse return;
|
||||||
win.grid.cursor_visible = !win.grid.cursor_visible;
|
win.grid.cursor_visible = !win.grid.cursor_visible;
|
||||||
win.grid.updateCells(win.terminal) catch unreachable;
|
|
||||||
win.render_timer.schedule() catch unreachable;
|
win.render_timer.schedule() catch unreachable;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,9 +427,6 @@ fn ttyRead(t: *libuv.Tty, n: isize, buf: []const u8) void {
|
|||||||
_ = win.cursor_timer.again() catch null;
|
_ = win.cursor_timer.again() catch null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the cells for drawing
|
|
||||||
win.grid.updateCells(win.terminal) catch unreachable;
|
|
||||||
|
|
||||||
// Schedule a render
|
// Schedule a render
|
||||||
win.render_timer.schedule() catch unreachable;
|
win.render_timer.schedule() catch unreachable;
|
||||||
}
|
}
|
||||||
@ -456,10 +448,14 @@ fn ttyWrite(req: *libuv.WriteReq, status: i32) void {
|
|||||||
|
|
||||||
fn renderTimerCallback(t: *libuv.Timer) void {
|
fn renderTimerCallback(t: *libuv.Timer) void {
|
||||||
const tracy = trace(@src());
|
const tracy = trace(@src());
|
||||||
|
tracy.color(0x006E7F); // blue-ish
|
||||||
defer tracy.end();
|
defer tracy.end();
|
||||||
|
|
||||||
const win = t.getData(Window).?;
|
const win = t.getData(Window).?;
|
||||||
|
|
||||||
|
// Update the cells for drawing
|
||||||
|
win.grid.updateCells(win.terminal) catch unreachable;
|
||||||
|
|
||||||
// Set our background
|
// Set our background
|
||||||
gl.clearColor(0.2, 0.3, 0.3, 1.0);
|
gl.clearColor(0.2, 0.3, 0.3, 1.0);
|
||||||
gl.clear(gl.c.GL_COLOR_BUFFER_BIT);
|
gl.clear(gl.c.GL_COLOR_BUFFER_BIT);
|
||||||
|
@ -10,6 +10,7 @@ const Allocator = std.mem.Allocator;
|
|||||||
const ansi = @import("ansi.zig");
|
const ansi = @import("ansi.zig");
|
||||||
const Parser = @import("Parser.zig");
|
const Parser = @import("Parser.zig");
|
||||||
const Tabstops = @import("Tabstops.zig");
|
const Tabstops = @import("Tabstops.zig");
|
||||||
|
const trace = @import("../tracy/tracy.zig").trace;
|
||||||
|
|
||||||
const log = std.log.scoped(.terminal);
|
const log = std.log.scoped(.terminal);
|
||||||
|
|
||||||
@ -105,6 +106,9 @@ pub fn plainString(self: Terminal, alloc: Allocator) ![]const u8 {
|
|||||||
|
|
||||||
/// Append a string of characters. See appendChar.
|
/// Append a string of characters. See appendChar.
|
||||||
pub fn append(self: *Terminal, alloc: Allocator, str: []const u8) !void {
|
pub fn append(self: *Terminal, alloc: Allocator, str: []const u8) !void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
for (str) |c| {
|
for (str) |c| {
|
||||||
try self.appendChar(alloc, c);
|
try self.appendChar(alloc, c);
|
||||||
}
|
}
|
||||||
@ -114,6 +118,9 @@ pub fn append(self: *Terminal, alloc: Allocator, str: []const u8) !void {
|
|||||||
///
|
///
|
||||||
/// This may allocate if necessary to store the character in the grid.
|
/// This may allocate if necessary to store the character in the grid.
|
||||||
pub fn appendChar(self: *Terminal, alloc: Allocator, c: u8) !void {
|
pub fn appendChar(self: *Terminal, alloc: Allocator, c: u8) !void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
//log.debug("char: {}", .{c});
|
//log.debug("char: {}", .{c});
|
||||||
const actions = self.parser.next(c);
|
const actions = self.parser.next(c);
|
||||||
for (actions) |action_opt| {
|
for (actions) |action_opt| {
|
||||||
@ -125,6 +132,9 @@ pub fn appendChar(self: *Terminal, alloc: Allocator, c: u8) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn print(self: *Terminal, alloc: Allocator, c: u8) !void {
|
fn print(self: *Terminal, alloc: Allocator, c: u8) !void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
// Build our cell
|
// Build our cell
|
||||||
const cell = try self.getOrPutCell(alloc, self.cursor.x, self.cursor.y);
|
const cell = try self.getOrPutCell(alloc, self.cursor.x, self.cursor.y);
|
||||||
cell.* = .{
|
cell.* = .{
|
||||||
@ -141,6 +151,9 @@ fn print(self: *Terminal, alloc: Allocator, c: u8) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn execute(self: *Terminal, alloc: Allocator, c: u8) !void {
|
fn execute(self: *Terminal, alloc: Allocator, c: u8) !void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
switch (@intToEnum(ansi.C0, c)) {
|
switch (@intToEnum(ansi.C0, c)) {
|
||||||
.BEL => self.bell(),
|
.BEL => self.bell(),
|
||||||
.BS => self.backspace(),
|
.BS => self.backspace(),
|
||||||
@ -158,12 +171,18 @@ pub fn bell(self: *Terminal) void {
|
|||||||
|
|
||||||
/// Backspace moves the cursor back a column (but not less than 0).
|
/// Backspace moves the cursor back a column (but not less than 0).
|
||||||
pub fn backspace(self: *Terminal) void {
|
pub fn backspace(self: *Terminal) void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
self.cursor.x -|= 1;
|
self.cursor.x -|= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Horizontal tab moves the cursor to the next tabstop, clearing
|
/// Horizontal tab moves the cursor to the next tabstop, clearing
|
||||||
/// the screen to the left the tabstop.
|
/// the screen to the left the tabstop.
|
||||||
pub fn horizontal_tab(self: *Terminal, alloc: Allocator) !void {
|
pub fn horizontal_tab(self: *Terminal, alloc: Allocator) !void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
while (self.cursor.x < self.cols) {
|
while (self.cursor.x < self.cols) {
|
||||||
// Clear
|
// Clear
|
||||||
try self.print(alloc, ' ');
|
try self.print(alloc, ' ');
|
||||||
@ -177,11 +196,17 @@ pub fn horizontal_tab(self: *Terminal, alloc: Allocator) !void {
|
|||||||
|
|
||||||
/// Carriage return moves the cursor to the first column.
|
/// Carriage return moves the cursor to the first column.
|
||||||
pub fn carriage_return(self: *Terminal) void {
|
pub fn carriage_return(self: *Terminal) void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
self.cursor.x = 0;
|
self.cursor.x = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Linefeed moves the cursor to the next line.
|
/// Linefeed moves the cursor to the next line.
|
||||||
pub fn linefeed(self: *Terminal, alloc: Allocator) void {
|
pub fn linefeed(self: *Terminal, alloc: Allocator) void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
// If we're at the end of the screen, scroll up. This is surprisingly
|
// If we're at the end of the screen, scroll up. This is surprisingly
|
||||||
// common because most terminals live with a full screen so we do this
|
// common because most terminals live with a full screen so we do this
|
||||||
// check first.
|
// check first.
|
||||||
@ -196,6 +221,9 @@ pub fn linefeed(self: *Terminal, alloc: Allocator) void {
|
|||||||
|
|
||||||
/// Scroll the text up by one row.
|
/// Scroll the text up by one row.
|
||||||
pub fn scroll_up(self: *Terminal, alloc: Allocator) void {
|
pub fn scroll_up(self: *Terminal, alloc: Allocator) void {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
// TODO: this is horribly expensive. we need to optimize the screen repr
|
// TODO: this is horribly expensive. we need to optimize the screen repr
|
||||||
|
|
||||||
// If we have no items, scrolling does nothing.
|
// If we have no items, scrolling does nothing.
|
||||||
@ -212,6 +240,9 @@ pub fn scroll_up(self: *Terminal, alloc: Allocator) void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn getOrPutCell(self: *Terminal, alloc: Allocator, x: usize, y: usize) !*Cell {
|
fn getOrPutCell(self: *Terminal, alloc: Allocator, x: usize, y: usize) !*Cell {
|
||||||
|
const tracy = trace(@src());
|
||||||
|
defer tracy.end();
|
||||||
|
|
||||||
// If we don't have enough lines to get to y, then add it.
|
// If we don't have enough lines to get to y, then add it.
|
||||||
if (self.screen.items.len < y + 1) {
|
if (self.screen.items.len < y + 1) {
|
||||||
try self.screen.ensureTotalCapacity(alloc, y + 1);
|
try self.screen.ensureTotalCapacity(alloc, y + 1);
|
||||||
|
Reference in New Issue
Block a user