add ESCAPE_BSU/ESU, clean up query_state #1582

This commit is contained in:
nick black 2021-06-20 04:47:24 -04:00 committed by Nick Black
parent 878eebde0a
commit 57e418284e
2 changed files with 19 additions and 18 deletions

View File

@ -647,7 +647,7 @@ typedef enum {
STATE_XTSMGRAPHICS_DRAIN, // drain out XTSMGRAPHICS to 'S' STATE_XTSMGRAPHICS_DRAIN, // drain out XTSMGRAPHICS to 'S'
} initstates_e; } initstates_e;
typedef struct init_state { typedef struct query_state {
tinfo* tcache; tinfo* tcache;
queried_terminals_e qterm; // discovered terminal queried_terminals_e qterm; // discovered terminal
initstates_e state, stringstate; initstates_e state, stringstate;
@ -658,7 +658,7 @@ typedef struct init_state {
size_t stridx; // position to write in string size_t stridx; // position to write in string
uint32_t bg; // queried default background or 0 uint32_t bg; // queried default background or 0
bool xtgettcap_good; // high when we've received DCS 1 bool xtgettcap_good; // high when we've received DCS 1
} init_state; } query_state;
static int static int
ruts_numeric(int* numeric, unsigned char c){ ruts_numeric(int* numeric, unsigned char c){
@ -699,7 +699,7 @@ ruts_hex(int* numeric, unsigned char c){
// add a decoded hex byte to the string // add a decoded hex byte to the string
static int static int
ruts_string(init_state* inits, initstates_e state){ ruts_string(query_state* inits, initstates_e state){
if(inits->stridx == sizeof(inits->runstring)){ if(inits->stridx == sizeof(inits->runstring)){
return -1; // overflow, too long return -1; // overflow, too long
} }
@ -717,7 +717,7 @@ ruts_string(init_state* inits, initstates_e state){
} }
static int static int
stash_string(init_state* inits){ stash_string(query_state* inits){
//fprintf(stderr, "string terminator after %d [%s]\n", inits->stringstate, inits->runstring); //fprintf(stderr, "string terminator after %d [%s]\n", inits->stringstate, inits->runstring);
switch(inits->stringstate){ switch(inits->stringstate){
case STATE_XTVERSION1:{ case STATE_XTVERSION1:{
@ -771,7 +771,7 @@ stash_string(init_state* inits){
// returns 1 after handling the Device Attributes response, 0 if more input // returns 1 after handling the Device Attributes response, 0 if more input
// ought be fed to the machine, and -1 on an invalid state transition. // ought be fed to the machine, and -1 on an invalid state transition.
static int static int
pump_control_read(init_state* inits, unsigned char c){ pump_control_read(query_state* inits, unsigned char c){
//fprintf(stderr, "state: %2d char: %1c %3d %02x\n", inits->state, isprint(c) ? c : ' ', c, c); //fprintf(stderr, "state: %2d char: %1c %3d %02x\n", inits->state, isprint(c) ? c : ' ', c, c);
if(c == NCKEY_ESC){ if(c == NCKEY_ESC){
inits->state = STATE_ESC; inits->state = STATE_ESC;
@ -1071,26 +1071,18 @@ pump_control_read(init_state* inits, unsigned char c){
// complete the terminal detection process // complete the terminal detection process
static int static int
control_read(tinfo* tcache, int ttyfd, queried_terminals_e* detected, uint32_t* bg){ control_read(int ttyfd, query_state* qstate){
init_state inits = {
.tcache = tcache,
.state = STATE_NULL,
.qterm = TERMINAL_UNKNOWN,
};
unsigned char* buf; unsigned char* buf;
ssize_t s; ssize_t s;
*detected = TERMINAL_UNKNOWN;
if((buf = malloc(BUFSIZ)) == NULL){ if((buf = malloc(BUFSIZ)) == NULL){
return -1; return -1;
} }
while((s = read(ttyfd, buf, BUFSIZ)) != -1){ while((s = read(ttyfd, buf, BUFSIZ)) != -1){
for(ssize_t idx = 0; idx < s ; ++idx){ for(ssize_t idx = 0; idx < s ; ++idx){
int r = pump_control_read(&inits, buf[idx]); int r = pump_control_read(qstate, buf[idx]);
if(r == 1){ // success! if(r == 1){ // success!
free(buf); free(buf);
*detected = inits.qterm;
*bg = inits.bg;
//fprintf(stderr, "at end, derived terminal %d\n", inits.qterm); //fprintf(stderr, "at end, derived terminal %d\n", inits.qterm);
return 0; return 0;
}else if(r < 0){ }else if(r < 0){
@ -1119,12 +1111,17 @@ int ncinputlayer_init(tinfo* tcache, FILE* infp, queried_terminals_e* detected){
nilayer->input_events = 0; nilayer->input_events = 0;
int csifd = nilayer->ttyfd >= 0 ? nilayer->ttyfd : nilayer->infd; int csifd = nilayer->ttyfd >= 0 ? nilayer->ttyfd : nilayer->infd;
if(isatty(csifd)){ if(isatty(csifd)){
uint32_t bg; query_state inits = {
if(control_read(tcache, csifd, detected, &bg)){ .tcache = tcache,
.state = STATE_NULL,
.qterm = TERMINAL_UNKNOWN,
};
if(control_read(csifd, &inits)){
input_free_esctrie(&nilayer->inputescapes); input_free_esctrie(&nilayer->inputescapes);
return -1; return -1;
} }
tcache->bg_collides_default = bg; tcache->bg_collides_default = inits.bg;
*detected = inits.qterm;
} }
return 0; return 0;
} }

View File

@ -61,6 +61,10 @@ typedef enum {
ESCAPE_INITC, // "initc" set up palette entry ESCAPE_INITC, // "initc" set up palette entry
ESCAPE_GETM, // "getm" get mouse events ESCAPE_GETM, // "getm" get mouse events
ESCAPE_DSRCPR, // "u7" cursor position report ESCAPE_DSRCPR, // "u7" cursor position report
// Application synchronized updates, not present in terminfo
// (https://gitlab.com/gnachman/iterm2/-/wikis/synchronized-updates-spec)
ESCAPE_BSU, // Begin Synchronized Update
ESCAPE_ESU, // End Synchronized Update
ESCAPE_MAX ESCAPE_MAX
} escape_e; } escape_e;