feat: add tui top layer rendering support

This commit is contained in:
CJ van den Berg 2025-10-24 16:21:00 +02:00
parent 6cc45d76cf
commit 9dbb15c796
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -31,6 +31,7 @@ const Allocator = std.mem.Allocator;
allocator: Allocator, allocator: Allocator,
rdr_: renderer, rdr_: renderer,
top_layer_: ?*renderer.Layer = null,
config_: @import("config"), config_: @import("config"),
config_bufs: [][]const u8, config_bufs: [][]const u8,
session_tab_width: ?usize = null, session_tab_width: ?usize = null,
@ -507,12 +508,25 @@ fn render(self: *Self) void {
break :ret if (self.mainview_) |mv| mv.render(self.current_theme()) else false; break :ret if (self.mainview_) |mv| mv.render(self.current_theme()) else false;
}; };
if (self.top_layer_) |top_layer_| {
const frame = tracy.initZone(@src(), .{ .name = "tui blit top layer" });
defer frame.deinit();
self.logger.print("top_layer: {}:{}:{}:{}", .{
top_layer_.y_off,
top_layer_.x_off,
top_layer_.view.screen.height,
top_layer_.view.screen.width,
});
top_layer_.draw(self.rdr_.stdplane());
}
{ {
const frame = tracy.initZone(@src(), .{ .name = renderer.log_name ++ " render" }); const frame = tracy.initZone(@src(), .{ .name = renderer.log_name ++ " render" });
defer frame.deinit(); defer frame.deinit();
self.rdr_.render() catch |e| self.logger.err("render", e); self.rdr_.render() catch |e| self.logger.err("render", e);
tracy.frameMark(); tracy.frameMark();
} }
self.top_layer_reset();
self.idle_frame_count = if (self.unrendered_input_events_count > 0) self.idle_frame_count = if (self.unrendered_input_events_count > 0)
0 0
@ -1427,6 +1441,24 @@ fn stdplane(self: *Self) renderer.Plane {
return self.rdr_.stdplane(); return self.rdr_.stdplane();
} }
pub fn top_layer(opts: renderer.Layer.Options) ?*renderer.Plane {
const self = current();
if (self.top_layer_) |_| return null;
self.top_layer_ = renderer.Layer.init(
self.allocator,
self.rdr_.stdplane().window.unicode,
opts,
) catch @panic("OOM toplayer");
return self.top_layer_.?.plane();
}
fn top_layer_reset(self: *Self) void {
if (self.top_layer_) |top_layer_| {
top_layer_.deinit();
self.top_layer_ = null;
}
}
pub fn egc_chunk_width(chunk: []const u8, abs_col: usize, tab_width: usize) usize { pub fn egc_chunk_width(chunk: []const u8, abs_col: usize, tab_width: usize) usize {
return plane().egc_chunk_width(chunk, abs_col, tab_width); return plane().egc_chunk_width(chunk, abs_col, tab_width);
} }