refactor: add source location tracing for need_render calls

This commit is contained in:
CJ van den Berg 2026-01-15 17:16:07 +01:00
parent 58bd1fe12a
commit c3cf5ea02f
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
13 changed files with 45 additions and 44 deletions

View file

@ -123,7 +123,7 @@ fn State(ctx_type: type) type {
input.mouse.BUTTON1 => { input.mouse.BUTTON1 => {
self.active = true; self.active = true;
self.drag_anchor = self.to_rel_cursor(x, y); self.drag_anchor = self.to_rel_cursor(x, y);
tui.need_render(); tui.need_render(@src());
}, },
input.mouse.BUTTON4, input.mouse.BUTTON5 => { input.mouse.BUTTON4, input.mouse.BUTTON5 => {
self.call_click_handler(btn_enum, self.to_rel_cursor(x, y)); self.call_click_handler(btn_enum, self.to_rel_cursor(x, y));
@ -136,7 +136,7 @@ fn State(ctx_type: type) type {
self.drag_anchor = null; self.drag_anchor = null;
self.drag_pos = null; self.drag_pos = null;
self.call_click_handler(@enumFromInt(btn), self.to_rel_cursor(x, y)); self.call_click_handler(@enumFromInt(btn), self.to_rel_cursor(x, y));
tui.need_render(); tui.need_render(@src());
return true; return true;
} else if (try m.match(.{ "D", input.event.press, tp.extract(&btn), tp.any, tp.extract(&x), tp.extract(&y), tp.any, tp.any })) { } else if (try m.match(.{ "D", input.event.press, tp.extract(&btn), tp.any, tp.extract(&x), tp.extract(&y), tp.any, tp.any })) {
self.drag_pos = .{ .x = x, .y = y }; self.drag_pos = .{ .x = x, .y = y };
@ -153,11 +153,11 @@ fn State(ctx_type: type) type {
self.drag_anchor = null; self.drag_anchor = null;
self.drag_pos = null; self.drag_pos = null;
self.call_click_handler(@enumFromInt(btn), self.to_rel_cursor(x, y)); self.call_click_handler(@enumFromInt(btn), self.to_rel_cursor(x, y));
tui.need_render(); tui.need_render(@src());
return true; return true;
} else if (try m.match(.{ "H", tp.extract(&self.hover) })) { } else if (try m.match(.{ "H", tp.extract(&self.hover) })) {
tui.rdr().request_mouse_cursor_pointer(self.hover); tui.rdr().request_mouse_cursor_pointer(self.hover);
tui.need_render(); tui.need_render(@src());
return true; return true;
} }
self.drag_anchor = null; self.drag_anchor = null;

View file

@ -132,21 +132,21 @@ pub fn State(ctx_type: type) type {
pub fn receive(self: *Self, _: tp.pid_ref, m: tp.message) error{Exit}!bool { pub fn receive(self: *Self, _: tp.pid_ref, m: tp.message) error{Exit}!bool {
if (try m.match(.{ "B", input.event.press, @intFromEnum(input.mouse.BUTTON1), tp.any, tp.any, tp.any, tp.any, tp.any })) { if (try m.match(.{ "B", input.event.press, @intFromEnum(input.mouse.BUTTON1), tp.any, tp.any, tp.any, tp.any, tp.any })) {
self.active = true; self.active = true;
tui.need_render(); tui.need_render(@src());
return true; return true;
} else if (try m.match(.{ "B", input.event.release, @intFromEnum(input.mouse.BUTTON1), tp.any, tp.any, tp.any, tp.any, tp.any })) { } else if (try m.match(.{ "B", input.event.release, @intFromEnum(input.mouse.BUTTON1), tp.any, tp.any, tp.any, tp.any, tp.any })) {
self.opts.on_click(self.opts.ctx, self); self.opts.on_click(self.opts.ctx, self);
self.active = false; self.active = false;
tui.need_render(); tui.need_render(@src());
return true; return true;
} else if (try m.match(.{ "D", input.event.release, @intFromEnum(input.mouse.BUTTON1), tp.any, tp.any, tp.any, tp.any, tp.any })) { } else if (try m.match(.{ "D", input.event.release, @intFromEnum(input.mouse.BUTTON1), tp.any, tp.any, tp.any, tp.any, tp.any })) {
self.opts.on_click(self.opts.ctx, self); self.opts.on_click(self.opts.ctx, self);
self.active = false; self.active = false;
tui.need_render(); tui.need_render(@src());
return true; return true;
} else if (try m.match(.{ "H", tp.extract(&self.hover) })) { } else if (try m.match(.{ "H", tp.extract(&self.hover) })) {
tui.rdr().request_mouse_cursor_pointer(self.hover); tui.rdr().request_mouse_cursor_pointer(self.hover);
tui.need_render(); tui.need_render(@src());
return true; return true;
} }
return false; return false;

View file

@ -170,7 +170,7 @@ pub fn dynamic_cast(self: Self, comptime T: type) ?*T {
} }
pub fn need_render() void { pub fn need_render() void {
tui.need_render(); tui.need_render(@src());
} }
pub fn need_reflow() void { pub fn need_reflow() void {

View file

@ -6934,7 +6934,7 @@ pub const EditorWidget = struct {
return; return;
} else { } else {
self.editor.cancel_all_matches(); self.editor.cancel_all_matches();
tui.need_render(); tui.need_render(@src());
} }
}, },
.none => {}, .none => {},

View file

@ -209,7 +209,7 @@ pub fn receive(_: *Self, _: tp.pid_ref, m: tp.message) error{Exit}!bool {
var hover: bool = false; var hover: bool = false;
if (try m.match(.{ "H", tp.extract(&hover) })) { if (try m.match(.{ "H", tp.extract(&hover) })) {
tui.rdr().request_mouse_cursor_default(hover); tui.rdr().request_mouse_cursor_default(hover);
tui.need_render(); tui.need_render(@src());
return true; return true;
} }
if (try m.match(.{ "B", input.event.press, @intFromEnum(input.mouse.BUTTON1), tp.more }) or if (try m.match(.{ "B", input.event.press, @intFromEnum(input.mouse.BUTTON1), tp.more }) or
@ -453,7 +453,7 @@ const cmds = struct {
const padding = tui.get_widget_style(widget_type).padding; const padding = tui.get_widget_style(widget_type).padding;
self.menu_len = self.menu_count + padding.top + padding.bottom; self.menu_len = self.menu_count + padding.top + padding.bottom;
self.menu_w = self.menu_label_max + 2 + padding.left + padding.right; self.menu_w = self.menu_label_max + 2 + padding.left + padding.right;
tui.need_render(); tui.need_render(@src());
try tui.save_config(); try tui.save_config();
} }
pub const home_next_widget_style_meta: Meta = .{}; pub const home_next_widget_style_meta: Meta = .{};

View file

@ -605,7 +605,7 @@ const cmds = struct {
if (view == null) if (view == null)
try command.executeName("scroll_view_center", .{}); try command.executeName("scroll_view_center", .{});
} }
tui.need_render(); tui.need_render(@src());
self.location_update_from_editor(); self.location_update_from_editor();
} }
@ -613,7 +613,7 @@ const cmds = struct {
tui.reset_drag_context(); tui.reset_drag_context();
try self.create_editor(); try self.create_editor();
try command.executeName("open_scratch_buffer", command.fmt(.{ "help", @embedFile("help.md"), "markdown" })); try command.executeName("open_scratch_buffer", command.fmt(.{ "help", @embedFile("help.md"), "markdown" }));
tui.need_render(); tui.need_render(@src());
self.location_update_from_editor(); self.location_update_from_editor();
} }
pub const open_help_meta: Meta = .{ .description = "Open help" }; pub const open_help_meta: Meta = .{ .description = "Open help" };
@ -622,7 +622,7 @@ const cmds = struct {
tui.reset_drag_context(); tui.reset_drag_context();
try self.create_editor(); try self.create_editor();
try command.executeName("open_scratch_buffer", command.fmt(.{ "font test", @import("fonts.zig").font_test_text, "text" })); try command.executeName("open_scratch_buffer", command.fmt(.{ "font test", @import("fonts.zig").font_test_text, "text" }));
tui.need_render(); tui.need_render(@src());
self.location_update_from_editor(); self.location_update_from_editor();
} }
pub const open_font_test_text_meta: Meta = .{ .description = "Open font glyph test text" }; pub const open_font_test_text_meta: Meta = .{ .description = "Open font glyph test text" };
@ -631,7 +631,7 @@ const cmds = struct {
tui.reset_drag_context(); tui.reset_drag_context();
try self.create_editor(); try self.create_editor();
try command.executeName("open_scratch_buffer", command.fmt(.{ "version", root.version_info, "gitcommit" })); try command.executeName("open_scratch_buffer", command.fmt(.{ "version", root.version_info, "gitcommit" }));
tui.need_render(); tui.need_render(@src());
self.location_update_from_editor(); self.location_update_from_editor();
} }
pub const open_version_info_meta: Meta = .{ .description = "Version" }; pub const open_version_info_meta: Meta = .{ .description = "Version" };
@ -726,7 +726,7 @@ const cmds = struct {
tui.reset_drag_context(); tui.reset_drag_context();
try self.create_editor(); try self.create_editor();
try command.executeName("open_scratch_buffer", .{ .args = args }); try command.executeName("open_scratch_buffer", .{ .args = args });
tui.need_render(); tui.need_render(@src());
self.location_update_from_editor(); self.location_update_from_editor();
} }
pub const create_scratch_buffer_meta: Meta = .{ .arguments = &.{ .string, .string, .string } }; pub const create_scratch_buffer_meta: Meta = .{ .arguments = &.{ .string, .string, .string } };
@ -807,7 +807,7 @@ const cmds = struct {
new_buffer.mark_dirty(); new_buffer.mark_dirty();
new_editor.clamp(); new_editor.clamp();
new_editor.update_buf(new_buffer.root) catch {}; new_editor.update_buf(new_buffer.root) catch {};
tui.need_render(); tui.need_render(@src());
} }
try command.executeName("save_file", .{}); try command.executeName("save_file", .{});
try command.executeName("place_next_tab", command.fmt(.{ try command.executeName("place_next_tab", command.fmt(.{
@ -836,7 +836,7 @@ const cmds = struct {
const logger = log.logger("buffer"); const logger = log.logger("buffer");
defer logger.deinit(); defer logger.deinit();
logger.print("deleted buffer {s}", .{file_path}); logger.print("deleted buffer {s}", .{file_path});
tui.need_render(); tui.need_render(@src());
} }
pub const delete_buffer_meta: Meta = .{ .arguments = &.{.string} }; pub const delete_buffer_meta: Meta = .{ .arguments = &.{.string} };
@ -852,13 +852,13 @@ const cmds = struct {
return; return;
} }
_ = self.buffer_manager.close_buffer(buffer); _ = self.buffer_manager.close_buffer(buffer);
tui.need_render(); tui.need_render(@src());
} }
pub const close_buffer_meta: Meta = .{ .arguments = &.{.string} }; pub const close_buffer_meta: Meta = .{ .arguments = &.{.string} };
pub fn restore_session(self: *Self, _: Ctx) Result { pub fn restore_session(self: *Self, _: Ctx) Result {
try self.read_restore_info(); try self.read_restore_info();
tui.need_render(); tui.need_render(@src());
} }
pub const restore_session_meta: Meta = .{}; pub const restore_session_meta: Meta = .{};
@ -1117,7 +1117,7 @@ const cmds = struct {
if (self.get_active_editor()) |editor| if (std.mem.eql(u8, file_path, editor.file_path orelse "")) { if (self.get_active_editor()) |editor| if (std.mem.eql(u8, file_path, editor.file_path orelse "")) {
self.symbols_complete = true; self.symbols_complete = true;
try tui.open_overlay(@import("mode/overlay/symbol_palette.zig").Type); try tui.open_overlay(@import("mode/overlay/symbol_palette.zig").Type);
tui.need_render(); tui.need_render(@src());
}; };
} }
pub const add_document_symbol_done_meta: Meta = .{ pub const add_document_symbol_done_meta: Meta = .{
@ -1181,7 +1181,7 @@ const cmds = struct {
.palette => try tui.open_overlay(@import("mode/overlay/completion_palette.zig").Type), .palette => try tui.open_overlay(@import("mode/overlay/completion_palette.zig").Type),
.dropdown => try tui.open_overlay(@import("mode/overlay/completion_dropdown.zig").Type), .dropdown => try tui.open_overlay(@import("mode/overlay/completion_dropdown.zig").Type),
} }
tui.need_render(); tui.need_render(@src());
} }
}; };
} }
@ -1383,7 +1383,7 @@ const cmds = struct {
const buffer = self.buffer_manager.buffer_from_ref(buffer_ref) orelse return; const buffer = self.buffer_manager.buffer_from_ref(buffer_ref) orelse return;
if (self.get_editor_for_buffer(buffer)) |editor| if (editor.buffer) |eb| if (eb == buffer) { if (self.get_editor_for_buffer(buffer)) |editor| if (editor.buffer) |eb| if (eb == buffer) {
editor.smart_buffer_append(command.fmt(.{output})) catch {}; editor.smart_buffer_append(command.fmt(.{output})) catch {};
tui.need_render(); tui.need_render(@src());
return; return;
}; };
var cursor: Buffer.Cursor = .{}; var cursor: Buffer.Cursor = .{};
@ -1393,7 +1393,7 @@ const cmds = struct {
_, _, root_ = try root_.insert_chars(cursor.row, cursor.col, output, self.allocator, metrics); _, _, root_ = try root_.insert_chars(cursor.row, cursor.col, output, self.allocator, metrics);
buffer.store_undo(&[_]u8{}) catch {}; buffer.store_undo(&[_]u8{}) catch {};
buffer.update(root_); buffer.update(root_);
tui.need_render(); tui.need_render(@src());
} }
pub const shell_execute_stream_output_meta: Meta = .{ .arguments = &.{ .integer, .string } }; pub const shell_execute_stream_output_meta: Meta = .{ .arguments = &.{ .integer, .string } };
@ -1407,7 +1407,7 @@ const cmds = struct {
return; return;
} }
buffer.mark_clean(); buffer.mark_clean();
tui.need_render(); tui.need_render(@src());
} }
pub const shell_execute_stream_output_complete_meta: Meta = .{ .arguments = &.{ .integer, .string } }; pub const shell_execute_stream_output_complete_meta: Meta = .{ .arguments = &.{ .integer, .string } };
@ -2074,12 +2074,12 @@ pub fn set_info_content(self: *Self, content: []const u8, mode: enum { replace,
.replace => info.set_content(content) catch |e| return tp.exit_error(e, @errorReturnTrace()), .replace => info.set_content(content) catch |e| return tp.exit_error(e, @errorReturnTrace()),
.append => info.append_content(content) catch |e| return tp.exit_error(e, @errorReturnTrace()), .append => info.append_content(content) catch |e| return tp.exit_error(e, @errorReturnTrace()),
} }
tui.need_render(); tui.need_render(@src());
} }
pub fn cancel_info_content(self: *Self) tp.result { pub fn cancel_info_content(self: *Self) tp.result {
_ = self.toggle_panel_view(info_view, .disable) catch |e| return tp.exit_error(e, @errorReturnTrace()); _ = self.toggle_panel_view(info_view, .disable) catch |e| return tp.exit_error(e, @errorReturnTrace());
tui.need_render(); tui.need_render(@src());
} }
pub fn vcs_id_update(self: *Self, m: tp.message) void { pub fn vcs_id_update(self: *Self, m: tp.message) void {

View file

@ -179,7 +179,7 @@ pub fn Create(options: type) type {
} else { } else {
log.logger("file_browser").err("receive", tp.unexpected(m)); log.logger("file_browser").err("receive", tp.unexpected(m));
} }
tui.need_render(); tui.need_render(@src());
} }
fn add_entry(self: *Self, file_name: []const u8, entry_type: EntryType, file_type: []const u8, icon: []const u8, color: u24) !void { fn add_entry(self: *Self, file_name: []const u8, entry_type: EntryType, file_type: []const u8, icon: []const u8, color: u24) !void {

View file

@ -580,7 +580,7 @@ pub fn Create(options: type) type {
tui.set_next_style(widget_type); tui.set_next_style(widget_type);
const padding = tui.get_widget_style(widget_type).padding; const padding = tui.get_widget_style(widget_type).padding;
self.do_resize(padding); self.do_resize(padding);
tui.need_render(); tui.need_render(@src());
try tui.save_config(); try tui.save_config();
} }
pub const overlay_next_widget_style_meta: Meta = .{}; pub const overlay_next_widget_style_meta: Meta = .{};

View file

@ -273,7 +273,7 @@ fn process_project_manager(self: *Self, m: tp.message) MessageFilter.Error!void
self.menu.select_down(); self.menu.select_down();
self.need_select_first = false; self.need_select_first = false;
} }
tui.need_render(); tui.need_render(@src());
} else if (try cbor.match(m.buf, .{ } else if (try cbor.match(m.buf, .{
"PRJ", "PRJ",
"recent", "recent",
@ -291,7 +291,7 @@ fn process_project_manager(self: *Self, m: tp.message) MessageFilter.Error!void
self.menu.select_down(); self.menu.select_down();
self.need_select_first = false; self.need_select_first = false;
} }
tui.need_render(); tui.need_render(@src());
} else if (try cbor.match(m.buf, .{ "PRJ", "recent_done", tp.extract(&self.longest), tp.extract(&query), tp.extract(&self.total_files_in_project) })) { } else if (try cbor.match(m.buf, .{ "PRJ", "recent_done", tp.extract(&self.longest), tp.extract(&query), tp.extract(&self.total_files_in_project) })) {
self.update_count_hint(); self.update_count_hint();
self.query_pending = false; self.query_pending = false;
@ -492,7 +492,7 @@ const cmds = struct {
pub fn overlay_next_widget_style(self: *Self, _: Ctx) Result { pub fn overlay_next_widget_style(self: *Self, _: Ctx) Result {
tui.set_next_style(widget_type); tui.set_next_style(widget_type);
self.do_resize(); self.do_resize();
tui.need_render(); tui.need_render(@src());
try tui.save_config(); try tui.save_config();
} }
pub const overlay_next_widget_style_meta: Meta = .{}; pub const overlay_next_widget_style_meta: Meta = .{};

View file

@ -635,7 +635,7 @@ pub fn Create(options: type) type {
tui.set_next_style(widget_type); tui.set_next_style(widget_type);
const padding = tui.get_widget_style(widget_type).padding; const padding = tui.get_widget_style(widget_type).padding;
self.do_resize(padding); self.do_resize(padding);
tui.need_render(); tui.need_render(@src());
try tui.save_config(); try tui.save_config();
} }
pub const overlay_next_widget_style_meta: Meta = .{}; pub const overlay_next_widget_style_meta: Meta = .{};

View file

@ -188,7 +188,7 @@ fn process_project_manager(self: *Self, m: tp.message) MessageFilter.Error!void
self.menu.select_down(); self.menu.select_down();
self.need_select_first = false; self.need_select_first = false;
} }
tui.need_render(); tui.need_render(@src());
} else if (try cbor.match(m.buf, .{ } else if (try cbor.match(m.buf, .{
"PRJ", "PRJ",
"new_or_modified_files", "new_or_modified_files",
@ -207,7 +207,7 @@ fn process_project_manager(self: *Self, m: tp.message) MessageFilter.Error!void
self.menu.select_down(); self.menu.select_down();
self.need_select_first = false; self.need_select_first = false;
} }
tui.need_render(); tui.need_render(@src());
} else if (try cbor.match(m.buf, .{ "PRJ", "new_or_modified_files_done", tp.extract(&self.longest), tp.extract(&query) })) { } else if (try cbor.match(m.buf, .{ "PRJ", "new_or_modified_files_done", tp.extract(&self.longest), tp.extract(&query) })) {
self.query_pending = false; self.query_pending = false;
self.need_reset = true; self.need_reset = true;
@ -369,7 +369,7 @@ const cmds = struct {
pub fn overlay_next_widget_style(self: *Self, _: Ctx) Result { pub fn overlay_next_widget_style(self: *Self, _: Ctx) Result {
tui.set_next_style(widget_type); tui.set_next_style(widget_type);
self.do_resize(); self.do_resize();
tui.need_render(); tui.need_render(@src());
try tui.save_config(); try tui.save_config();
} }
pub const overlay_next_widget_style_meta: Meta = .{}; pub const overlay_next_widget_style_meta: Meta = .{};

View file

@ -95,7 +95,7 @@ pub fn render(self: *Self, theme: *const Widget.Theme) bool {
fn receive_tick(self: *Self, _: tp.pid_ref, m: tp.message) MessageFilter.Error!bool { fn receive_tick(self: *Self, _: tp.pid_ref, m: tp.message) MessageFilter.Error!bool {
if (try cbor.match(m.buf, .{"CLOCK"})) { if (try cbor.match(m.buf, .{"CLOCK"})) {
tui.need_render(); tui.need_render(@src());
self.update_tick_timer(.ticked); self.update_tick_timer(.ticked);
return true; return true;
} }

View file

@ -407,7 +407,7 @@ fn receive_safe(self: *Self, from: tp.pid_ref, m: tp.message) !void {
}; };
try self.dispatch_flush_input_event(); try self.dispatch_flush_input_event();
if (self.unrendered_input_events_count > 0 and !self.frame_clock_running) if (self.unrendered_input_events_count > 0 and !self.frame_clock_running)
need_render(); need_render(@src());
return; return;
} }
@ -1613,21 +1613,21 @@ const cmds = struct {
pub fn panel_next_widget_style(_: *Self, _: Ctx) Result { pub fn panel_next_widget_style(_: *Self, _: Ctx) Result {
set_next_style(.panel); set_next_style(.panel);
need_render(); need_render(@src());
try save_config(); try save_config();
} }
pub const panel_next_widget_style_meta: Meta = .{}; pub const panel_next_widget_style_meta: Meta = .{};
pub fn hint_window_next_widget_style(_: *Self, _: Ctx) Result { pub fn hint_window_next_widget_style(_: *Self, _: Ctx) Result {
set_next_style(.hint_window); set_next_style(.hint_window);
need_render(); need_render(@src());
try save_config(); try save_config();
} }
pub const hint_window_next_widget_style_meta: Meta = .{}; pub const hint_window_next_widget_style_meta: Meta = .{};
pub fn dropdown_next_widget_style(_: *Self, _: Ctx) Result { pub fn dropdown_next_widget_style(_: *Self, _: Ctx) Result {
set_next_style(.dropdown); set_next_style(.dropdown);
need_render(); need_render(@src());
try save_config(); try save_config();
} }
pub const dropdown_next_widget_style_meta: Meta = .{}; pub const dropdown_next_widget_style_meta: Meta = .{};
@ -1803,9 +1803,10 @@ fn maybe_reset_drag_source(self: *Self, btn: input.MouseType) void {
self.drag_button = 0; self.drag_button = 0;
} }
pub fn need_render() void { pub fn need_render(src: std.builtin.SourceLocation) void {
const self = current(); const self = current();
if (!(self.render_pending or self.frame_clock_running)) { if (!(self.render_pending or self.frame_clock_running)) {
tp.trace(tp.channel.debug, .{ "tui", "need_render", src.fn_name, src.file, src.line });
self.render_pending = true; self.render_pending = true;
tp.self_pid().send(.{"render"}) catch {}; tp.self_pid().send(.{"render"}) catch {};
} }
@ -1819,7 +1820,7 @@ pub fn frames_rendered() usize {
pub fn resize() void { pub fn resize() void {
mainview_widget().resize(screen()); mainview_widget().resize(screen());
refresh_hover(); refresh_hover();
need_render(); need_render(@src());
} }
pub fn plane() renderer.Plane { pub fn plane() renderer.Plane {