diff --git a/CHANGELOG.md b/CHANGELOG.md index ca17ca4a..a2b30c01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ (https://codeberg.org/dnkl/foot/issues/146). * Color flashes when changing the color palette with OSC 4,10,11 (https://codeberg.org/dnkl/foot/issues/141). +* Scrollback position is now retained when resizing the window + (https://codeberg.org/dnkl/foot/issues/142). ### Security diff --git a/grid.c b/grid.c index e4b7c063..5f2b4277 100644 --- a/grid.c +++ b/grid.c @@ -65,6 +65,9 @@ grid_reflow(struct grid *grid, int new_rows, int new_cols, const int old_rows = grid->num_rows; const int old_cols = grid->num_cols; + /* Is viewpoint tracking current grid offset? */ + const bool view_follows = grid->view == grid->offset; + int new_col_idx = 0; int new_row_idx = 0; @@ -97,9 +100,14 @@ grid_reflow(struct grid *grid, int new_rows, int new_cols, tll_push_back(tracking_points, &cursor); tll_push_back(tracking_points, &saved_cursor); + struct coord viewport = {0, grid->view}; + if (!view_follows) + tll_push_back(tracking_points, &viewport); + for (size_t i = 0; i < tracking_points_count; i++) tll_push_back(tracking_points, _tracking_points[i]); + /* * Walk the old grid */ @@ -308,7 +316,8 @@ grid_reflow(struct grid *grid, int new_rows, int new_cols, grid->offset += new_rows; while (new_grid[grid->offset] == NULL) grid->offset = (grid->offset + 1) & (new_rows - 1); - grid->view = grid->offset; + + grid->view = view_follows ? grid->offset : viewport.row; /* Ensure all visible rows have been allocated */ for (int r = 0; r < new_screen_rows; r++) {