tAdd vertical scrolling - ve - a minimal text editor (work in progress)
 (HTM) git clone git://src.adamsgaard.dk/ve
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 65a91ff9999be9f55f6f57b1ca91afc65f8bdbf6
 (DIR) parent fd944c194e43e14db7bf4fdaf5c5fbc726683c5e
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       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(-)
       ---
 (DIR) 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 */
 (DIR) 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':
 (DIR) 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)+1,
       +                 E.cursor_x+1);
                ab_append(&ab, buf, strlen(buf));
        
                ab_append(&ab, "\x1b[?25h", 6); /* show cursor */
 (DIR) 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");
        }