tgraphic charset and a few more escapes. - st - [fork] customized build of st, … | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e6b3f5c755349ba7a339dd43958870e4cceb57bf | |
parent 0981437524b64579cc656f60b0108abdcdf8a0cd | |
Author: Aurélien Aptel <[email protected]> | |
Date: Wed, 3 Feb 2010 16:18:04 +0100 | |
graphic charset and a few more escapes. | |
Diffstat: | |
M config.h | 35 +++++++++++++++++++++++++++++… | |
M st.c | 91 +++++++++++++++++++++++++----… | |
2 files changed, 110 insertions(+), 16 deletions(-) | |
--- | |
diff --git a/config.h b/config.h | |
t@@ -36,3 +36,38 @@ static Key key[] = { | |
{ XK_Up, "\033[A" }, | |
{ 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'] = '|', | |
+}; | |
diff --git a/st.c b/st.c | |
t@@ -38,11 +38,11 @@ | |
#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (… | |
/* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */ | |
-enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 }; | |
-enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload }; | |
+enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4, ATgfx=8 }; | |
+enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSsave, CSload }; | |
enum { CRset=1, CRupdate=2 }; | |
-enum { TMwrap=1, TMinsert=2, TMtitle=4 }; | |
-enum { ESCin = 1, ESCcsi = 2, ESCosc = 4, ESCtitle = 8 }; | |
+enum { TMwrap=1, TMinsert=2 }; | |
+enum { ESCin=1, ESCcsi=2, ESCosc=4, ESCtitle=8, ESCcharset=16 }; | |
enum { SCupdate, SCredraw }; | |
typedef int Color; | |
t@@ -68,7 +68,7 @@ typedef struct { | |
/* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */ | |
typedef struct { | |
char buf[ESCSIZ]; /* raw string */ | |
- int len; /* raw string length */ | |
+ int len; /* raw string length */ | |
char priv; | |
int arg[ESCARGSIZ]; | |
int narg; /* nb of args */ | |
t@@ -389,7 +389,7 @@ tmoveto(int x, int y) { | |
void | |
tcursor(int dir) { | |
int xf = term.c.x, yf = term.c.y; | |
- | |
+ | |
switch(dir) { | |
case CSup: | |
yf--; | |
t@@ -399,7 +399,7 @@ tcursor(int dir) { | |
break; | |
case CSleft: | |
xf--; | |
- if(xf < 0) { | |
+ if(term.mode & TMwrap && xf < 0) { | |
xf = term.col-1, yf--; | |
if(yf < term.top) | |
yf = term.top, xf = 0; | |
t@@ -407,7 +407,7 @@ tcursor(int dir) { | |
break; | |
case CSright: | |
xf++; | |
- if(xf >= term.col) { | |
+ if(term.mode & TMwrap && xf >= term.col) { | |
xf = 0, yf++; | |
if(yf > term.bot) | |
yf = term.bot, tscroll(); | |
t@@ -416,7 +416,7 @@ tcursor(int dir) { | |
} | |
tmoveto(xf, yf); | |
} | |
- | |
+ | |
void | |
tsetchar(char c) { | |
term.line[term.c.y][term.c.x] = term.c.attr; | |
t@@ -535,7 +535,7 @@ tsetattr(int *attr, int l) { | |
for(i = 0; i < l; i++) { | |
switch(attr[i]) { | |
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.bg = DefaultBG; | |
break; | |
t@@ -593,7 +593,10 @@ tsetscroll(int t, int b) { | |
void | |
csihandle(void) { | |
+ if(escseq.priv) | |
+ csidump(); | |
switch(escseq.mode) { | |
+ unknown: | |
default: | |
fprintf(stderr, "erresc: unknown sequence\n"); | |
csidump(); | |
t@@ -672,8 +675,16 @@ csihandle(void) { | |
tinsertblankline(escseq.arg[0]); | |
break; | |
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; | |
+ break; | |
+ } | |
+ } | |
break; | |
case 'M': /* Delete <n> lines */ | |
DEFAULT(escseq.arg[0], 1); | |
t@@ -689,15 +700,25 @@ csihandle(void) { | |
tmoveto(term.c.x, escseq.arg[0]-1); | |
break; | |
case 'h': /* Set terminal mode */ | |
- if(escseq.priv && escseq.arg[0] == 25) | |
- term.c.hidden = 0; | |
+ if(escseq.priv) | |
+ 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; | |
case 'm': /* Terminal attribute (color) */ | |
tsetattr(escseq.arg, escseq.narg); | |
break; | |
case 'r': | |
if(escseq.priv) | |
- ; | |
+ goto unknown; | |
else { | |
DEFAULT(escseq.arg[0], 1); | |
DEFAULT(escseq.arg[1], term.row); | |
t@@ -766,6 +787,17 @@ tputc(char c) { | |
} else { | |
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 { | |
switch(c) { | |
case '[': | |
t@@ -774,6 +806,23 @@ tputc(char c) { | |
case ']': | |
term.esc |= ESCosc; | |
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 … | |
} | |
} | |
} else { | |
t@@ -931,6 +980,8 @@ void | |
xdraws (char *s, Glyph base, int x, int y, int len) { | |
unsigned long xfg, xbg; | |
int winx = x*xw.cw, winy = y*xw.ch + dc.font->ascent, width = len*xw.c… | |
+ int i; | |
+ | |
if(base.mode & ATreverse) | |
xfg = dc.col[base.bg], xbg = dc.col[base.fg]; | |
else | |
t@@ -938,6 +989,13 @@ xdraws (char *s, Glyph base, int x, int y, int len) { | |
XSetBackground(xw.dis, dc.gc, xbg); | |
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); | |
if(base.mode & ATunderline) | |
t@@ -1006,7 +1064,8 @@ draw(int redraw_all) { | |
} | |
xdraws(buf, base, ox, y, i); | |
} | |
- xcursor(CSdraw); | |
+ if(!term.c.hidden) | |
+ xcursor(CSdraw); | |
} | |
void | |
t@@ -1014,7 +1073,7 @@ expose(XEvent *ev) { | |
draw(SCredraw); | |
} | |
-char * | |
+char* | |
kmap(KeySym k) { | |
int i; | |
for(i = 0; i < LEN(key); i++) |