Support the DECSCUSR CSI escape sequence
1 files changed, 49 insertions(+), 13 deletions(-) M st.c
M st.c => st.c +49 -13
@@ 197,14 197,14 @@ typedef struct { } TCursor; /* CSI Escape sequence structs */ /* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */ /* ESC '[' [[ [<priv>] <arg> [;]] <mode> [<mode>]] */ typedef struct { char buf[ESC_BUF_SIZ]; /* raw string */ int len; /* raw string length */ char priv; int arg[ESC_ARG_SIZ]; int narg; /* nb of args */ char mode; char mode[2]; } CSIEscape; @@ /* STR Escape sequence structs */ 257,6 257,7 @@ typedef struct { int ch; /* char height */ int cw; /* char width */ char state; /* focus, redraw, visible */ int cursor; /* cursor style */ } XWindow; @@ typedef struct { 1545,7 1546,8 @@ csiparse(void) { break; p++; } csiescseq.mode = *p; csiescseq.mode[0] = *p++; csiescseq.mode[1] = (p < csiescseq.buf+csiescseq.len) ? *p : '\0'; } @@ /* for absolute user moves, when decom is set */ 1983,7 1985,7 @@ csihandle(void) { char buf[40]; int len; switch(csiescseq.mode) { switch(csiescseq.mode[0]) { default: unknown: @@ fprintf(stderr, "erresc: unknown csi "); 2171,6 2173,19 @@ csihandle(void) { case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ tcursor(CURSOR_LOAD); break; case ' ': switch (csiescseq.mode[1]) { case 'q': /* DECSCUSR -- Set Cursor Style */ DEFAULT(csiescseq.arg[0], 1); if (!BETWEEN(csiescseq.arg[0], 0, 6)) { goto unknown; } xw.cursor = csiescseq.arg[0]; break; default: goto unknown; } break; } } @@ 3551,16 3566,36 @@ xdrawcursor(void) { /* draw the new one */ if(xw.state & WIN_FOCUSED) { if(IS_SET(MODE_REVERSE)) { g.mode |= ATTR_REVERSE; g.fg = defaultcs; g.bg = defaultfg; } switch (xw.cursor) { case 0: /* Blinking Block */ case 1: /* Blinking Block (Default) */ case 2: /* Steady Block */ if(IS_SET(MODE_REVERSE)) { g.mode |= ATTR_REVERSE; g.fg = defaultcs; g.bg = defaultfg; } sl = utf8len(g.c); width = (term.line[term.c.y][curx].mode & ATTR_WIDE)\ ? 2 : 1; xdraws(g.c, g, term.c.x, term.c.y, width, sl); sl = utf8len(g.c); width = (term.line[term.c.y][curx].mode & ATTR_WIDE)\ ? 2 : 1; xdraws(g.c, g, term.c.x, term.c.y, width, sl); break; case 3: /* Blinking Underline */ case 4: /* Steady Underline */ XftDrawRect(xw.draw, &dc.col[defaultcs], borderpx + curx * xw.cw, borderpx + (term.c.y + 1) * xw.ch - 1, xw.cw, 1); break; case 5: /* Blinking bar */ case 6: /* Steady bar */ XftDrawRect(xw.draw, &dc.col[defaultcs], borderpx + curx * xw.cw, borderpx + term.c.y * xw.ch, 1, xw.ch); break; } } else { XftDrawRect(xw.draw, &dc.col[defaultcs], @@ borderpx + curx * xw.cw, 3985,6 4020,7 @@ main(int argc, char *argv[]) { xw.l = xw.t = 0; xw.isfixed = False; xw.cursor = 0; ARGBEGIN { case 'a':