Introduction
Introduction Statistics Contact Development Disclaimer Help
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++)
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.