diff --git a/kernel/src/Api/BuildNo.hpp b/kernel/src/Api/BuildNo.hpp index 86e9e2a..4e12ae4 100644 --- a/kernel/src/Api/BuildNo.hpp +++ b/kernel/src/Api/BuildNo.hpp @@ -12,4 +12,4 @@ #pragma once -#define MONTAUK_BUILD_NUMBER 107 +#define MONTAUK_BUILD_NUMBER 108 diff --git a/programs/include/gui/terminal.hpp b/programs/include/gui/terminal.hpp index bd935fe..70f41aa 100644 --- a/programs/include/gui/terminal.hpp +++ b/programs/include/gui/terminal.hpp @@ -795,11 +795,21 @@ static inline void terminal_resize(TerminalState* t, int new_cols, int new_rows) } } - int new_scrollback = keep - new_rows; + // Anchor the new visible region to the cursor's line. Treating the bottom + // new_rows of kept content as the screen (the naive keep - new_rows) only + // works when the screen is full: with a partly filled screen -- e.g. a + // shell prompt a few lines down with blank rows below it -- it would push + // the real text up into scrollback and drop the view onto the blank region, + // so a zoom appears to scroll down and strands the cursor in empty space. + // Instead pin the cursor to the bottom row when there is enough history + // above it, otherwise keep the content anchored at the top. + int abs_cursor_y = t->scrollback_lines + t->cursor_y - discard; + if (abs_cursor_y < 0) abs_cursor_y = 0; + int new_scrollback = abs_cursor_y - (new_rows - 1); if (new_scrollback < 0) new_scrollback = 0; + if (new_scrollback > t->max_scrollback) new_scrollback = t->max_scrollback; // Adjust cursor - int abs_cursor_y = t->scrollback_lines + t->cursor_y - discard; int new_cursor_y = abs_cursor_y - new_scrollback; if (new_cursor_y < 0) new_cursor_y = 0; if (new_cursor_y >= new_rows) new_cursor_y = new_rows - 1;