Support the DECSCUSR CSI escape sequence

This commit is contained in:
LemonBoy 2015-03-18 21:12:47 +01:00 committed by Roberto E. Vargas Caballero
parent 86d1e432a8
commit 580302f317
1 changed files with 49 additions and 13 deletions

62
st.c
View File

@ -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':