]> git.mdlowis.com Git - projs/tide.git/commitdiff
implemented expandable tag region
authorMichael D. Lowis <mike@mdlowis.com>
Thu, 10 May 2018 01:27:36 +0000 (21:27 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Thu, 10 May 2018 01:27:36 +0000 (21:27 -0400)
lib/view.c
lib/x11.c

index 1e7fbfb1a2afcb23202cee801ed06c59ddaff922..ae36cf3e10b1a646a1a08af2a5e6ab5bf1c91267 100644 (file)
@@ -76,21 +76,7 @@ void view_reload(View* view) {
     }
 }
 
-size_t view_limitrows(View* view, size_t maxrows) {
-    size_t nrows = 0, bend = buf_end(&(view->buffer));
-    for (size_t i = 0; i < view->nrows; nrows++, i++) {
-        Row* crow = view->rows[view->index + i];
-        size_t last = (crow->len ? crow->off : crow->cols[crow->len-1].off);
-        if (last >= bend)
-            break;
-    }
-    //printf("%lu %lu\n", nrows, bend);
-    view_resize(view, view->width, nrows);
-    view_update(view, 0, 0);
-    return nrows;
-}
-
-size_t rune_width(int c, size_t xpos, size_t width) {
+static size_t rune_width(int c, size_t xpos, size_t width) {
     if (c == '\r')
         return 0;
     else if (c == '\n')
@@ -101,6 +87,20 @@ size_t rune_width(int c, size_t xpos, size_t width) {
         return glyph_width(c);
 }
 
+size_t view_limitrows(View* view, size_t maxrows) {
+    size_t nrows = 1, off = 0, xpos = 0;
+    while (nrows < maxrows && off < buf_end(&(view->buffer))) {
+        Rune rune = buf_getrat(&(view->buffer), off);
+        xpos += rune_width(rune, xpos, view->width);
+        if (rune == '\n') nrows++;
+        if (xpos <= view->width)
+            off = buf_byrune(&(view->buffer), off, RIGHT);
+        else
+            xpos = 0, nrows++;
+    }
+    return nrows;
+}
+
 static size_t add_row(View* view, size_t off) {
     /* allocate a new row */
     view->nrows++;
index 6604312250cec0ba75ffdf5bb2a7f65d7939bd48..545ecb2821cee4557547d07288f7aa0504b8a9b6 100644 (file)
--- a/lib/x11.c
+++ b/lib/x11.c
@@ -282,8 +282,6 @@ static void draw_view(int i, size_t nrows, drawcsr* csr, int bg, int fg, int sel
     View* view = win_view(i);
     view_resize(view, (csr->w - csr->x), nrows);
     view_update(view, &csrx, &csry);
-    if (i == TAGS)
-        nrows = view_limitrows(view, nrows);
     draw_rect(bg, csr->x, csr->y, csr->w, (nrows * fheight) + 9);
     for (size_t i = 0; i < nrows; i++) {
         Row* row = view_getrow(view, i + view->index);
@@ -490,10 +488,12 @@ static void xupdate(Job* job) {
     /* determine the size of the regions */
     drawcsr csr = { .w = X.width, .h = X.height };
     /* draw the regions to the window */
-    size_t tagrows = ((X.height - 2) / 4) / fheight;
+    size_t maxrows = ((X.height - 7) / fheight);
+    size_t tagrows = maxrows / 4;
+    tagrows = view_limitrows(win_view(TAGS), tagrows);
     draw_view(TAGS, tagrows, &csr, TagsBg, TagsFg, TagsSel);
     draw_hrule(&csr);
-    size_t editrows = ((X.height - csr.x) / fheight);
+    size_t editrows = maxrows - tagrows;
     draw_view(EDIT, editrows, &csr, EditBg, EditFg, EditSel);
     draw_scroll(&csr);
     /* flush to the server */