mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 15:56:13 +03:00
terminal: cursorCopy has option to not copy hyperlink
This commit is contained in:
@ -902,7 +902,11 @@ fn cursorDownOrScroll(self: *Screen) !void {
|
|||||||
|
|
||||||
/// Copy another cursor. The cursor can be on any screen but the x/y
|
/// Copy another cursor. The cursor can be on any screen but the x/y
|
||||||
/// must be within our screen bounds.
|
/// must be within our screen bounds.
|
||||||
pub fn cursorCopy(self: *Screen, other: Cursor) !void {
|
pub fn cursorCopy(self: *Screen, other: Cursor, opts: struct {
|
||||||
|
/// Copy the hyperlink from the other cursor. If not set, this will
|
||||||
|
/// clear our current hyperlink.
|
||||||
|
hyperlink: bool = true,
|
||||||
|
}) !void {
|
||||||
assert(other.x < self.pages.cols);
|
assert(other.x < self.pages.cols);
|
||||||
assert(other.y < self.pages.rows);
|
assert(other.y < self.pages.rows);
|
||||||
|
|
||||||
@ -936,7 +940,7 @@ pub fn cursorCopy(self: *Screen, other: Cursor) !void {
|
|||||||
self.cursorAbsolute(other.x, other.y);
|
self.cursorAbsolute(other.x, other.y);
|
||||||
|
|
||||||
// If the other cursor had a hyperlink, add it to ours.
|
// If the other cursor had a hyperlink, add it to ours.
|
||||||
if (other.hyperlink_id != 0) {
|
if (opts.hyperlink and other.hyperlink_id != 0) {
|
||||||
// Get the hyperlink from the other cursor's page.
|
// Get the hyperlink from the other cursor's page.
|
||||||
const other_page = &other.page_pin.page.data;
|
const other_page = &other.page_pin.page.data;
|
||||||
const other_link = other_page.hyperlink_set.get(other_page.memory, other.hyperlink_id);
|
const other_link = other_page.hyperlink_set.get(other_page.memory, other.hyperlink_id);
|
||||||
@ -2905,7 +2909,7 @@ test "Screen cursorCopy x/y" {
|
|||||||
|
|
||||||
var s2 = try Screen.init(alloc, 10, 10, 0);
|
var s2 = try Screen.init(alloc, 10, 10, 0);
|
||||||
defer s2.deinit();
|
defer s2.deinit();
|
||||||
try s2.cursorCopy(s.cursor);
|
try s2.cursorCopy(s.cursor, .{});
|
||||||
try testing.expect(s2.cursor.x == 2);
|
try testing.expect(s2.cursor.x == 2);
|
||||||
try testing.expect(s2.cursor.y == 3);
|
try testing.expect(s2.cursor.y == 3);
|
||||||
try s2.testWriteString("Hello");
|
try s2.testWriteString("Hello");
|
||||||
@ -2934,7 +2938,7 @@ test "Screen cursorCopy style deref" {
|
|||||||
try testing.expect(s2.cursor.style.flags.bold);
|
try testing.expect(s2.cursor.style.flags.bold);
|
||||||
|
|
||||||
// Copy default style, should release our style
|
// Copy default style, should release our style
|
||||||
try s2.cursorCopy(s.cursor);
|
try s2.cursorCopy(s.cursor, .{});
|
||||||
try testing.expect(!s2.cursor.style.flags.bold);
|
try testing.expect(!s2.cursor.style.flags.bold);
|
||||||
try testing.expectEqual(@as(usize, 0), page.styles.count());
|
try testing.expectEqual(@as(usize, 0), page.styles.count());
|
||||||
}
|
}
|
||||||
@ -3000,7 +3004,7 @@ test "Screen cursorCopy style deref new page" {
|
|||||||
|
|
||||||
// Copy the cursor for the first screen. This should release
|
// Copy the cursor for the first screen. This should release
|
||||||
// the style from page 1 and move the cursor back to page 0.
|
// the style from page 1 and move the cursor back to page 0.
|
||||||
try s2.cursorCopy(s.cursor);
|
try s2.cursorCopy(s.cursor, .{});
|
||||||
try testing.expect(!s2.cursor.style.flags.bold);
|
try testing.expect(!s2.cursor.style.flags.bold);
|
||||||
try testing.expectEqual(@as(usize, 0), page.styles.count());
|
try testing.expectEqual(@as(usize, 0), page.styles.count());
|
||||||
// The page after the page the cursor is now in should be page 1.
|
// The page after the page the cursor is now in should be page 1.
|
||||||
@ -3021,7 +3025,7 @@ test "Screen cursorCopy style copy" {
|
|||||||
var s2 = try Screen.init(alloc, 10, 10, 0);
|
var s2 = try Screen.init(alloc, 10, 10, 0);
|
||||||
defer s2.deinit();
|
defer s2.deinit();
|
||||||
const page = &s2.cursor.page_pin.page.data;
|
const page = &s2.cursor.page_pin.page.data;
|
||||||
try s2.cursorCopy(s.cursor);
|
try s2.cursorCopy(s.cursor, .{});
|
||||||
try testing.expect(s2.cursor.style.flags.bold);
|
try testing.expect(s2.cursor.style.flags.bold);
|
||||||
try testing.expectEqual(@as(usize, 1), page.styles.count());
|
try testing.expectEqual(@as(usize, 1), page.styles.count());
|
||||||
}
|
}
|
||||||
@ -3043,7 +3047,7 @@ test "Screen cursorCopy hyperlink deref" {
|
|||||||
try testing.expect(s2.cursor.hyperlink_id != 0);
|
try testing.expect(s2.cursor.hyperlink_id != 0);
|
||||||
|
|
||||||
// Copy a cursor with no hyperlink, should release our hyperlink.
|
// Copy a cursor with no hyperlink, should release our hyperlink.
|
||||||
try s2.cursorCopy(s.cursor);
|
try s2.cursorCopy(s.cursor, .{});
|
||||||
try testing.expectEqual(@as(usize, 0), page.hyperlink_set.count());
|
try testing.expectEqual(@as(usize, 0), page.hyperlink_set.count());
|
||||||
try testing.expect(s2.cursor.hyperlink_id == 0);
|
try testing.expect(s2.cursor.hyperlink_id == 0);
|
||||||
}
|
}
|
||||||
@ -3109,7 +3113,7 @@ test "Screen cursorCopy hyperlink deref new page" {
|
|||||||
|
|
||||||
// Copy the cursor for the first screen. This should release
|
// Copy the cursor for the first screen. This should release
|
||||||
// the hyperlink from page 1 and move the cursor back to page 0.
|
// the hyperlink from page 1 and move the cursor back to page 0.
|
||||||
try s2.cursorCopy(s.cursor);
|
try s2.cursorCopy(s.cursor, .{});
|
||||||
try testing.expectEqual(@as(usize, 0), page.hyperlink_set.count());
|
try testing.expectEqual(@as(usize, 0), page.hyperlink_set.count());
|
||||||
try testing.expect(s2.cursor.hyperlink_id == 0);
|
try testing.expect(s2.cursor.hyperlink_id == 0);
|
||||||
// The page after the page the cursor is now in should be page 1.
|
// The page after the page the cursor is now in should be page 1.
|
||||||
@ -3139,11 +3143,36 @@ test "Screen cursorCopy hyperlink copy" {
|
|||||||
try testing.expect(s2.cursor.hyperlink_id == 0);
|
try testing.expect(s2.cursor.hyperlink_id == 0);
|
||||||
|
|
||||||
// Copy the cursor with the hyperlink.
|
// Copy the cursor with the hyperlink.
|
||||||
try s2.cursorCopy(s.cursor);
|
try s2.cursorCopy(s.cursor, .{});
|
||||||
try testing.expectEqual(@as(usize, 1), page.hyperlink_set.count());
|
try testing.expectEqual(@as(usize, 1), page.hyperlink_set.count());
|
||||||
try testing.expect(s2.cursor.hyperlink_id != 0);
|
try testing.expect(s2.cursor.hyperlink_id != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "Screen cursorCopy hyperlink copy disabled" {
|
||||||
|
const testing = std.testing;
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
|
||||||
|
var s = try Screen.init(alloc, 10, 10, 0);
|
||||||
|
defer s.deinit();
|
||||||
|
|
||||||
|
// Create a hyperlink for the cursor.
|
||||||
|
try s.startHyperlink("https://example.com/", null);
|
||||||
|
try testing.expectEqual(@as(usize, 1), s.cursor.page_pin.page.data.hyperlink_set.count());
|
||||||
|
try testing.expect(s.cursor.hyperlink_id != 0);
|
||||||
|
|
||||||
|
var s2 = try Screen.init(alloc, 10, 10, 0);
|
||||||
|
defer s2.deinit();
|
||||||
|
const page = &s2.cursor.page_pin.page.data;
|
||||||
|
|
||||||
|
try testing.expectEqual(@as(usize, 0), page.hyperlink_set.count());
|
||||||
|
try testing.expect(s2.cursor.hyperlink_id == 0);
|
||||||
|
|
||||||
|
// Copy the cursor with the hyperlink.
|
||||||
|
try s2.cursorCopy(s.cursor, .{ .hyperlink = false });
|
||||||
|
try testing.expectEqual(@as(usize, 0), page.hyperlink_set.count());
|
||||||
|
try testing.expect(s2.cursor.hyperlink_id == 0);
|
||||||
|
}
|
||||||
|
|
||||||
test "Screen style basics" {
|
test "Screen style basics" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
|
@ -2472,11 +2472,10 @@ pub fn alternateScreen(
|
|||||||
// Mark our terminal as dirty
|
// Mark our terminal as dirty
|
||||||
self.flags.dirty.clear = true;
|
self.flags.dirty.clear = true;
|
||||||
|
|
||||||
// We always end hyperlink state
|
|
||||||
self.screen.endHyperlink();
|
|
||||||
|
|
||||||
// Bring our pen with us
|
// Bring our pen with us
|
||||||
self.screen.cursorCopy(old.cursor) catch |err| {
|
self.screen.cursorCopy(old.cursor, .{
|
||||||
|
.hyperlink = false,
|
||||||
|
}) catch |err| {
|
||||||
log.warn("cursor copy failed entering alt screen err={}", .{err});
|
log.warn("cursor copy failed entering alt screen err={}", .{err});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user