diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ninep/pty.zig | 7 | ||||
| -rw-r--r-- | src/pardes.zig | 5 |
2 files changed, 10 insertions, 2 deletions
diff --git a/src/ninep/pty.zig b/src/ninep/pty.zig index 046a456a..4009af49 100644 --- a/src/ninep/pty.zig +++ b/src/ninep/pty.zig @@ -28,6 +28,9 @@ fn dimension(word: []const u8) ?u16 { return if (n == 0 or n > winsize_max) null else n; } +/// The fewest rows a winsize write gives a terminal's pty. +pub const pty_rows_min = 2; + /// As the root ctl's `size` (4096 a side). const winsize_max = 4096; const e_winsize_range = std.fmt.comptimePrint("invalid winsize: out of range, 1x1 to {d}x{d}", .{ winsize_max, winsize_max }); @@ -71,7 +74,9 @@ fn verb(p: *Pardes, id: usize, line: []const u8, apply: bool) bool { switch (v) { .winsize => { const cols = dimension(words.next() orelse return false) orelse return false; - const rows = dimension(words.next() orelse return false) orelse return false; + // Two rows at least, as a pane is laid out: a one-row pty + // loses its prompt's input mark and reads busy for ever. + const rows = @max(pty_rows_min, dimension(words.next() orelse return false) orelse return false); if (words.next() != null) return false; if (!apply) return true; p.emit(.{ .resize_pty = .{ .pane = @intCast(id), .cols = cols, .rows = rows } }); diff --git a/src/pardes.zig b/src/pardes.zig index dd9d91c8..6341de91 100644 --- a/src/pardes.zig +++ b/src/pardes.zig @@ -6596,7 +6596,10 @@ pub const Pardes = struct { pane.tag_top = @intCast(@min(top, lines - pane.tag_rows)); } else pane.tag_top = 0; const cols = @max(1, r.w -| config.GUTTER); - const rows = @max(1, r.h -| pane.tag_rows); // the tag steals the top rows + // The tag steals the top rows. The pty is what the pane shows, + // even one row dragged short: a taller pty would put its cursor + // below the pane (only winsize keeps two, ctlfs.pty). + const rows = @max(1, r.h -| pane.tag_rows); // A terminal's pty follows its pane down to a row, whatever the // resize; only a folded one keeps the size it had, and one not // placed yet the grid it was made with. |
