fully hook up resize

This commit is contained in:
Mitchell Hashimoto
2022-11-04 20:33:44 -07:00
parent b100406a6e
commit f1d2df1a54

View File

@ -39,6 +39,9 @@ renderer_state: *renderer.State,
/// a repaint should happen. /// a repaint should happen.
renderer_wakeup: libuv.Async, renderer_wakeup: libuv.Async,
/// The cached grid size whenever a resize is called.
grid_size: renderer.GridSize,
/// Initialize the exec implementation. This will also start the child /// Initialize the exec implementation. This will also start the child
/// process. /// process.
pub fn init(alloc: Allocator, opts: termio.Options) !Exec { pub fn init(alloc: Allocator, opts: termio.Options) !Exec {
@ -96,6 +99,7 @@ pub fn init(alloc: Allocator, opts: termio.Options) !Exec {
.terminal_stream = undefined, .terminal_stream = undefined,
.renderer_state = opts.renderer_state, .renderer_state = opts.renderer_state,
.renderer_wakeup = opts.renderer_wakeup, .renderer_wakeup = opts.renderer_wakeup,
.grid_size = opts.grid_size,
}; };
} }
@ -133,8 +137,10 @@ pub fn threadEnter(self: *Exec, loop: libuv.Loop) !ThreadData {
.data_stream = stream, .data_stream = stream,
.terminal_stream = .{ .terminal_stream = .{
.handler = .{ .handler = .{
.alloc = self.alloc,
.ev = ev_data_ptr, .ev = ev_data_ptr,
.terminal = &self.terminal, .terminal = &self.terminal,
.grid_size = &self.grid_size,
}, },
}, },
}; };
@ -166,6 +172,9 @@ pub fn resize(
.ws_ypixel = @intCast(u16, screen_size.height), .ws_ypixel = @intCast(u16, screen_size.height),
}); });
// Update our cached grid size
self.grid_size = grid_size;
// Enter the critical area that we want to keep small // Enter the critical area that we want to keep small
{ {
self.renderer_state.mutex.lock(); self.renderer_state.mutex.lock();
@ -371,6 +380,8 @@ fn ttyRead(t: *libuv.Tty, n: isize, buf: []const u8) void {
/// unless all of the member fields are copied. /// unless all of the member fields are copied.
const StreamHandler = struct { const StreamHandler = struct {
ev: *EventData, ev: *EventData,
alloc: Allocator,
grid_size: *renderer.GridSize,
terminal: *terminal.Terminal, terminal: *terminal.Terminal,
/// Bracketed paste mode /// Bracketed paste mode
@ -496,72 +507,72 @@ const StreamHandler = struct {
self.terminal.setScrollingRegion(top, bot); self.terminal.setScrollingRegion(top, bot);
} }
// pub fn setMode(self: *StreamHandler, mode: terminal.Mode, enabled: bool) !void { pub fn setMode(self: *StreamHandler, mode: terminal.Mode, enabled: bool) !void {
// switch (mode) { switch (mode) {
// .reverse_colors => { .reverse_colors => {
// self.terminal.modes.reverse_colors = enabled; self.terminal.modes.reverse_colors = enabled;
//
// // Schedule a render since we changed colors // Schedule a render since we changed colors
// try self.queueRender(); try self.queueRender();
// }, },
//
// .origin => { .origin => {
// self.terminal.modes.origin = enabled; self.terminal.modes.origin = enabled;
// self.terminal.setCursorPos(1, 1); self.terminal.setCursorPos(1, 1);
// }, },
//
// .autowrap => { .autowrap => {
// self.terminal.modes.autowrap = enabled; self.terminal.modes.autowrap = enabled;
// }, },
//
// .cursor_visible => { .cursor_visible => {
// self.ev.renderer_state.cursor.visible = enabled; self.ev.renderer_state.cursor.visible = enabled;
// }, },
//
// .alt_screen_save_cursor_clear_enter => { .alt_screen_save_cursor_clear_enter => {
// const opts: terminal.Terminal.AlternateScreenOptions = .{ const opts: terminal.Terminal.AlternateScreenOptions = .{
// .cursor_save = true, .cursor_save = true,
// .clear_on_enter = true, .clear_on_enter = true,
// }; };
//
// if (enabled) if (enabled)
// self.terminal.alternateScreen(opts) self.terminal.alternateScreen(opts)
// else else
// self.terminal.primaryScreen(opts); self.terminal.primaryScreen(opts);
//
// // Schedule a render since we changed screens // Schedule a render since we changed screens
// try self.queueRender(); try self.queueRender();
// }, },
//
// .bracketed_paste => self.bracketed_paste = true, .bracketed_paste => self.bracketed_paste = true,
//
// .enable_mode_3 => { .enable_mode_3 => {
// // Disable deccolm // Disable deccolm
// self.terminal.setDeccolmSupported(enabled); self.terminal.setDeccolmSupported(enabled);
//
// // Force resize back to the window size // Force resize back to the window size
// self.terminal.resize(self.alloc, self.grid_size.columns, self.grid_size.rows) catch |err| self.terminal.resize(self.alloc, self.grid_size.columns, self.grid_size.rows) catch |err|
// log.err("error updating terminal size: {}", .{err}); log.err("error updating terminal size: {}", .{err});
// }, },
//
// .@"132_column" => try self.terminal.deccolm( .@"132_column" => try self.terminal.deccolm(
// self.alloc, self.alloc,
// if (enabled) .@"132_cols" else .@"80_cols", if (enabled) .@"132_cols" else .@"80_cols",
// ), ),
//
// .mouse_event_x10 => self.terminal.modes.mouse_event = if (enabled) .x10 else .none, .mouse_event_x10 => self.terminal.modes.mouse_event = if (enabled) .x10 else .none,
// .mouse_event_normal => self.terminal.modes.mouse_event = if (enabled) .normal else .none, .mouse_event_normal => self.terminal.modes.mouse_event = if (enabled) .normal else .none,
// .mouse_event_button => self.terminal.modes.mouse_event = if (enabled) .button else .none, .mouse_event_button => self.terminal.modes.mouse_event = if (enabled) .button else .none,
// .mouse_event_any => self.terminal.modes.mouse_event = if (enabled) .any else .none, .mouse_event_any => self.terminal.modes.mouse_event = if (enabled) .any else .none,
//
// .mouse_format_utf8 => self.terminal.modes.mouse_format = if (enabled) .utf8 else .x10, .mouse_format_utf8 => self.terminal.modes.mouse_format = if (enabled) .utf8 else .x10,
// .mouse_format_sgr => self.terminal.modes.mouse_format = if (enabled) .sgr else .x10, .mouse_format_sgr => self.terminal.modes.mouse_format = if (enabled) .sgr else .x10,
// .mouse_format_urxvt => self.terminal.modes.mouse_format = if (enabled) .urxvt else .x10, .mouse_format_urxvt => self.terminal.modes.mouse_format = if (enabled) .urxvt else .x10,
// .mouse_format_sgr_pixels => self.terminal.modes.mouse_format = if (enabled) .sgr_pixels else .x10, .mouse_format_sgr_pixels => self.terminal.modes.mouse_format = if (enabled) .sgr_pixels else .x10,
//
// else => if (enabled) log.warn("unimplemented mode: {}", .{mode}), else => if (enabled) log.warn("unimplemented mode: {}", .{mode}),
// } }
// } }
pub fn setAttribute(self: *StreamHandler, attr: terminal.Attribute) !void { pub fn setAttribute(self: *StreamHandler, attr: terminal.Attribute) !void {
switch (attr) { switch (attr) {