diff --git a/src/lib/input.c b/src/lib/input.c index 79e95e81c..86df7de7c 100644 --- a/src/lib/input.c +++ b/src/lib/input.c @@ -624,6 +624,7 @@ typedef struct init_state { STATE_XTGETTCAP1, // XTGETTCAP, got '0/1' (DCS 0/1 + r Pt ST) STATE_XTGETTCAP2, // XTGETTCAP, got '+' (DCS 0/1 + r Pt ST) STATE_XTGETTCAP3, // XTGETTCAP, got 'r' (DCS 0/1 + r Pt ST) + STATE_DCS_DRAIN, // throw away input until we hit escape STATE_TDA, // tertiary DA STATE_SDA, // secondary DA (CSI > Pp ; Pv ; Pc c) STATE_DA, // primary DA (CSI ? ... c) OR XTSMGRAPHICS @@ -651,7 +652,7 @@ static int pump_control_read(init_state* inits, unsigned char c){ fprintf(stderr, "state: %2d char: %1c %3d %02x\n", inits->state, isprint(c) ? c : ' ', c, c); if(c == NCKEY_ESC){ - if(inits->state != STATE_NULL && inits->state != STATE_DCS && inits->state != STATE_XTGETTCAP3){ + if(inits->state != STATE_NULL && inits->state != STATE_DCS && inits->state != STATE_DCS_DRAIN && inits->state != STATE_XTVERSION2 && inits->state != STATE_XTGETTCAP3 && inits->state != STATE_DA_DRAIN){ fprintf(stderr, "Unexpected escape in state %d\n", inits->state); } inits->state = STATE_ESC; @@ -694,9 +695,12 @@ pump_control_read(init_state* inits, unsigned char c){ }else if(c == '>'){ inits->state = STATE_XTVERSION1; }else{ - // FIXME error? + inits->state = STATE_DCS_DRAIN; } break; + case STATE_DCS_DRAIN: + // we drain to ST, which is an escape, and thus already handled, so... + break; case STATE_XTVERSION1: if(c == '|'){ inits->state = STATE_XTVERSION2; @@ -704,6 +708,9 @@ pump_control_read(init_state* inits, unsigned char c){ // FIXME error? } break; + case STATE_XTVERSION2: + // FIXME roll up string + break; case STATE_XTGETTCAP1: if(c == '+'){ inits->state = STATE_XTGETTCAP2; @@ -810,6 +817,8 @@ pump_control_read(init_state* inits, unsigned char c){ case STATE_SIXEL_SEMI1: if(c == '0'){ inits->state = STATE_SIXEL_SUCCESS; + }else if(c == '2'){ + inits->state = STATE_XTSMGRAPHICS_DRAIN; }else{ // FIXME error? }