From 1d338f8477d64502c71d06e2ee994084f5935054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 10 Jul 2019 09:29:36 +0200 Subject: [PATCH] scrollback: don't scroll past scrollback history --- commands.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/commands.c b/commands.c index 47bbb4a8..7e29c6e5 100644 --- a/commands.c +++ b/commands.c @@ -8,6 +8,7 @@ #include "grid.h" #define max(x, y) ((x) > (y) ? (x) : (y)) +#define min(x, y) ((x) < (y) ? (x) : (y)) void cmd_scrollback_up(struct terminal *term, int rows) @@ -15,10 +16,12 @@ cmd_scrollback_up(struct terminal *term, int rows) if (term->grid == &term->alt) return; - assert(term->grid->offset >= 0); - int new_view = (term->grid->view + term->grid->num_rows - rows) % term->grid->num_rows; + rows = min(rows, term->grid->num_rows - term->rows); - LOG_WARN("%d" ,new_view); + assert(term->grid->offset >= 0); + assert(rows <= term->rows); + + int new_view = (term->grid->view + term->grid->num_rows - rows) % term->grid->num_rows; assert(new_view >= 0); assert(new_view < term->grid->num_rows); @@ -26,6 +29,17 @@ cmd_scrollback_up(struct terminal *term, int rows) while (!term->grid->rows[new_view]->initialized) new_view = (new_view + 1) % term->grid->num_rows; + /* Don't scroll past scrollback history */ + int end = (term->grid->offset + term->rows) % term->grid->num_rows; + if (end >= term->grid->offset) { + /* Not wrapped */ + if (new_view >= term->grid->offset && new_view < end) + new_view = end; + } else { + if (new_view >= term->grid->offset || new_view < end) + new_view = end; + } + LOG_DBG("scrollback UP: %d -> %d (offset = %d, rows = %d)", term->grid->view, new_view, term->grid->offset, term->grid->num_rows); term->grid->view = new_view; @@ -43,10 +57,11 @@ cmd_scrollback_down(struct terminal *term, int rows) if (term->grid == &term->alt) return; - assert(term->grid->offset >= 0); - int new_view = (term->grid->view + rows) % term->grid->num_rows; + rows = min(rows, term->grid->num_rows - term->rows); - LOG_WARN("%d" ,new_view); + assert(term->grid->offset >= 0); + + int new_view = (term->grid->view + rows) % term->grid->num_rows; assert(new_view >= 0); assert(new_view < term->grid->num_rows); @@ -65,6 +80,18 @@ cmd_scrollback_down(struct terminal *term, int rows) } } while (!all_initialized); + /* Don't scroll past scrollback history */ + int end = (term->grid->offset + term->rows) % term->grid->num_rows; + if (end >= term->grid->offset) { + /* Not wrapped */ + if (new_view >= term->grid->offset && new_view < end) + new_view = term->grid->offset; + } else { + if (new_view >= term->grid->offset || new_view < end) + new_view = term->grid->offset; + } + + LOG_DBG("scrollback DOWN: %d -> %d (offset = %d, rows = %d)", term->grid->view, new_view, term->grid->offset, term->grid->num_rows); term->grid->view = new_view;