From 771c1dd980098210174bfa980860c40a8a937460 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 14 Jun 2024 20:06:46 +0200 Subject: [PATCH] fix(tui): prevent render overload on high mouse report rates --- src/tui/Widget.zig | 3 ++- src/tui/tui.zig | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/tui/Widget.zig b/src/tui/Widget.zig index 587c757..bb8f86a 100644 --- a/src/tui/Widget.zig +++ b/src/tui/Widget.zig @@ -4,6 +4,7 @@ const tp = @import("thespian"); const Plane = @import("renderer").Plane; +const tui = @import("tui.zig"); pub const Box = @import("Box.zig"); pub const EventHandler = @import("EventHandler.zig"); pub const Theme = @import("theme"); @@ -147,7 +148,7 @@ pub fn dynamic_cast(self: Self, comptime T: type) ?*T { } pub fn need_render() void { - tp.self_pid().send(.{"render"}) catch {}; + tui.need_render(); } pub fn need_reflow() void { diff --git a/src/tui/tui.zig b/src/tui/tui.zig index ef0a9ad..edceca1 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -51,6 +51,7 @@ init_timer: ?tp.timeout, sigwinch_signal: ?tp.signal = null, no_sleep: bool = false, final_exit: []const u8 = "normal", +render_pending: bool = false, const idle_frames = 0; @@ -71,7 +72,6 @@ fn start(args: StartArgs) tp.result { _ = tp.set_trap(true); var self = init(args.a) catch |e| return tp.exit_error(e); errdefer self.deinit(); - need_render(); tp.receive(&self.receiver); } @@ -132,6 +132,7 @@ fn init(a: Allocator) !*Self { command.executeName("restore_session", .{}) catch |e| self.logger.err("restore_session", e); self.logger.print("session restored", .{}); } + need_render(); return self; } @@ -234,6 +235,7 @@ fn receive_safe(self: *Self, from: tp.pid_ref, m: tp.message) tp.result { } if (try m.match(.{"render"})) { + self.render_pending = false; if (!self.frame_clock_running) self.render(); return; @@ -677,7 +679,11 @@ pub fn get_mode() []const u8 { } pub fn need_render() void { - tp.self_pid().send(.{"render"}) catch {}; + const self = current(); + if (!(self.render_pending or self.frame_clock_running)) { + self.render_pending = true; + tp.self_pid().send(.{"render"}) catch {}; + } } pub fn resize(self: *Self) void {