| tAdd vertical scrolling - ve - a minimal text editor (work in progress) | |
| git clone git://src.adamsgaard.dk/ve | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 65a91ff9999be9f55f6f57b1ca91afc65f8bdbf6 | |
| parent fd944c194e43e14db7bf4fdaf5c5fbc726683c5e | |
| Author: Anders Damsgaard <[email protected]> | |
| Date: Tue, 6 Aug 2019 12:29:55 +0200 | |
| Add vertical scrolling | |
| Diffstat: | |
| M byote.h | 1 + | |
| M input.c | 2 +- | |
| M output.c | 32 ++++++++++++++++++++---------… | |
| M terminal.c | 1 + | |
| 4 files changed, 24 insertions(+), 12 deletions(-) | |
| --- | |
| diff --git a/byote.h b/byote.h | |
| t@@ -17,6 +17,7 @@ struct editor_config { | |
| int screen_rows, screen_cols; | |
| int num_rows; | |
| eRow *row; | |
| + int row_offset; | |
| struct termios orig_termios; | |
| int status_height; | |
| int mode; /* 0: normal, 1: insert, 2: visual */ | |
| diff --git a/input.c b/input.c | |
| t@@ -14,7 +14,7 @@ editor_move_cursor(char key) | |
| E.cursor_x--; | |
| break; | |
| case 'j': | |
| - if (E.cursor_y < E.screen_rows - 1 - E.status_height) | |
| + if (E.cursor_y < E.num_rows - E.status_height) | |
| E.cursor_y++; | |
| break; | |
| case 'k': | |
| diff --git a/output.c b/output.c | |
| t@@ -68,25 +68,32 @@ draw_status(struct abuf *ab) | |
| } | |
| } | |
| +void | |
| +editor_scroll() | |
| +{ | |
| + if (E.cursor_y < E.row_offset) | |
| + E.row_offset = E.cursor_y; | |
| + else if (E.cursor_y >= E.row_offset + E.screen_rows - E.status_height) | |
| + E.row_offset = E.cursor_y - E.screen_rows + 1; | |
| +} | |
| + | |
| /* draw editor screen. | |
| * show tilde characters after EOF, and show status on last line */ | |
| void | |
| editor_draw_rows(struct abuf *ab) | |
| { | |
| - int y, len; | |
| + int y, len, file_row; | |
| for (y = 0; y < E.screen_rows; ++y) { | |
| - | |
| - if (y < E.num_rows) { | |
| - len = E.row[y].size; | |
| + file_row = y + E.row_offset; | |
| + if (y == E.screen_rows-1) { | |
| + draw_status(ab); | |
| + } else if (file_row < E.num_rows) { | |
| + len = E.row[file_row].size; | |
| if (len > E.screen_cols) | |
| len = E.screen_cols; | |
| - ab_append(ab, E.row[y].chars, len); | |
| - | |
| + ab_append(ab, E.row[file_row].chars, len); | |
| } else { | |
| - if (y == E.screen_rows-1) | |
| - draw_status(ab); | |
| - else | |
| - ab_append(ab, "~", 1); | |
| + ab_append(ab, "~", 1); | |
| } | |
| ab_append(ab, "\x1b[K", 3); /* erase to end of line */ | |
| t@@ -104,6 +111,8 @@ editor_draw_rows(struct abuf *ab) | |
| void | |
| editor_refresh_screen() | |
| { | |
| + editor_scroll(); | |
| + | |
| struct abuf ab = ABUF_INIT; | |
| ab_append(&ab, "\x1b[?25l", 6); /* hide cursor */ | |
| ab_append(&ab, "\x1b[H", 3); /* cursor to home */ | |
| t@@ -111,7 +120,8 @@ editor_refresh_screen() | |
| editor_draw_rows(&ab); | |
| char buf[32]; | |
| - snprintf(buf, sizeof(buf), "\x1b[%d;%dH", E.cursor_y+1, E.cursor_x+1); | |
| + snprintf(buf, sizeof(buf), "\x1b[%d;%dH", (E.cursor_y - E.row_offset)+… | |
| + E.cursor_x+1); | |
| ab_append(&ab, buf, strlen(buf)); | |
| ab_append(&ab, "\x1b[?25h", 6); /* show cursor */ | |
| diff --git a/terminal.c b/terminal.c | |
| t@@ -113,6 +113,7 @@ init_editor() { | |
| E.mode = 0; | |
| E.num_rows = 0; | |
| E.row = NULL; | |
| + E.row_offset = 0; | |
| if (get_window_size(&E.screen_rows, &E.screen_cols) == -1) | |
| die("get_window_size"); | |
| } |