send palette updates (initc) #230

This commit is contained in:
nick black 2020-01-15 06:38:26 -05:00 committed by Nick Black
parent dfcdd10cb5
commit 20f4b3493c
3 changed files with 26 additions and 1 deletions

View File

@ -164,6 +164,7 @@ typedef struct notcurses {
char* smkx; // enter keypad transmit mode (keypad_xmit) char* smkx; // enter keypad transmit mode (keypad_xmit)
char* rmkx; // leave keypad transmit mode (keypad_local) char* rmkx; // leave keypad transmit mode (keypad_local)
char* getm; // get mouse events char* getm; // get mouse events
char* initc; // set a palette entry's RGB value
bool RGBflag; // terminfo-reported "RGB" flag for 24bpc directcolor bool RGBflag; // terminfo-reported "RGB" flag for 24bpc directcolor
bool CCCflag; // terminfo-reported "CCC" flag for palette set capability bool CCCflag; // terminfo-reported "CCC" flag for palette set capability
@ -183,6 +184,7 @@ typedef struct notcurses {
unsigned inputbuf_valid_starts; unsigned inputbuf_valid_starts;
unsigned inputbuf_write_at; unsigned inputbuf_write_at;
palette256 palette; // 256-indexed palette can be used instead of RGB palette256 palette; // 256-indexed palette can be used instead of RGB
bool palette_damage[256]; // FIXME derive this value somehow
struct esctrie* inputescapes; // trie of input escapes -> ncspecial_keys struct esctrie* inputescapes; // trie of input escapes -> ncspecial_keys
} notcurses; } notcurses;

View File

@ -496,7 +496,12 @@ interrogate_terminfo(notcurses* nc, const notcurses_options* opts){
const char* cterm = getenv("COLORTERM"); const char* cterm = getenv("COLORTERM");
nc->RGBflag = cterm && (strcmp(cterm, "truecolor") == 0 || strcmp(cterm, "24bit") == 0); nc->RGBflag = cterm && (strcmp(cterm, "truecolor") == 0 || strcmp(cterm, "24bit") == 0);
} }
nc->CCCflag = tigetflag("ccc") == 1; term_verify_seq(&nc->initc, "initc");
if(nc->initc == NULL){
nc->CCCflag = tigetflag("ccc") == 1;
}else{
nc->CCCflag = false;
}
if((nc->colors = tigetnum("colors")) <= 0){ if((nc->colors = tigetnum("colors")) <= 0){
if(!opts->suppress_banner){ if(!opts->suppress_banner){
fprintf(stderr, "This terminal doesn't appear to support colors\n"); fprintf(stderr, "This terminal doesn't appear to support colors\n");
@ -700,6 +705,8 @@ notcurses* notcurses_init(const notcurses_options* opts, FILE* outfp){
ret->inputescapes = NULL; ret->inputescapes = NULL;
ret->ttyinfp = stdin; // FIXME ret->ttyinfp = stdin; // FIXME
memset(&ret->rstate, 0, sizeof(ret->rstate)); memset(&ret->rstate, 0, sizeof(ret->rstate));
memset(&ret->palette_damage, 0, sizeof(ret->palette_damage));
memset(&ret->palette, 0, sizeof(ret->palette));
ret->lastframe = NULL; ret->lastframe = NULL;
ret->lfdimy = 0; ret->lfdimy = 0;
ret->lfdimx = 0; ret->lfdimx = 0;

View File

@ -594,6 +594,21 @@ term_fg_rgb8(notcurses* nc, FILE* out, unsigned r, unsigned g, unsigned b){
return 0; return 0;
} }
static inline int
update_palette(notcurses* nc, FILE* out){
if(nc->CCCflag){
for(size_t damageidx = 0 ; damageidx < sizeof(nc->palette.chans) / sizeof(*nc->palette.chans) ; ++damageidx){
unsigned r, g, b;
if(nc->palette_damage[damageidx]){
channel_rgb(nc->palette.chans[damageidx], &r, &g, &b);
term_emit("initc", tiparm(nc->initc, damageidx, r, g, b), out, false);
nc->palette_damage[damageidx] = false;
}
}
}
return 0;
}
// Producing the frame requires three steps: // Producing the frame requires three steps:
// * render -- build up a flat framebuffer from a set of ncplanes // * render -- build up a flat framebuffer from a set of ncplanes
// * rasterize -- build up a UTF-8 stream of escapes and EGCs // * rasterize -- build up a UTF-8 stream of escapes and EGCs
@ -611,6 +626,7 @@ notcurses_rasterize(notcurses* nc, const struct crender* rvec){
// don't write a clearscreen. we only update things that have been changed. // don't write a clearscreen. we only update things that have been changed.
// we explicitly move the cursor at the beginning of each output line, so no // we explicitly move the cursor at the beginning of each output line, so no
// need to home it expliticly. // need to home it expliticly.
update_palette(nc, out);
for(y = 0 ; y < nc->stdscr->leny ; ++y){ for(y = 0 ; y < nc->stdscr->leny ; ++y){
// how many characters have we elided? it's not worthwhile to invoke a // how many characters have we elided? it's not worthwhile to invoke a
// cursor movement with cup if we only elided one or two. set to INT_MAX // cursor movement with cup if we only elided one or two. set to INT_MAX