tSupport the DECSCUSR CSI escape sequence - st - [fork] customized build of st,… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 580302f3179ef3f24cf0329755686dfa7100996b | |
parent 86d1e432a823dad7bb64808b8192014fddc8cd9f | |
Author: LemonBoy <[email protected]> | |
Date: Wed, 18 Mar 2015 21:12:47 +0100 | |
Support the DECSCUSR CSI escape sequence | |
Diffstat: | |
M st.c | 62 ++++++++++++++++++++++++-----… | |
1 file changed, 49 insertions(+), 13 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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 */ | |
t@@ -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 { | |
t@@ -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 */ | |
t@@ -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 "); | |
t@@ -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; | |
} | |
} | |
t@@ -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… | |
+ ? 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… | |
+ xw.cw, 1); | |
+ break; | |
+ case 5: /* Blinking bar */ | |
+ case 6: /* Steady bar */ | |
+ XftDrawRect(xw.draw, &dc.col[defaultcs], | |
+ borderpx + cur… | |
+ borderpx + ter… | |
+ 1, xw.ch); | |
+ break; | |
+ } | |
} else { | |
XftDrawRect(xw.draw, &dc.col[defaultcs], | |
borderpx + curx * xw.cw, | |
t@@ -3985,6 +4020,7 @@ main(int argc, char *argv[]) { | |
xw.l = xw.t = 0; | |
xw.isfixed = False; | |
+ xw.cursor = 0; | |
ARGBEGIN { | |
case 'a': |