graphic charset and a few more escapes.
This commit is contained in:
parent
0981437524
commit
e6b3f5c755
2 changed files with 110 additions and 16 deletions
35
config.h
35
config.h
|
@ -36,3 +36,38 @@ static Key key[] = {
|
||||||
{ XK_Up, "\033[A" },
|
{ XK_Up, "\033[A" },
|
||||||
{ XK_Down, "\033[B" },
|
{ XK_Down, "\033[B" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static char gfx[] = {
|
||||||
|
['}'] = 'f',
|
||||||
|
['.'] = 'v',
|
||||||
|
[','] = '<',
|
||||||
|
['+'] = '>',
|
||||||
|
['-'] = '^',
|
||||||
|
['h'] = '#',
|
||||||
|
['~'] = 'o',
|
||||||
|
['a'] = ':',
|
||||||
|
['f'] = '\\',
|
||||||
|
['`'] = '+',
|
||||||
|
['z'] = '>',
|
||||||
|
['{'] = '*',
|
||||||
|
['q'] = '-',
|
||||||
|
['i'] = '#',
|
||||||
|
['n'] = '+',
|
||||||
|
['y'] = '<',
|
||||||
|
['m'] = '+',
|
||||||
|
['j'] = '+',
|
||||||
|
['|'] = '!',
|
||||||
|
['g'] = '#',
|
||||||
|
['o'] = '~',
|
||||||
|
['p'] = '-',
|
||||||
|
['r'] = '-',
|
||||||
|
['s'] = '_',
|
||||||
|
['0'] = '#',
|
||||||
|
['w'] = '+',
|
||||||
|
['u'] = '+',
|
||||||
|
['t'] = '+',
|
||||||
|
['v'] = '+',
|
||||||
|
['l'] = '+',
|
||||||
|
['k'] = '+',
|
||||||
|
['x'] = '|',
|
||||||
|
};
|
||||||
|
|
87
st.c
87
st.c
|
@ -38,11 +38,11 @@
|
||||||
#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg)
|
#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg)
|
||||||
|
|
||||||
/* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */
|
/* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */
|
||||||
enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 };
|
enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4, ATgfx=8 };
|
||||||
enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload };
|
enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSsave, CSload };
|
||||||
enum { CRset=1, CRupdate=2 };
|
enum { CRset=1, CRupdate=2 };
|
||||||
enum { TMwrap=1, TMinsert=2, TMtitle=4 };
|
enum { TMwrap=1, TMinsert=2 };
|
||||||
enum { ESCin = 1, ESCcsi = 2, ESCosc = 4, ESCtitle = 8 };
|
enum { ESCin=1, ESCcsi=2, ESCosc=4, ESCtitle=8, ESCcharset=16 };
|
||||||
enum { SCupdate, SCredraw };
|
enum { SCupdate, SCredraw };
|
||||||
|
|
||||||
typedef int Color;
|
typedef int Color;
|
||||||
|
@ -68,7 +68,7 @@ typedef struct {
|
||||||
/* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */
|
/* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char buf[ESCSIZ]; /* raw string */
|
char buf[ESCSIZ]; /* raw string */
|
||||||
int len; /* raw string length */
|
int len; /* raw string length */
|
||||||
char priv;
|
char priv;
|
||||||
int arg[ESCARGSIZ];
|
int arg[ESCARGSIZ];
|
||||||
int narg; /* nb of args */
|
int narg; /* nb of args */
|
||||||
|
@ -399,7 +399,7 @@ tcursor(int dir) {
|
||||||
break;
|
break;
|
||||||
case CSleft:
|
case CSleft:
|
||||||
xf--;
|
xf--;
|
||||||
if(xf < 0) {
|
if(term.mode & TMwrap && xf < 0) {
|
||||||
xf = term.col-1, yf--;
|
xf = term.col-1, yf--;
|
||||||
if(yf < term.top)
|
if(yf < term.top)
|
||||||
yf = term.top, xf = 0;
|
yf = term.top, xf = 0;
|
||||||
|
@ -407,7 +407,7 @@ tcursor(int dir) {
|
||||||
break;
|
break;
|
||||||
case CSright:
|
case CSright:
|
||||||
xf++;
|
xf++;
|
||||||
if(xf >= term.col) {
|
if(term.mode & TMwrap && xf >= term.col) {
|
||||||
xf = 0, yf++;
|
xf = 0, yf++;
|
||||||
if(yf > term.bot)
|
if(yf > term.bot)
|
||||||
yf = term.bot, tscroll();
|
yf = term.bot, tscroll();
|
||||||
|
@ -535,7 +535,7 @@ tsetattr(int *attr, int l) {
|
||||||
for(i = 0; i < l; i++) {
|
for(i = 0; i < l; i++) {
|
||||||
switch(attr[i]) {
|
switch(attr[i]) {
|
||||||
case 0:
|
case 0:
|
||||||
memset(&term.c.attr, 0, sizeof(term.c.attr));
|
term.c.attr.mode &= ~(ATreverse | ATunderline | ATbold);
|
||||||
term.c.attr.fg = DefaultFG;
|
term.c.attr.fg = DefaultFG;
|
||||||
term.c.attr.bg = DefaultBG;
|
term.c.attr.bg = DefaultBG;
|
||||||
break;
|
break;
|
||||||
|
@ -593,7 +593,10 @@ tsetscroll(int t, int b) {
|
||||||
|
|
||||||
void
|
void
|
||||||
csihandle(void) {
|
csihandle(void) {
|
||||||
|
if(escseq.priv)
|
||||||
|
csidump();
|
||||||
switch(escseq.mode) {
|
switch(escseq.mode) {
|
||||||
|
unknown:
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "erresc: unknown sequence\n");
|
fprintf(stderr, "erresc: unknown sequence\n");
|
||||||
csidump();
|
csidump();
|
||||||
|
@ -672,8 +675,16 @@ csihandle(void) {
|
||||||
tinsertblankline(escseq.arg[0]);
|
tinsertblankline(escseq.arg[0]);
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
if(escseq.priv && escseq.arg[0] == 25)
|
if(escseq.priv) {
|
||||||
|
switch(escseq.arg[0]) {
|
||||||
|
case 7:
|
||||||
|
term.mode &= ~TMwrap;
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
term.c.hidden = 1;
|
term.c.hidden = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'M': /* Delete <n> lines */
|
case 'M': /* Delete <n> lines */
|
||||||
DEFAULT(escseq.arg[0], 1);
|
DEFAULT(escseq.arg[0], 1);
|
||||||
|
@ -689,15 +700,25 @@ csihandle(void) {
|
||||||
tmoveto(term.c.x, escseq.arg[0]-1);
|
tmoveto(term.c.x, escseq.arg[0]-1);
|
||||||
break;
|
break;
|
||||||
case 'h': /* Set terminal mode */
|
case 'h': /* Set terminal mode */
|
||||||
if(escseq.priv && escseq.arg[0] == 25)
|
if(escseq.priv)
|
||||||
term.c.hidden = 0;
|
switch(escseq.arg[0]) {
|
||||||
|
case 7:
|
||||||
|
term.mode |= TMwrap;
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
term.c.hidden = 0;
|
||||||
|
break;
|
||||||
|
case 1034:
|
||||||
|
/* XXX: Interpret "meta" key, sets eighth bit. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'm': /* Terminal attribute (color) */
|
case 'm': /* Terminal attribute (color) */
|
||||||
tsetattr(escseq.arg, escseq.narg);
|
tsetattr(escseq.arg, escseq.narg);
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
if(escseq.priv)
|
if(escseq.priv)
|
||||||
;
|
goto unknown;
|
||||||
else {
|
else {
|
||||||
DEFAULT(escseq.arg[0], 1);
|
DEFAULT(escseq.arg[0], 1);
|
||||||
DEFAULT(escseq.arg[1], term.row);
|
DEFAULT(escseq.arg[1], term.row);
|
||||||
|
@ -766,6 +787,17 @@ tputc(char c) {
|
||||||
} else {
|
} else {
|
||||||
term.title[term.titlelen++] = c;
|
term.title[term.titlelen++] = c;
|
||||||
}
|
}
|
||||||
|
} else if(term.esc & ESCcharset) {
|
||||||
|
printf("ESC ( %c\n", c);
|
||||||
|
switch(c) {
|
||||||
|
case '0': /* Line drawing crap */
|
||||||
|
term.c.attr.mode |= ATgfx;
|
||||||
|
break;
|
||||||
|
case 'B': /* Back to regular text */
|
||||||
|
term.c.attr.mode &= ~ATgfx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
term.esc = 0;
|
||||||
} else {
|
} else {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case '[':
|
case '[':
|
||||||
|
@ -774,6 +806,23 @@ tputc(char c) {
|
||||||
case ']':
|
case ']':
|
||||||
term.esc |= ESCosc;
|
term.esc |= ESCosc;
|
||||||
break;
|
break;
|
||||||
|
case '(':
|
||||||
|
term.esc |= ESCcharset;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
tmoveto(term.c.x, term.c.y-1);
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
tmoveto(term.c.x, term.c.y+1);
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
tmoveto(term.c.x+1, term.c.y);
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
tmoveto(term.c.x-1, term.c.y);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "erresc: unknown sequence ESC %02X '%c'\n", c, isprint(c)?c:'.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -931,6 +980,8 @@ void
|
||||||
xdraws (char *s, Glyph base, int x, int y, int len) {
|
xdraws (char *s, Glyph base, int x, int y, int len) {
|
||||||
unsigned long xfg, xbg;
|
unsigned long xfg, xbg;
|
||||||
int winx = x*xw.cw, winy = y*xw.ch + dc.font->ascent, width = len*xw.cw;
|
int winx = x*xw.cw, winy = y*xw.ch + dc.font->ascent, width = len*xw.cw;
|
||||||
|
int i;
|
||||||
|
|
||||||
if(base.mode & ATreverse)
|
if(base.mode & ATreverse)
|
||||||
xfg = dc.col[base.bg], xbg = dc.col[base.fg];
|
xfg = dc.col[base.bg], xbg = dc.col[base.fg];
|
||||||
else
|
else
|
||||||
|
@ -938,6 +989,13 @@ xdraws (char *s, Glyph base, int x, int y, int len) {
|
||||||
|
|
||||||
XSetBackground(xw.dis, dc.gc, xbg);
|
XSetBackground(xw.dis, dc.gc, xbg);
|
||||||
XSetForeground(xw.dis, dc.gc, xfg);
|
XSetForeground(xw.dis, dc.gc, xfg);
|
||||||
|
|
||||||
|
if(base.mode & ATgfx) {
|
||||||
|
|
||||||
|
for(i = 0; i < len; i++)
|
||||||
|
s[i] = gfx[s[i]];
|
||||||
|
}
|
||||||
|
|
||||||
XDrawImageString(xw.dis, xw.win, dc.gc, winx, winy, s, len);
|
XDrawImageString(xw.dis, xw.win, dc.gc, winx, winy, s, len);
|
||||||
|
|
||||||
if(base.mode & ATunderline)
|
if(base.mode & ATunderline)
|
||||||
|
@ -1006,7 +1064,8 @@ draw(int redraw_all) {
|
||||||
}
|
}
|
||||||
xdraws(buf, base, ox, y, i);
|
xdraws(buf, base, ox, y, i);
|
||||||
}
|
}
|
||||||
xcursor(CSdraw);
|
if(!term.c.hidden)
|
||||||
|
xcursor(CSdraw);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1014,7 +1073,7 @@ expose(XEvent *ev) {
|
||||||
draw(SCredraw);
|
draw(SCredraw);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char*
|
||||||
kmap(KeySym k) {
|
kmap(KeySym k) {
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < LEN(key); i++)
|
for(i = 0; i < LEN(key); i++)
|
||||||
|
|
Loading…
Reference in a new issue