}
}
-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')
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++;
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);
/* 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 */