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