From bda47480965603f654dcdc48442ac579e4bde763 Mon Sep 17 00:00:00 2001 From: nick black Date: Wed, 8 Dec 2021 01:06:33 -0500 Subject: [PATCH] [ncplane_put] implement autogrow in both dimensions #2440 --- src/lib/notcurses.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/lib/notcurses.c b/src/lib/notcurses.c index 19b88128a..53315bbea 100644 --- a/src/lib/notcurses.c +++ b/src/lib/notcurses.c @@ -1640,6 +1640,10 @@ void scroll_down(ncplane* n){ //fprintf(stderr, "pre-scroll: %d/%d %d/%d log: %d scrolling: %u\n", n->y, n->x, n->leny, n->lenx, n->logrow, n->scrolling); n->x = 0; if(n->y == n->leny - 1){ + if(n->autogrow){ + ncplane_resize_simple(n, n->leny + 1, n->lenx); + return; + } if(n == notcurses_stdplane(ncplane_notcurses(n))){ ncplane_pile(n)->scrolls++; } @@ -1734,24 +1738,27 @@ ncplane_put(ncplane* n, int y, int x, const char* egc, int cols, // line. if scrolling is enabled, move to the next line if so. if x or y are // specified, we must always try to print at exactly that location, and // there's no need to check the present location in that dimension. + bool linesend = false; if(x < 0){ // we checked x for all negatives, but only -1 is valid (our else clause is // predicated on a non-negative x). if(x == -1){ if(n->x + cols - 1 >= n->lenx){ - if(n->scrolling){ - scroll_down(n); - }else if(n->autogrow){ - // FIXME groooooow to the right - }else{ - logerror("target x %d [%.*s] > length %d\n", n->x, bytes, egc, n->lenx); - return -1; - } + linesend = true; } } }else{ if((unsigned)x + cols - 1 >= n->lenx){ - logerror("no room for %d cols [%.*s] at length %d\n", cols, bytes, egc, n->lenx); + linesend = true; + } + } + if(linesend){ + if(n->scrolling){ + scroll_down(n); + }else if(n->autogrow){ + ncplane_resize_simple(n, n->leny, n->lenx + cols); + }else{ + logerror("target x %d [%.*s] > length %d\n", n->x, bytes, egc, n->lenx); return -1; } }