From bee09c71467f3042569dba2a99e22d69dea8cda3 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 18 Nov 2016 20:45:45 -0500 Subject: [PATCH] Added logic to expand the tag view up to a maximum size based on contents. --- inc/edit.h | 1 + libedit/view.c | 16 ++++++++++++++++ xedit.c | 9 +++++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/inc/edit.h b/inc/edit.h index 2e1cc5a..0d6b3f3 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -146,6 +146,7 @@ typedef struct { } 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); diff --git a/libedit/view.c b/libedit/view.c index e30fbf5..d1f8eca 100644 --- a/libedit/view.c +++ b/libedit/view.c @@ -159,6 +159,22 @@ void view_init(View* view, char* file) { 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; diff --git a/xedit.c b/xedit.c index 3fec61d..5c75c70 100644 --- a/xedit.c +++ b/xedit.c @@ -377,11 +377,12 @@ static void layout(int width, int height) { 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); -- 2.51.0