From efc8cc49143c8945e3243380c86571af55e198cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 19 Jun 2019 10:27:31 +0200 Subject: [PATCH] wip: initial scrolling support (no scrollback though) --- grid.c | 24 ++++++++++++++++++++++++ grid.h | 3 +++ vt.c | 14 ++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/grid.c b/grid.c index d2287af5..d03765cc 100644 --- a/grid.c +++ b/grid.c @@ -3,6 +3,10 @@ #include #include +#define LOG_MODULE "grid" +#define LOG_ENABLE_DBG 1 +#include "log.h" + #define min(x, y) ((x) < (y) ? (x) : (y)) #define max(x, y) ((x) > (y) ? (x) : (y)) @@ -11,6 +15,7 @@ grid_erase(struct grid *grid, int start, int end) { for (int i = start; i < end; i++) { struct cell *cell = &grid->cells[i]; + /* TODO: memset entire range */ memset(cell, 0, sizeof(*cell)); cell->attrs.foreground = grid->foreground; @@ -76,3 +81,22 @@ grid_cursor_down(struct grid *grid, int count) int move_amount = min(grid->rows - grid->cursor.row - 1, count); grid_cursor_to(grid, grid->cursor.row + move_amount, grid->cursor.col); } + +void +grid_scroll(struct grid *grid, int rows) +{ + if (rows >= grid->rows) { + grid_erase(grid, 0, grid->rows * grid->cols); + return; + } + + int first_row = rows; + int cell_start = first_row * grid->cols; + int cell_end = grid->rows * grid->cols; + int count = cell_end - cell_start; + LOG_DBG("moving %d cells from %d", count, cell_start); + + memmove(&grid->cells[0], &grid->cells[cell_start], count * sizeof(grid->cells[0])); + grid_erase(grid, cell_end - rows * grid->cols, grid->rows * grid->cols); + grid->all_dirty = true; +} diff --git a/grid.h b/grid.h index 3b806296..5b016830 100644 --- a/grid.h +++ b/grid.h @@ -10,7 +10,10 @@ void grid_cursor_right(struct grid *grid, int count); void grid_cursor_up(struct grid *grid, int count); void grid_cursor_down(struct grid *grid, int count); +void grid_scroll(struct grid *grid, int rows); + int grid_cursor_linear(const struct grid *grid, int row, int col); + //void grid_cursor_to(struct grid *grid, int pos); //void grid_cursor_move(struct grid *grid, int cols); diff --git a/vt.c b/vt.c index 751eece3..1790201a 100644 --- a/vt.c +++ b/vt.c @@ -158,7 +158,11 @@ action(struct terminal *term, enum action action, uint8_t c) LOG_DBG("execute: 0x%02x", c); switch (c) { case '\n': - grid_cursor_down(&term->grid, 1); + LOG_DBG("NEWLINE: %d %d", term->grid.cursor.row, term->grid.rows); + if (term->grid.cursor.row == term->grid.rows - 1) { + grid_scroll(&term->grid, 1); + } else + grid_cursor_down(&term->grid, 1); break; case '\r': @@ -188,8 +192,14 @@ action(struct terminal *term, enum action action, uint8_t c) break; case ACTION_PRINT: { - if (term->grid.print_needs_wrap) + if (term->grid.print_needs_wrap) { + if (term->grid.cursor.row == term->grid.rows - 1) { + assert(false); + grid_scroll(&term->grid, 1); + } + grid_cursor_to(&term->grid, term->grid.cursor.row + 1, 0); + } struct cell *cell = &term->grid.cells[term->grid.linear_cursor];