]> git.mdlowis.com Git - projs/tide.git/commitdiff
reworked redraw code to prepare for more efficient scrolling
authorMichael D. Lowis <mike@mdlowis.com>
Thu, 19 Apr 2018 01:24:55 +0000 (21:24 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Thu, 19 Apr 2018 01:24:55 +0000 (21:24 -0400)
inc/edit.h
lib/view.c
lib/x11.c

index 0e71be85dd94a32c8e15efd8ef1edd748ef35609..3c0ec6b2cd913cbe730151a0bb49772015a376b1 100644 (file)
@@ -89,6 +89,9 @@ typedef struct {
         CENTER = (1 << 1),
     } sync_flags;
     Buf buffer;   /* the buffer used to populate the view */
+    size_t index;
+    size_t width;
+    size_t nvisible;
     size_t nrows; /* number of rows and columns in the view */
     Row** rows;   /* array of row data structures */
 } View;
index bcff0eb581fba45dbefea9a1528231d283ee9971..b41ce9efc55bc6f374b8d00efd8ce2de5f55425a 100644 (file)
@@ -61,15 +61,22 @@ static Sel* getsel(View* view) {
     return &(view->buffer.selection);
 }
 
-void view_init(View* view, char* file) {
-    if (view->nrows) {
+static void clear_rows(View* view) {
+    if (view->rows) {
         for (size_t i = 0; i < view->nrows; i++)
             free(view->rows[i]);
         free(view->rows);
+        view->rows = NULL;
         view->nrows = 0;
-        view->rows  = NULL;
     }
+}
+
+void view_init(View* view, char* file) {
+    clear_rows(view);
     view->sync_flags |= (CURSOR|CENTER);
+    view->index = 0;
+    view->width = 0;
+    view->nvisible = 0;
     /* load the file and jump to the address returned from the load function */
     buf_init(BUF);
     if (file) buf_load(BUF, file);
@@ -98,17 +105,16 @@ size_t rune_width(int c, size_t xpos, size_t width) {
 }
 
 void view_resize(View* view, size_t width, size_t nrows) {
-    /* free up the old data */
-    if (view->rows) {
-        for (size_t i = 0; i < view->nrows; i++)
-            free(view->rows[i]);
-        free(view->rows);
-        view->rows = NULL;
-        view->nrows = 0;
-    }
-    size_t off = 0;
+    if (view->width == width && view->nvisible == nrows)
+        return;
     /* start from beginning of first line and populate row by row */
-    for (size_t i = 0; i < nrows; i++) {
+    clear_rows(view);
+    view->width = width;
+    view->nvisible = nrows;
+
+    size_t off = (view->rows ? view->rows[view->index]->off : 0);
+    off = buf_bol(&(view->buffer), off);
+    for (size_t i = 0; nrows > 0; nrows--, i++) {
         view->nrows++;
         view->rows = realloc(view->rows, sizeof(Row*) * view->nrows);
         view->rows[view->nrows-1] = calloc(1, sizeof(Row));
index 99f1d110fcd90701bee205d660003e22d5889738..535dcdfca215401450df6c96a1782094999a886a 100644 (file)
--- a/lib/x11.c
+++ b/lib/x11.c
@@ -306,9 +306,9 @@ static void draw_view(int i, size_t nrows, drawcsr* csr, int bg, int fg, int sel
     view_resize(view, (csr->w - csr->x), nrows);
     view_update(view, &csrx, &csry);
     draw_rect(bg, csr->x, csr->y, csr->w, (nrows * fheight) + 9);
-    for (size_t y = 0; y < view->nrows; y++) {
-        Row* row = view_getrow(view, y);
-        draw_glyphs(csr->x + 2, csr->y + 2 + (y * fheight), row->cols, row->len);
+    for (size_t i = 0; i < nrows; i++) {
+        Row* row = view_getrow(view, i + view->index);
+        draw_glyphs(csr->x + 2, csr->y + 2 + (i * fheight), row->cols, row->len);
     }
     /* place the cursor on screen */
     if (!view_selsize(view) && csrx != SIZE_MAX && csry != SIZE_MAX) {