diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-07 18:29:21 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-07 18:29:21 +0300 |
| commit | dcfe11a7588fcd42471159453810abc9b7720a57 (patch) | |
| tree | c32a77266028e73ca2382b96c96f8438a5fcd621 /vendor/libghostty-vt/src/terminal/c/render.zig | |
| parent | 2dfed860103c4e4505ac7f25def9fe37da1e1e6a (diff) | |
build: update libghostty-vt vendor
vendor ghostty 063ac3e and remove the musl libc++ link workaround.
expose the new selection formatter and hyperlink uri apis for follow-up rendering work.
add manual artifact validation for static linux builds.
Diffstat (limited to 'vendor/libghostty-vt/src/terminal/c/render.zig')
| -rw-r--r-- | vendor/libghostty-vt/src/terminal/c/render.zig | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/terminal/c/render.zig b/vendor/libghostty-vt/src/terminal/c/render.zig index b95bedd5..af82ddfa 100644 --- a/vendor/libghostty-vt/src/terminal/c/render.zig +++ b/vendor/libghostty-vt/src/terminal/c/render.zig @@ -201,6 +201,27 @@ pub fn get( }; } +pub fn get_multi( + state_: RenderState, + count: usize, + keys: ?[*]const Data, + values: ?[*]?*anyopaque, + out_written: ?*usize, +) callconv(lib.calling_conv) Result { + const k = keys orelse return .invalid_value; + const v = values orelse return .invalid_value; + + for (0..count) |i| { + const result = get(state_, k[i], v[i]); + if (result != .success) { + if (out_written) |w| w.* = i; + return result; + } + } + if (out_written) |w| w.* = count; + return .success; +} + fn getTyped( state_: RenderState, comptime data: Data, @@ -468,6 +489,27 @@ pub fn row_cells_get( }; } +pub fn row_cells_get_multi( + cells_: RowCells, + count: usize, + keys: ?[*]const RowCellsData, + values: ?[*]?*anyopaque, + out_written: ?*usize, +) callconv(lib.calling_conv) Result { + const k = keys orelse return .invalid_value; + const v = values orelse return .invalid_value; + + for (0..count) |i| { + const result = row_cells_get(cells_, k[i], v[i]); + if (result != .success) { + if (out_written) |w| w.* = i; + return result; + } + } + if (out_written) |w| w.* = count; + return .success; +} + fn rowCellsGetTyped( cells_: RowCells, comptime data: RowCellsData, @@ -568,6 +610,27 @@ pub fn row_get( }; } +pub fn row_get_multi( + iterator_: RowIterator, + count: usize, + keys: ?[*]const RowData, + values: ?[*]?*anyopaque, + out_written: ?*usize, +) callconv(lib.calling_conv) Result { + const k = keys orelse return .invalid_value; + const v = values orelse return .invalid_value; + + for (0..count) |i| { + const result = row_get(iterator_, k[i], v[i]); + if (result != .success) { + if (out_written) |w| w.* = i; + return result; + } + } + if (out_written) |w| w.* = count; + return .success; +} + fn rowGetTyped( iterator_: RowIterator, comptime data: RowData, @@ -1380,3 +1443,137 @@ test "render: colors get supports truncated sized struct" { try testing.expectEqual(state_colors.palette[1].cval(), colors.palette[1]); try testing.expectEqual(sentinel, colors.palette[2]); } + +test "render: get_multi success" { + var terminal: terminal_c.Terminal = null; + try testing.expectEqual(Result.success, terminal_c.new( + &lib.alloc.test_allocator, + &terminal, + .{ .cols = 80, .rows = 24, .max_scrollback = 10_000 }, + )); + defer terminal_c.free(terminal); + + var state: RenderState = null; + try testing.expectEqual(Result.success, new( + &lib.alloc.test_allocator, + &state, + )); + defer free(state); + + try testing.expectEqual(Result.success, update(state, terminal)); + + var cols: u16 = 0; + var rows: u16 = 0; + var written: usize = 0; + + const keys = [_]Data{ .cols, .rows }; + var values = [_]?*anyopaque{ @ptrCast(&cols), @ptrCast(&rows) }; + try testing.expectEqual(Result.success, get_multi(state, keys.len, &keys, &values, &written)); + try testing.expectEqual(keys.len, written); + try testing.expectEqual(80, cols); + try testing.expectEqual(24, rows); +} + +test "render: get_multi null returns invalid_value" { + var cols: u16 = 0; + var values = [_]?*anyopaque{@ptrCast(&cols)}; + try testing.expectEqual(Result.invalid_value, get_multi(null, 1, null, &values, null)); +} + +test "render: row_get_multi success" { + var terminal: terminal_c.Terminal = null; + try testing.expectEqual(Result.success, terminal_c.new( + &lib.alloc.test_allocator, + &terminal, + .{ .cols = 80, .rows = 24, .max_scrollback = 10_000 }, + )); + defer terminal_c.free(terminal); + + var state: RenderState = null; + try testing.expectEqual(Result.success, new( + &lib.alloc.test_allocator, + &state, + )); + defer free(state); + + try testing.expectEqual(Result.success, update(state, terminal)); + + var it: RowIterator = null; + try testing.expectEqual(Result.success, row_iterator_new( + &lib.alloc.test_allocator, + &it, + )); + defer row_iterator_free(it); + + try testing.expectEqual(Result.success, get(state, .row_iterator, @ptrCast(&it))); + try testing.expect(row_iterator_next(it)); + + var dirty: bool = true; + var written: usize = 0; + + const keys = [_]RowData{.dirty}; + var values = [_]?*anyopaque{@ptrCast(&dirty)}; + try testing.expectEqual(Result.success, row_get_multi(it, keys.len, &keys, &values, &written)); + try testing.expectEqual(keys.len, written); +} + +test "render: row_get_multi null returns invalid_value" { + var dirty: bool = false; + var values = [_]?*anyopaque{@ptrCast(&dirty)}; + try testing.expectEqual(Result.invalid_value, row_get_multi(null, 1, null, &values, null)); +} + +test "render: row_cells_get_multi success" { + var terminal: terminal_c.Terminal = null; + try testing.expectEqual(Result.success, terminal_c.new( + &lib.alloc.test_allocator, + &terminal, + .{ .cols = 80, .rows = 24, .max_scrollback = 10_000 }, + )); + defer terminal_c.free(terminal); + + terminal_c.vt_write(terminal, "A", 1); + + var state: RenderState = null; + try testing.expectEqual(Result.success, new( + &lib.alloc.test_allocator, + &state, + )); + defer free(state); + + try testing.expectEqual(Result.success, update(state, terminal)); + + var it: RowIterator = null; + try testing.expectEqual(Result.success, row_iterator_new( + &lib.alloc.test_allocator, + &it, + )); + defer row_iterator_free(it); + + try testing.expectEqual(Result.success, get(state, .row_iterator, @ptrCast(&it))); + try testing.expect(row_iterator_next(it)); + + var cells: RowCells = null; + try testing.expectEqual(Result.success, row_cells_new( + &lib.alloc.test_allocator, + &cells, + )); + defer row_cells_free(cells); + + try testing.expectEqual(Result.success, row_get(it, .cells, @ptrCast(&cells))); + try testing.expect(row_cells_next(cells)); + + var raw: row.CRow = undefined; + var written: usize = 0; + + const keys = [_]RowCellsData{.raw}; + var values = [_]?*anyopaque{@ptrCast(&raw)}; + try testing.expectEqual(Result.success, row_cells_get_multi(cells, keys.len, &keys, &values, &written)); + try testing.expectEqual(keys.len, written); +} + +test "render: row_cells_get_multi null returns invalid_value" { + var raw: row.CRow = undefined; + var values = [_]?*anyopaque{@ptrCast(&raw)}; + try testing.expectEqual(Result.invalid_value, row_cells_get_multi(null, 1, null, &values, null)); +} |
