somewhat daring and dangerous scrolling for rendered mode #1823

pull/1838/head
nick black 3 years ago committed by Nick Black
parent 30b9e2b6fb
commit e74070fd32

@ -458,6 +458,7 @@ typedef struct ncpile {
struct ncpile *prev, *next; // circular list struct ncpile *prev, *next; // circular list
size_t crenderlen; // size of crender vector size_t crenderlen; // size of crender vector
int dimy, dimx; // rows and cols at time of render int dimy, dimx; // rows and cols at time of render
int scrolls; // how many real lines need be scrolled at raster
sprixel* sprixelcache; // list of sprixels sprixel* sprixelcache; // list of sprixels
} ncpile; } ncpile;
@ -496,6 +497,7 @@ typedef struct notcurses {
ncpalette palette; // 256-indexed palette can be used instead of/with RGB ncpalette palette; // 256-indexed palette can be used instead of/with RGB
bool palette_damage[NCPALETTESIZE]; bool palette_damage[NCPALETTESIZE];
unsigned stdio_blocking_save; // was stdio blocking at entry? restore on stop. unsigned stdio_blocking_save; // was stdio blocking at entry? restore on stop.
uint64_t flags; // copied from notcurses_options
} notcurses; } notcurses;
// this flag is used internally, by direct mode (which might want // this flag is used internally, by direct mode (which might want
@ -815,7 +817,7 @@ sprite_destroy(const notcurses* nc, const ncpile* p, FILE* out, sprixel* s){
// returns -1 on error, or the number of bytes written. // returns -1 on error, or the number of bytes written.
static inline int static inline int
sprite_draw(const notcurses* n, const ncpile* p, sprixel* s, FILE* out){ sprite_draw(const notcurses* n, const ncpile* p, sprixel* s, FILE* out){
//sprixel_debug(stderr, s); sprixel_debug(stderr, s);
return n->tcache.pixel_draw(p, s, out); return n->tcache.pixel_draw(p, s, out);
} }
@ -823,7 +825,7 @@ sprite_draw(const notcurses* n, const ncpile* p, sprixel* s, FILE* out){
// returns -1 on error, or the number of bytes written. // returns -1 on error, or the number of bytes written.
static inline int static inline int
sprite_redraw(const notcurses* n, const ncpile* p, sprixel* s, FILE* out){ sprite_redraw(const notcurses* n, const ncpile* p, sprixel* s, FILE* out){
//sprixel_debug(stderr, s); sprixel_debug(stderr, s);
if(s->invalidated == SPRIXEL_MOVED && n->tcache.pixel_move){ if(s->invalidated == SPRIXEL_MOVED && n->tcache.pixel_move){
return n->tcache.pixel_move(p, s, out); return n->tcache.pixel_move(p, s, out);
}else{ }else{

@ -599,7 +599,7 @@ int kitty_destroy(const notcurses* nc __attribute__ ((unused)),
// ideally, we wouldn't damage our annihilated sprixcells, but if // ideally, we wouldn't damage our annihilated sprixcells, but if
// we're being annihilated only during this cycle, we need to go // we're being annihilated only during this cycle, we need to go
// ahead and damage it. // ahead and damage it.
r->s.damaged = 1; // r->s.damaged = 1;
} }
}else{ }else{
// need this to damage cells underneath a sprixel we're removing // need this to damage cells underneath a sprixel we're removing

@ -357,6 +357,7 @@ make_ncpile(notcurses* nc, ncplane* n){
ret->crender = NULL; ret->crender = NULL;
ret->crenderlen = 0; ret->crenderlen = 0;
ret->sprixelcache = NULL; ret->sprixelcache = NULL;
ret->scrolls = 0;
} }
return ret; return ret;
} }
@ -1034,6 +1035,7 @@ notcurses* notcurses_core_init(const notcurses_options* opts, FILE* outfp){
if(outfp == NULL){ if(outfp == NULL){
outfp = stdout; outfp = stdout;
} }
ret->flags = opts->flags;
ret->margin_t = opts->margin_t; ret->margin_t = opts->margin_t;
ret->margin_b = opts->margin_b; ret->margin_b = opts->margin_b;
ret->margin_l = opts->margin_l; ret->margin_l = opts->margin_l;
@ -1237,13 +1239,17 @@ int notcurses_stop(notcurses* nc){
fclose(nc->rstate.mstreamfp); fclose(nc->rstate.mstreamfp);
} }
// if we were not using the alternate screen, our cursor's wherever we last // if we were not using the alternate screen, our cursor's wherever we last
// wrote. move it to the bottom left of the screen. // wrote. move it to the bottom left of the screen, *unless*
if(!get_escape(&nc->tcache, ESCAPE_SMCUP)){ // NCOPTION_PRESERVE_CURSOR was used, in which case it's right where we
// if ldimy is 0, we've not yet written anything; leave it untouched // want it (i think?).
if(nc->lfdimy){ if(!(nc->flags & NCOPTION_PRESERVE_CURSOR)){
int targy = nc->lfdimy + nc->margin_t - 1; if(!get_escape(&nc->tcache, ESCAPE_SMCUP)){
// cup is required, no need to test for existence // if ldimy is 0, we've not yet written anything; leave it untouched
tty_emit(tiparm(get_escape(&nc->tcache, ESCAPE_CUP), targy, 0), nc->ttyfd); if(nc->lfdimy){
int targy = nc->lfdimy + nc->margin_t - 1;
// cup is required, no need to test for existence
tty_emit(tiparm(get_escape(&nc->tcache, ESCAPE_CUP), targy, 0), nc->ttyfd);
}
} }
} }
if(nc->ttyfd >= 0){ if(nc->ttyfd >= 0){
@ -1484,8 +1490,12 @@ nccell_obliterate(ncplane* n, nccell* c){
// increment y by 1 and rotate the framebuffer up one line. x moves to 0. // increment y by 1 and rotate the framebuffer up one line. x moves to 0.
void scroll_down(ncplane* n){ void scroll_down(ncplane* n){
//fprintf(stderr, "pre-scroll: %d/%d %d/%d log: %d\n", n->y, n->x, n->leny, n->lenx, n->logrow);
n->x = 0; n->x = 0;
if(n->y == n->leny - 1){ if(n->y == n->leny - 1){
if(n == notcurses_stdplane(ncplane_notcurses(n))){
ncplane_pile(n)->scrolls++;
}
n->logrow = (n->logrow + 1) % n->leny; n->logrow = (n->logrow + 1) % n->leny;
nccell* row = n->fb + nfbcellidx(n, n->y, 0); nccell* row = n->fb + nfbcellidx(n, n->y, 0);
for(int clearx = 0 ; clearx < n->lenx ; ++clearx){ for(int clearx = 0 ; clearx < n->lenx ; ++clearx){

@ -942,6 +942,18 @@ clean_sprixels(notcurses* nc, ncpile* p, FILE* out){
return bytesemitted; return bytesemitted;
} }
static int
rasterize_scrolls(ncpile* p, FILE* out){
//fprintf(stderr, "%d tardies to work off, by far the most in the class\n", p->scrolls);
while(p->scrolls){
if(fprintf(out, "\n") < 0){
return -1;
}
--p->scrolls;
}
return 0;
}
// draw any invalidated sprixels. returns -1 on error, number of bytes written // draw any invalidated sprixels. returns -1 on error, number of bytes written
// on success. any material underneath them has already been updated. // on success. any material underneath them has already been updated.
static int64_t static int64_t
@ -1116,6 +1128,9 @@ notcurses_rasterize_inner(notcurses* nc, ncpile* p, FILE* out, unsigned* asu){
} }
update_palette(nc, out); update_palette(nc, out);
//fprintf(stderr, "RASTERIZE CORE\n"); //fprintf(stderr, "RASTERIZE CORE\n");
if(rasterize_scrolls(p, out)){
return -1;
}
if(rasterize_core(nc, p, out, 0)){ if(rasterize_core(nc, p, out, 0)){
return -1; return -1;
} }

Loading…
Cancel
Save