fix: resize handling corrections

This commit is contained in:
CJ van den Berg 2024-06-08 20:01:13 +02:00
parent 01b78c88bd
commit ee6582b469
3 changed files with 15 additions and 16 deletions

View file

@ -94,7 +94,7 @@ pub fn run(self: *Self) !void {
panic_cleanup_tty = &self.tty;
if (!self.no_alternate) try self.vx.enterAltScreen(self.tty.anyWriter());
try self.resize(.{ .rows = 0, .cols = 0, .x_pixel = 0, .y_pixel = 0 }); // dummy resize to fully init vaxis
try self.resize(.{ .rows = 25, .cols = 80, .x_pixel = 0, .y_pixel = 0 }); // dummy resize to fully init vaxis
try self.query_resize();
try self.vx.setBracketedPaste(self.tty.anyWriter(), true);
try self.vx.queryTerminalSend(self.tty.anyWriter());
@ -114,9 +114,10 @@ pub fn query_resize(self: *Self) !void {
try self.resize(try vaxis.Tty.getWinsize(self.input_fd_blocking()));
}
pub fn resize(self: *Self, ws: vaxis.Winsize) !void {
fn resize(self: *Self, ws: vaxis.Winsize) !void {
try self.vx.resize(self.a, self.tty.anyWriter(), ws);
self.vx.queueRefresh();
if (self.dispatch_event) |f| f(self.handler_ctx, try self.fmtmsg(.{"resize"}));
}
pub fn stop(self: *Self) void {

View file

@ -64,7 +64,6 @@ pub fn create(a: std.mem.Allocator, n: Plane) !Widget {
self.widgets_widget = widgets.widget();
try widgets.add(try Widget.empty(a, n, .dynamic));
self.statusbar = try widgets.addP(try @import("status/statusbar.zig").create(a, w));
self.resize();
if (tp.env.get().is("show-input"))
self.toggle_inputview_async();
if (tp.env.get().is("show-log"))
@ -101,10 +100,6 @@ pub fn render(self: *Self, theme: *const Widget.Theme) bool {
return widgets_more or views_more;
}
pub fn resize(self: *Self) void {
self.handle_resize(Box.from(self.plane));
}
pub fn handle_resize(self: *Self, pos: Box) void {
self.widgets.resize(pos);
self.floating_views.resize(pos);
@ -135,7 +130,7 @@ fn toggle_panel_view(self: *Self, view: anytype, enable_only: bool) error{Exit}!
panels.add(view.create(self.a, self.widgets.plane) catch |e| return tp.exit_error(e)) catch |e| return tp.exit_error(e);
self.panels = panels;
}
self.resize();
tui.current().resize();
return enabled;
}
@ -144,7 +139,7 @@ fn close_all_panel_views(self: *Self) void {
self.widgets.remove(panels.widget());
self.panels = null;
}
self.resize();
tui.current().resize();
}
fn toggle_view(self: *Self, view: anytype) tp.result {
@ -153,7 +148,7 @@ fn toggle_view(self: *Self, view: anytype) tp.result {
} else {
self.widgets.add(view.create(self.a, self.plane) catch |e| return tp.exit_error(e)) catch |e| return tp.exit_error(e);
}
self.resize();
tui.current().resize();
}
const cmds = struct {
@ -411,7 +406,7 @@ fn create_editor(self: *Self) tp.result {
self.editor = if (editor.dynamic_cast(ed.EditorWidget)) |p| &p.editor else null;
} else @panic("mainview editor not found");
self.widgets.replace(0, editor_widget);
self.resize();
tui.current().resize();
}
fn toggle_logview_async(_: *Self) void {
@ -435,7 +430,7 @@ fn create_home(self: *Self) tp.result {
var home_widget = home.create(self.a, Widget.to(self)) catch |e| return tp.exit_error(e);
errdefer home_widget.deinit(self.a);
self.widgets.replace(0, home_widget);
self.resize();
tui.current().resize();
}
fn write_restore_info(self: *Self) void {

View file

@ -125,6 +125,7 @@ fn init(a: Allocator) !*Self {
if (builtin.os.tag != .windows)
try self.listen_sigwinch();
self.mainview = try mainview.create(a, n);
self.resize();
try self.rdr.render();
try self.save_config();
if (tp.env.get().is("restore-session")) {
@ -218,14 +219,11 @@ fn receive_safe(self: *Self, from: tp.pid_ref, m: tp.message) tp.result {
if (try m.match(.{"sigwinch"})) {
try self.listen_sigwinch();
self.rdr.query_resize() catch |e| return self.logger.err("query_resize", e);
self.mainview.resize(Widget.Box.from(self.rdr.stdplane()));
need_render();
return;
};
if (try m.match(.{"resize"})) {
self.mainview.resize(Widget.Box.from(self.rdr.stdplane()));
need_render();
self.resize();
return;
}
@ -682,6 +680,11 @@ pub fn need_render() void {
tp.self_pid().send(.{"render"}) catch {};
}
pub fn resize(self: *Self) void {
self.mainview.resize(Widget.Box.from(self.rdr.stdplane()));
need_render();
}
pub fn get_theme_by_name(name: []const u8) ?Widget.Theme {
for (Widget.themes) |theme| {
if (std.mem.eql(u8, theme.name, name))