mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 00:36:07 +03:00
terminal: on print, adjust page size if we need to grow for hyperlinks
This commit is contained in:
@ -1524,6 +1524,35 @@ pub fn endHyperlink(self: *Screen) void {
|
|||||||
self.cursor.hyperlink = null;
|
self.cursor.hyperlink = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the current hyperlink state on the current cell.
|
||||||
|
pub fn cursorSetHyperlink(self: *Screen) !void {
|
||||||
|
assert(self.cursor.hyperlink_id != 0);
|
||||||
|
|
||||||
|
var page = &self.cursor.page_pin.page.data;
|
||||||
|
if (page.setHyperlink(
|
||||||
|
self.cursor.page_row,
|
||||||
|
self.cursor.page_cell,
|
||||||
|
self.cursor.hyperlink_id,
|
||||||
|
)) {
|
||||||
|
// Success!
|
||||||
|
return;
|
||||||
|
} else |err| switch (err) {
|
||||||
|
// hyperlink_map is out of space, realloc the page to be larger
|
||||||
|
error.OutOfMemory => {
|
||||||
|
_ = try self.pages.adjustCapacity(
|
||||||
|
self.cursor.page_pin.page,
|
||||||
|
.{ .hyperlink_bytes = page.capacity.hyperlink_bytes * 2 },
|
||||||
|
);
|
||||||
|
|
||||||
|
// Reload cursor since our cursor page has changed.
|
||||||
|
self.cursorReload();
|
||||||
|
|
||||||
|
// Retry
|
||||||
|
return try self.cursorSetHyperlink();
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the selection to the given selection. If this is a tracked selection
|
/// Set the selection to the given selection. If this is a tracked selection
|
||||||
/// then the screen will take overnship of the selection. If this is untracked
|
/// then the screen will take overnship of the selection. If this is untracked
|
||||||
/// then the screen will convert it to tracked internally. This will automatically
|
/// then the screen will convert it to tracked internally. This will automatically
|
||||||
|
@ -601,27 +601,6 @@ fn printCell(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We check for an active hyperlink first because setHyperlink
|
|
||||||
// handles clearing the old hyperlink and an optimization if we're
|
|
||||||
// overwriting the same hyperlink.
|
|
||||||
if (self.screen.cursor.hyperlink_id > 0) {
|
|
||||||
// If we have a hyperlink configured, apply it to this cell
|
|
||||||
var page = &self.screen.cursor.page_pin.page.data;
|
|
||||||
page.setHyperlink(
|
|
||||||
self.screen.cursor.page_row,
|
|
||||||
cell,
|
|
||||||
self.screen.cursor.hyperlink_id,
|
|
||||||
) catch |err| {
|
|
||||||
// TODO: an error can only happen if our page is out of space
|
|
||||||
// so realloc the page here.
|
|
||||||
log.err("failed to set hyperlink, ignoring err={}", .{err});
|
|
||||||
};
|
|
||||||
} else if (cell.hyperlink) {
|
|
||||||
// If the previous cell had a hyperlink then we need to clear it.
|
|
||||||
var page = &self.screen.cursor.page_pin.page.data;
|
|
||||||
page.clearHyperlink(self.screen.cursor.page_row, cell);
|
|
||||||
}
|
|
||||||
|
|
||||||
// We don't need to update the style refs unless the
|
// We don't need to update the style refs unless the
|
||||||
// cell's new style will be different after writing.
|
// cell's new style will be different after writing.
|
||||||
const style_changed = cell.style_id != self.screen.cursor.style_id;
|
const style_changed = cell.style_id != self.screen.cursor.style_id;
|
||||||
@ -635,6 +614,9 @@ fn printCell(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Keep track if we had a hyperlink so we can unset it.
|
||||||
|
const had_hyperlink = cell.hyperlink;
|
||||||
|
|
||||||
// Write
|
// Write
|
||||||
cell.* = .{
|
cell.* = .{
|
||||||
.content_tag = .codepoint,
|
.content_tag = .codepoint,
|
||||||
@ -642,7 +624,6 @@ fn printCell(
|
|||||||
.style_id = self.screen.cursor.style_id,
|
.style_id = self.screen.cursor.style_id,
|
||||||
.wide = wide,
|
.wide = wide,
|
||||||
.protected = self.screen.cursor.protected,
|
.protected = self.screen.cursor.protected,
|
||||||
.hyperlink = self.screen.cursor.hyperlink_id > 0,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (style_changed) {
|
if (style_changed) {
|
||||||
@ -654,6 +635,20 @@ fn printCell(
|
|||||||
self.screen.cursor.page_row.styled = true;
|
self.screen.cursor.page_row.styled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We check for an active hyperlink first because setHyperlink
|
||||||
|
// handles clearing the old hyperlink and an optimization if we're
|
||||||
|
// overwriting the same hyperlink.
|
||||||
|
if (self.screen.cursor.hyperlink_id > 0) {
|
||||||
|
self.screen.cursorSetHyperlink() catch |err| {
|
||||||
|
log.warn("error reallocating for more hyperlink space, ignoring hyperlink err={}", .{err});
|
||||||
|
assert(!cell.hyperlink);
|
||||||
|
};
|
||||||
|
} else if (had_hyperlink) {
|
||||||
|
// If the previous cell had a hyperlink then we need to clear it.
|
||||||
|
var page = &self.screen.cursor.page_pin.page.data;
|
||||||
|
page.clearHyperlink(self.screen.cursor.page_row, cell);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn printWrap(self: *Terminal) !void {
|
fn printWrap(self: *Terminal) !void {
|
||||||
|
Reference in New Issue
Block a user