From: Michael D. Lowis Date: Thu, 10 May 2018 01:27:36 +0000 (-0400) Subject: implemented expandable tag region X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=d35460bad74613541a50bb7629da423ff44bd4e5;p=projs%2Ftide.git implemented expandable tag region --- diff --git a/lib/view.c b/lib/view.c index 1e7fbfb..ae36cf3 100644 --- a/lib/view.c +++ b/lib/view.c @@ -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++; diff --git a/lib/x11.c b/lib/x11.c index 6604312..545ecb2 100644 --- 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 */