From 4478896916ff8d36a9183df9968d8860fa07be48 Mon Sep 17 00:00:00 2001 From: nick black Date: Sun, 13 Jun 2021 14:34:36 -0400 Subject: [PATCH] differentiate VT101 vs XTSMGRAPHICS color registers #1469 --- src/lib/input.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/src/lib/input.c b/src/lib/input.c index 82f6be3ab..abdc16237 100644 --- a/src/lib/input.c +++ b/src/lib/input.c @@ -624,10 +624,18 @@ typedef struct init_state { STATE_TDA, // tertiary DA STATE_SDA, // secondary DA (CSI > Pp ; Pv ; Pc c) STATE_DA, // primary DA (CSI ? ... c) OR XTSMGRAPHICS - STATE_DA_1, // got '1', could be XTSMGRAPHICS color registers or primary DA + STATE_DA_1, // got '1', XTSMGRAPHICS color registers or primary DA + STATE_DA_1_SEMI, // got '1;' + STATE_DA_1_0, // got '1;0', XTSMGRAPHICS color registers or VT101 STATE_DA_6, // got '6', could be VT102 or VT220/VT320/VT420 STATE_DA_DRAIN, // drain out the primary DA to 'c' STATE_SIXEL,// XTSMGRAPHICS about Sixel geometry (got '2') + STATE_SIXEL_SEMI1, // got first semicolon in sixel geometry, want Ps + STATE_SIXEL_SUCCESS, // got Ps == 0, want second semicolon + STATE_SIXEL_WIDTH, // reading maximum sixel width until ';' + STATE_SIXEL_HEIGHT, // reading maximum sixel height until 'S' + STATE_SIXEL_CREGS, // reading max color registers until 'S' + STATE_XTSMGRAPHICS_DRAIN, // drain out XTSMGRAPHICS to 'S' } state; bool xtgettcap_good; // high when we've received DCS 1 } init_state; @@ -737,8 +745,33 @@ pump_control_read(init_state* inits, unsigned char c){ if(c == 'c'){ inits->state = STATE_NULL; return 1; + }else if(c == ';'){ + inits->state = STATE_DA_1_SEMI; + }else{ + // FIXME error? + } + break; + case STATE_DA_1_SEMI: + if(c == '2'){ // VT100 with Advanced Video Option + inits->state = STATE_DA_DRAIN; + }else if(c == '0'){ + inits->state = STATE_DA_1_0; + } + break; + case STATE_DA_1_0: + if(c == 'c'){ // VT101 with No Options + inits->state = STATE_NULL; + }else if(c == ';'){ + inits->state = STATE_SIXEL_CREGS; + }else{ + // FIXME error? + } + break; + case STATE_SIXEL_CREGS: + if(c == 'S'){ + // FIXME extract color register count + inits->state = STATE_NULL; } - // FIXME break; case STATE_DA_6: if(c == 'c'){ @@ -754,7 +787,42 @@ pump_control_read(init_state* inits, unsigned char c){ } break; case STATE_SIXEL: - // FIXME + if(c == ';'){ + inits->state = STATE_SIXEL_SEMI1; + }else{ + // FIXME error? + } + break; + case STATE_SIXEL_SEMI1: + if(c == '0'){ + inits->state = STATE_SIXEL_SUCCESS; + }else{ + // FIXME error? + } + break; + case STATE_SIXEL_SUCCESS: + if(c == ';'){ + inits->state = STATE_SIXEL_WIDTH; + }else{ + // FIXME error? + } + break; + case STATE_SIXEL_WIDTH: + if(c == ';'){ + // FIXME extract width + inits->state = STATE_SIXEL_HEIGHT; + } + break; + case STATE_SIXEL_HEIGHT: + if(c == 'S'){ + // FIXME extract height + inits->state = STATE_NULL; + } + break; + case STATE_XTSMGRAPHICS_DRAIN: + if(c == 'S'){ + inits->state = STATE_NULL; + } break; default: fprintf(stderr, "Reached invalid init state %d\n", inits->state);