From c3cf5ea02f325ef450a575f96a92371198796d71 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Thu, 15 Jan 2026 17:16:07 +0100 Subject: [PATCH] refactor: add source location tracing for need_render calls --- src/tui/Button.zig | 8 +++---- src/tui/InputBox.zig | 8 +++---- src/tui/Widget.zig | 2 +- src/tui/editor.zig | 2 +- src/tui/home.zig | 4 ++-- src/tui/mainview.zig | 32 ++++++++++++++-------------- src/tui/mode/mini/file_browser.zig | 2 +- src/tui/mode/overlay/dropdown.zig | 2 +- src/tui/mode/overlay/open_recent.zig | 6 +++--- src/tui/mode/overlay/palette.zig | 2 +- src/tui/mode/overlay/vcs_status.zig | 6 +++--- src/tui/status/clock.zig | 2 +- src/tui/tui.zig | 13 +++++------ 13 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/tui/Button.zig b/src/tui/Button.zig index bca03a0..b8e29ae 100644 --- a/src/tui/Button.zig +++ b/src/tui/Button.zig @@ -123,7 +123,7 @@ fn State(ctx_type: type) type { input.mouse.BUTTON1 => { self.active = true; self.drag_anchor = self.to_rel_cursor(x, y); - tui.need_render(); + tui.need_render(@src()); }, input.mouse.BUTTON4, input.mouse.BUTTON5 => { 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_pos = null; self.call_click_handler(@enumFromInt(btn), self.to_rel_cursor(x, y)); - tui.need_render(); + tui.need_render(@src()); 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 })) { self.drag_pos = .{ .x = x, .y = y }; @@ -153,11 +153,11 @@ fn State(ctx_type: type) type { self.drag_anchor = null; self.drag_pos = null; self.call_click_handler(@enumFromInt(btn), self.to_rel_cursor(x, y)); - tui.need_render(); + tui.need_render(@src()); return true; } else if (try m.match(.{ "H", tp.extract(&self.hover) })) { tui.rdr().request_mouse_cursor_pointer(self.hover); - tui.need_render(); + tui.need_render(@src()); return true; } self.drag_anchor = null; diff --git a/src/tui/InputBox.zig b/src/tui/InputBox.zig index cffeaa4..8a06b09 100644 --- a/src/tui/InputBox.zig +++ b/src/tui/InputBox.zig @@ -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 { 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; - tui.need_render(); + tui.need_render(@src()); 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 })) { self.opts.on_click(self.opts.ctx, self); self.active = false; - tui.need_render(); + tui.need_render(@src()); 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 })) { self.opts.on_click(self.opts.ctx, self); self.active = false; - tui.need_render(); + tui.need_render(@src()); return true; } else if (try m.match(.{ "H", tp.extract(&self.hover) })) { tui.rdr().request_mouse_cursor_pointer(self.hover); - tui.need_render(); + tui.need_render(@src()); return true; } return false; diff --git a/src/tui/Widget.zig b/src/tui/Widget.zig index 89a0aef..d1c345a 100644 --- a/src/tui/Widget.zig +++ b/src/tui/Widget.zig @@ -170,7 +170,7 @@ pub fn dynamic_cast(self: Self, comptime T: type) ?*T { } pub fn need_render() void { - tui.need_render(); + tui.need_render(@src()); } pub fn need_reflow() void { diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 3406268..1bc51be 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -6934,7 +6934,7 @@ pub const EditorWidget = struct { return; } else { self.editor.cancel_all_matches(); - tui.need_render(); + tui.need_render(@src()); } }, .none => {}, diff --git a/src/tui/home.zig b/src/tui/home.zig index abc6381..5fae6c0 100644 --- a/src/tui/home.zig +++ b/src/tui/home.zig @@ -209,7 +209,7 @@ pub fn receive(_: *Self, _: tp.pid_ref, m: tp.message) error{Exit}!bool { var hover: bool = false; if (try m.match(.{ "H", tp.extract(&hover) })) { tui.rdr().request_mouse_cursor_default(hover); - tui.need_render(); + tui.need_render(@src()); return true; } 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; self.menu_len = self.menu_count + padding.top + padding.bottom; self.menu_w = self.menu_label_max + 2 + padding.left + padding.right; - tui.need_render(); + tui.need_render(@src()); try tui.save_config(); } pub const home_next_widget_style_meta: Meta = .{}; diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index 877981c..67f812a 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -605,7 +605,7 @@ const cmds = struct { if (view == null) try command.executeName("scroll_view_center", .{}); } - tui.need_render(); + tui.need_render(@src()); self.location_update_from_editor(); } @@ -613,7 +613,7 @@ const cmds = struct { tui.reset_drag_context(); try self.create_editor(); 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(); } pub const open_help_meta: Meta = .{ .description = "Open help" }; @@ -622,7 +622,7 @@ const cmds = struct { tui.reset_drag_context(); try self.create_editor(); 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(); } 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(); try self.create_editor(); 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(); } pub const open_version_info_meta: Meta = .{ .description = "Version" }; @@ -726,7 +726,7 @@ const cmds = struct { tui.reset_drag_context(); try self.create_editor(); try command.executeName("open_scratch_buffer", .{ .args = args }); - tui.need_render(); + tui.need_render(@src()); self.location_update_from_editor(); } pub const create_scratch_buffer_meta: Meta = .{ .arguments = &.{ .string, .string, .string } }; @@ -807,7 +807,7 @@ const cmds = struct { new_buffer.mark_dirty(); new_editor.clamp(); new_editor.update_buf(new_buffer.root) catch {}; - tui.need_render(); + tui.need_render(@src()); } try command.executeName("save_file", .{}); try command.executeName("place_next_tab", command.fmt(.{ @@ -836,7 +836,7 @@ const cmds = struct { const logger = log.logger("buffer"); defer logger.deinit(); logger.print("deleted buffer {s}", .{file_path}); - tui.need_render(); + tui.need_render(@src()); } pub const delete_buffer_meta: Meta = .{ .arguments = &.{.string} }; @@ -852,13 +852,13 @@ const cmds = struct { return; } _ = self.buffer_manager.close_buffer(buffer); - tui.need_render(); + tui.need_render(@src()); } pub const close_buffer_meta: Meta = .{ .arguments = &.{.string} }; pub fn restore_session(self: *Self, _: Ctx) Result { try self.read_restore_info(); - tui.need_render(); + tui.need_render(@src()); } 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 "")) { self.symbols_complete = true; 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 = .{ @@ -1181,7 +1181,7 @@ const cmds = struct { .palette => try tui.open_overlay(@import("mode/overlay/completion_palette.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; if (self.get_editor_for_buffer(buffer)) |editor| if (editor.buffer) |eb| if (eb == buffer) { editor.smart_buffer_append(command.fmt(.{output})) catch {}; - tui.need_render(); + tui.need_render(@src()); return; }; var cursor: Buffer.Cursor = .{}; @@ -1393,7 +1393,7 @@ const cmds = struct { _, _, root_ = try root_.insert_chars(cursor.row, cursor.col, output, self.allocator, metrics); buffer.store_undo(&[_]u8{}) catch {}; buffer.update(root_); - tui.need_render(); + tui.need_render(@src()); } pub const shell_execute_stream_output_meta: Meta = .{ .arguments = &.{ .integer, .string } }; @@ -1407,7 +1407,7 @@ const cmds = struct { return; } buffer.mark_clean(); - tui.need_render(); + tui.need_render(@src()); } 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()), .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 { _ = 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 { diff --git a/src/tui/mode/mini/file_browser.zig b/src/tui/mode/mini/file_browser.zig index 88f54ea..82e29d9 100644 --- a/src/tui/mode/mini/file_browser.zig +++ b/src/tui/mode/mini/file_browser.zig @@ -179,7 +179,7 @@ pub fn Create(options: type) type { } else { 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 { diff --git a/src/tui/mode/overlay/dropdown.zig b/src/tui/mode/overlay/dropdown.zig index 41448a9..f5a10ee 100644 --- a/src/tui/mode/overlay/dropdown.zig +++ b/src/tui/mode/overlay/dropdown.zig @@ -580,7 +580,7 @@ pub fn Create(options: type) type { tui.set_next_style(widget_type); const padding = tui.get_widget_style(widget_type).padding; self.do_resize(padding); - tui.need_render(); + tui.need_render(@src()); try tui.save_config(); } pub const overlay_next_widget_style_meta: Meta = .{}; diff --git a/src/tui/mode/overlay/open_recent.zig b/src/tui/mode/overlay/open_recent.zig index ad8ae61..91a79ec 100644 --- a/src/tui/mode/overlay/open_recent.zig +++ b/src/tui/mode/overlay/open_recent.zig @@ -273,7 +273,7 @@ fn process_project_manager(self: *Self, m: tp.message) MessageFilter.Error!void self.menu.select_down(); self.need_select_first = false; } - tui.need_render(); + tui.need_render(@src()); } else if (try cbor.match(m.buf, .{ "PRJ", "recent", @@ -291,7 +291,7 @@ fn process_project_manager(self: *Self, m: tp.message) MessageFilter.Error!void self.menu.select_down(); 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) })) { self.update_count_hint(); self.query_pending = false; @@ -492,7 +492,7 @@ const cmds = struct { pub fn overlay_next_widget_style(self: *Self, _: Ctx) Result { tui.set_next_style(widget_type); self.do_resize(); - tui.need_render(); + tui.need_render(@src()); try tui.save_config(); } pub const overlay_next_widget_style_meta: Meta = .{}; diff --git a/src/tui/mode/overlay/palette.zig b/src/tui/mode/overlay/palette.zig index 1b4193b..8824b14 100644 --- a/src/tui/mode/overlay/palette.zig +++ b/src/tui/mode/overlay/palette.zig @@ -635,7 +635,7 @@ pub fn Create(options: type) type { tui.set_next_style(widget_type); const padding = tui.get_widget_style(widget_type).padding; self.do_resize(padding); - tui.need_render(); + tui.need_render(@src()); try tui.save_config(); } pub const overlay_next_widget_style_meta: Meta = .{}; diff --git a/src/tui/mode/overlay/vcs_status.zig b/src/tui/mode/overlay/vcs_status.zig index b25b698..a6687c7 100644 --- a/src/tui/mode/overlay/vcs_status.zig +++ b/src/tui/mode/overlay/vcs_status.zig @@ -188,7 +188,7 @@ fn process_project_manager(self: *Self, m: tp.message) MessageFilter.Error!void self.menu.select_down(); self.need_select_first = false; } - tui.need_render(); + tui.need_render(@src()); } else if (try cbor.match(m.buf, .{ "PRJ", "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.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) })) { self.query_pending = false; self.need_reset = true; @@ -369,7 +369,7 @@ const cmds = struct { pub fn overlay_next_widget_style(self: *Self, _: Ctx) Result { tui.set_next_style(widget_type); self.do_resize(); - tui.need_render(); + tui.need_render(@src()); try tui.save_config(); } pub const overlay_next_widget_style_meta: Meta = .{}; diff --git a/src/tui/status/clock.zig b/src/tui/status/clock.zig index fe5b6cd..a2f99aa 100644 --- a/src/tui/status/clock.zig +++ b/src/tui/status/clock.zig @@ -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 { if (try cbor.match(m.buf, .{"CLOCK"})) { - tui.need_render(); + tui.need_render(@src()); self.update_tick_timer(.ticked); return true; } diff --git a/src/tui/tui.zig b/src/tui/tui.zig index 84b7d97..6c92868 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -407,7 +407,7 @@ fn receive_safe(self: *Self, from: tp.pid_ref, m: tp.message) !void { }; try self.dispatch_flush_input_event(); if (self.unrendered_input_events_count > 0 and !self.frame_clock_running) - need_render(); + need_render(@src()); return; } @@ -1613,21 +1613,21 @@ const cmds = struct { pub fn panel_next_widget_style(_: *Self, _: Ctx) Result { set_next_style(.panel); - need_render(); + need_render(@src()); try save_config(); } pub const panel_next_widget_style_meta: Meta = .{}; pub fn hint_window_next_widget_style(_: *Self, _: Ctx) Result { set_next_style(.hint_window); - need_render(); + need_render(@src()); try save_config(); } pub const hint_window_next_widget_style_meta: Meta = .{}; pub fn dropdown_next_widget_style(_: *Self, _: Ctx) Result { set_next_style(.dropdown); - need_render(); + need_render(@src()); try save_config(); } 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; } -pub fn need_render() void { +pub fn need_render(src: std.builtin.SourceLocation) void { const self = current(); 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; tp.self_pid().send(.{"render"}) catch {}; } @@ -1819,7 +1820,7 @@ pub fn frames_rendered() usize { pub fn resize() void { mainview_widget().resize(screen()); refresh_hover(); - need_render(); + need_render(@src()); } pub fn plane() renderer.Plane {