mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-01 07:15:32 -04:00
scrollback: don't scroll past scrollback history
This commit is contained in:
parent
b058e6384a
commit
1d338f8477
1 changed files with 33 additions and 6 deletions
39
commands.c
39
commands.c
|
|
@ -8,6 +8,7 @@
|
||||||
#include "grid.h"
|
#include "grid.h"
|
||||||
|
|
||||||
#define max(x, y) ((x) > (y) ? (x) : (y))
|
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||||
|
#define min(x, y) ((x) < (y) ? (x) : (y))
|
||||||
|
|
||||||
void
|
void
|
||||||
cmd_scrollback_up(struct terminal *term, int rows)
|
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)
|
if (term->grid == &term->alt)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
assert(term->grid->offset >= 0);
|
rows = min(rows, term->grid->num_rows - term->rows);
|
||||||
int new_view = (term->grid->view + term->grid->num_rows - rows) % term->grid->num_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 >= 0);
|
||||||
assert(new_view < term->grid->num_rows);
|
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)
|
while (!term->grid->rows[new_view]->initialized)
|
||||||
new_view = (new_view + 1) % term->grid->num_rows;
|
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)",
|
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, term->grid->offset, term->grid->num_rows);
|
||||||
term->grid->view = new_view;
|
term->grid->view = new_view;
|
||||||
|
|
@ -43,10 +57,11 @@ cmd_scrollback_down(struct terminal *term, int rows)
|
||||||
if (term->grid == &term->alt)
|
if (term->grid == &term->alt)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
assert(term->grid->offset >= 0);
|
rows = min(rows, term->grid->num_rows - term->rows);
|
||||||
int new_view = (term->grid->view + rows) % term->grid->num_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 >= 0);
|
||||||
assert(new_view < term->grid->num_rows);
|
assert(new_view < term->grid->num_rows);
|
||||||
|
|
||||||
|
|
@ -65,6 +80,18 @@ cmd_scrollback_down(struct terminal *term, int rows)
|
||||||
}
|
}
|
||||||
} while (!all_initialized);
|
} 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)",
|
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, term->grid->offset, term->grid->num_rows);
|
||||||
term->grid->view = new_view;
|
term->grid->view = new_view;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue