diff --git a/src/info/main.c b/src/info/main.c index f5bca614b..95dbf92b7 100644 --- a/src/info/main.c +++ b/src/info/main.c @@ -193,7 +193,7 @@ unicodedumper(struct ncplane* n, tinfo* ti, const char* indent){ return 0; } -/*static int +static int display_logo(const tinfo* ti, struct ncplane* n, const char* path){ struct ncvisual* ncv = ncvisual_from_file(path); if(ncv == NULL){ @@ -220,7 +220,7 @@ display_logo(const tinfo* ti, struct ncplane* n, const char* path){ } ncvisual_destroy(ncv); return 0; -}*/ +} static void tinfo_debug_bitmaps(struct ncplane* n, const tinfo* ti, const char* indent){ @@ -247,7 +247,7 @@ tinfo_debug_bitmaps(struct ncplane* n, const tinfo* ti, const char* indent){ char* path = prefix_data("notcurses.png"); if(path){ // FIXME hold off until #1883 is resolved - //display_logo(ti, n, path); + display_logo(ti, n, path); free(path); } } diff --git a/src/lib/internal.h b/src/lib/internal.h index 7cffe914e..f23fc83ee 100644 --- a/src/lib/internal.h +++ b/src/lib/internal.h @@ -123,6 +123,15 @@ typedef struct rasterstate { unsigned lastbr; // background rgb, overloaded for palindexed bg unsigned lastbg; unsigned lastbb; + + // used in CLI mode, these track the end of logical output, to place the + // cursor following each rasterization. they are tracked thusly: + // * initialized to the initial physical cursor position + // * when we write to a physical row greater than logendy, update both + // * when we scroll, subtract one from logendy + // * if logendy reaches -1, reset both to 0 + int logendy, logendx; + uint16_t curattr; // current attributes set (does not include colors) // we elide a color escape iff the color has not changed between two cells bool fgelidable; diff --git a/src/lib/notcurses.c b/src/lib/notcurses.c index d1f7495c9..b41b64df6 100644 --- a/src/lib/notcurses.c +++ b/src/lib/notcurses.c @@ -1111,14 +1111,14 @@ notcurses* notcurses_core_init(const notcurses_options* opts, FILE* outfp){ free(ret); return NULL; } - const char* shortname_term = termname(); -// const char* longname_term = longname(); - int cursor_y = -1, cursor_x = -1; + const char* shortname_term = termname(); // longname() is also available + ret->rstate.logendy = -1; + ret->rstate.logendx = -1; if(interrogate_terminfo(&ret->tcache, ret->ttyfd, shortname_term, utf8, opts->flags & NCOPTION_NO_ALTERNATE_SCREEN, 0, opts->flags & NCOPTION_NO_FONT_CHANGES, - opts->flags & NCOPTION_PRESERVE_CURSOR ? &cursor_y : NULL, - opts->flags & NCOPTION_PRESERVE_CURSOR ? &cursor_x : NULL)){ + opts->flags & NCOPTION_PRESERVE_CURSOR ? &ret->rstate.logendy : NULL, + opts->flags & NCOPTION_PRESERVE_CURSOR ? &ret->rstate.logendx : NULL)){ goto err; } int dimy, dimx; @@ -1158,12 +1158,14 @@ notcurses* notcurses_core_init(const notcurses_options* opts, FILE* outfp){ free_plane(ret->stdplane); goto err; } - if(cursor_y >= 0 && cursor_x >= 0){ - if(!ret->suppress_banner && locate_cursor_early(ret, &cursor_y, &cursor_x)){ - free_plane(ret->stdplane); - goto err; + if(ret->rstate.logendy >= 0 && ret->rstate.logendx >= 0){ + if(!ret->suppress_banner){ + if(locate_cursor_early(ret, &ret->rstate.logendy, &ret->rstate.logendx)){ + free_plane(ret->stdplane); + goto err; + } } - ncplane_cursor_move_yx(ret->stdplane, cursor_y, cursor_x); + ncplane_cursor_move_yx(ret->stdplane, ret->rstate.logendy, ret->rstate.logendx); } if(set_fd_nonblocking(ret->tcache.input.infd, 1, &ret->stdio_blocking_save)){ goto err; @@ -1247,9 +1249,8 @@ int notcurses_stop(notcurses* nc){ if(nc){ ret |= notcurses_stop_minimal(nc); // if we were not using the alternate screen, our cursor's wherever we last - // wrote. move it to the bottom left of the screen, *unless* - // NCOPTION_PRESERVE_CURSOR was used, in which case it's right where we - // want it (i think? FIXME maybe next line's start?). + // wrote. move it to the bottom left of the screen, *unless* PRESERVE_CURSOR + // was used, in which case it's right where we want it. if(!(nc->flags & NCOPTION_PRESERVE_CURSOR)){ if(!get_escape(&nc->tcache, ESCAPE_SMCUP)){ // if ldimy is 0, we've not yet written anything; leave it untouched