} View;
void view_init(View* view, char* file);
+size_t view_limitrows(View* view, size_t maxrows, size_t ncols);
void view_resize(View* view, size_t nrows, size_t ncols);
void view_update(View* view, size_t* csrx, size_t* csry);
Row* view_getrow(View* view, size_t row);
buf_load(&(view->buffer), file);
}
+size_t view_limitrows(View* view, size_t maxrows, size_t ncols) {
+ size_t nrows = 0;
+ size_t pos = 0;
+ while (nrows < maxrows && pos < buf_end(&(view->buffer))) {
+ for (size_t x = 0; x < ncols;) {
+ Rune r = buf_get(&(view->buffer), pos++);
+ x += runewidth(x, r);
+ if (buf_iseol(&(view->buffer), pos)) {
+ nrows++;
+ break;
+ }
+ }
+ }
+ return (!nrows ? 1 : nrows);
+}
+
void view_resize(View* view, size_t nrows, size_t ncols) {
size_t off = 0;
if (view->nrows == nrows && view->ncols == ncols) return;
Regions[i].height = fheight;
}
/* Place the tag region relative to status */
- Regions[TAGS].y = 5 + Regions[STATUS].y + Regions[STATUS].height;
- size_t maxtagrows = ((height - Regions[TAGS].y - 5) / 4) / fheight;
- size_t tagrows = (TagWinExpanded ? maxtagrows : 1);
+ Regions[TAGS].y = 5 + Regions[STATUS].y + Regions[STATUS].height;
+ size_t maxtagrows = ((height - Regions[TAGS].y - 5) / 4) / fheight;
+ size_t tagcols = Regions[TAGS].width / fwidth;
+ size_t tagrows = view_limitrows(getview(TAGS), maxtagrows, tagcols);
Regions[TAGS].height = tagrows * fheight;
- view_resize(getview(TAGS), tagrows, Regions[TAGS].width / fwidth);
+ view_resize(getview(TAGS), tagrows, tagcols);
/* Place the edit region relative to status */
Regions[EDIT].y = 5 + Regions[TAGS].y + Regions[TAGS].height;
Regions[EDIT].height = (height - Regions[EDIT].y - 5);