tImplement horizontal 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 b6a1dc1daa16f2ce59d88fba5bf3bfdb36e61136
 (DIR) parent ee8ccbb69c46ce38a5b115821e1dc6816e1dd0dc
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Tue,  6 Aug 2019 13:14:03 +0200
       
       Implement horizontal scrolling
       
       Diffstat:
         M byote.h                             |       4 ++--
         M input.c                             |       3 +--
         M output.c                            |      30 +++++++++++++++++++-----------
         M terminal.c                          |       3 ++-
       
       4 files changed, 24 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/byote.h b/byote.h
       t@@ -14,10 +14,10 @@ typedef struct eRow {
        
        struct editor_config {
                int cursor_x, cursor_y;
       -        int screen_rows, screen_cols;
       +        int screen_rows, screen_columns;
                int num_rows;
                eRow *row;
       -        int row_offset;
       +        int row_offset, column_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@@ -22,8 +22,7 @@ editor_move_cursor(char key)
                                        E.cursor_y--;
                                break;
                        case 'l':
       -                        if (E.cursor_x < E.screen_cols - 1)
       -                                E.cursor_x++;
       +                        E.cursor_x++;
                                break;
                }
        }
 (DIR) diff --git a/output.c b/output.c
       t@@ -51,15 +51,15 @@ draw_status(struct abuf *ab)
                                            "%s editor -- version %s",
                                            PROGNAME, VERSION);
        
       -        if (left_status_len > E.screen_cols)
       -                left_status_len = E.screen_cols;
       +        if (left_status_len > E.screen_columns)
       +                left_status_len = E.screen_columns;
        
       -        padding = E.screen_cols - left_status_len - right_status_len;
       +        padding = E.screen_columns - left_status_len - right_status_len;
                if (padding < 0) {
       -                if (left_status_len < E.screen_cols)
       +                if (left_status_len < E.screen_columns)
                                ab_append(ab, left_status, left_status_len);
                        else
       -                        ab_append(ab, left_status, E.screen_cols);
       +                        ab_append(ab, left_status, E.screen_columns);
                } else {
                        ab_append(ab, left_status, left_status_len);
                        while (padding--)
       t@@ -76,6 +76,11 @@ editor_scroll()
                        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 + E.status_height + 1;
       +
       +        if (E.cursor_x < E.column_offset)
       +                E.column_offset = E.cursor_x;
       +        else if (E.cursor_x >= E.column_offset + E.screen_columns)
       +                E.column_offset = E.cursor_x - E.screen_columns + 1;
        }
        
        /* draw editor screen.
       t@@ -89,10 +94,12 @@ editor_draw_rows(struct abuf *ab)
                        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[file_row].chars, len);
       +                        len = E.row[file_row].size - E.column_offset;
       +                        if (len < 0)
       +                                len = 0;
       +                        if (len > E.screen_columns)
       +                                len = E.screen_columns;
       +                        ab_append(ab, &E.row[file_row].chars[E.column_offset], len);
                        } else {
                                ab_append(ab, "~", 1);
                        }
       t@@ -121,8 +128,9 @@ editor_refresh_screen()
                editor_draw_rows(&ab);
        
                char buf[32];
       -        snprintf(buf, sizeof(buf), "\x1b[%d;%dH", (E.cursor_y - E.row_offset)+1,
       -                 E.cursor_x+1);
       +        snprintf(buf, sizeof(buf), "\x1b[%d;%dH",
       +                (E.cursor_y - E.row_offset)+1,
       +                (E.cursor_x - E.column_offset)+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@@ -114,6 +114,7 @@ init_editor() {
                E.num_rows = 0;
                E.row = NULL;
                E.row_offset = 0;
       -        if (get_window_size(&E.screen_rows, &E.screen_cols) == -1)
       +        E.column_offset = 0;
       +        if (get_window_size(&E.screen_rows, &E.screen_columns) == -1)
                        die("get_window_size");
        }