[hackers] [st] graphic charset and a few more escapes. || Aur?lien Aptel

From: <hg_AT_suckless.org>
Date: Wed, 3 Feb 2010 15:18:53 +0000 (UTC)

changeset: 70:7b6eefe6e9ff
tag: tip
user: Aur?lien Aptel <aurelien.aptel_AT_gmail.com>
date: Wed Feb 03 16:18:04 2010 +0100
files: config.h st.c
description:
graphic charset and a few more escapes.

diff -r 7cf662856633 -r 7b6eefe6e9ff config.h
--- a/config.h Wed Feb 03 03:25:35 2010 +0100
+++ b/config.h Wed Feb 03 16:18:04 2010 +0100
@@ -36,3 +36,38 @@
         { 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 -r 7cf662856633 -r 7b6eefe6e9ff st.c
--- a/st.c Wed Feb 03 03:25:35 2010 +0100
+++ b/st.c Wed Feb 03 16:18:04 2010 +0100
@@ -38,11 +38,11 @@
 #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 */
-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;
@@ -68,7 +68,7 @@
 /* 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 */
@@ -389,7 +389,7 @@
 void
 tcursor(int dir) {
         int xf = term.c.x, yf = term.c.y;
-
+
         switch(dir) {
         case CSup:
                 yf--;
@@ -399,7 +399,7 @@
                 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;
@@ -407,7 +407,7 @@
                 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();
@@ -416,7 +416,7 @@
         }
         tmoveto(xf, yf);
 }
-
+
 void
 tsetchar(char c) {
         term.line[term.c.y][term.c.x] = term.c.attr;
@@ -535,7 +535,7 @@
         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;
@@ -593,7 +593,10 @@
 
 void
 csihandle(void) {
+ if(escseq.priv)
+ csidump();
         switch(escseq.mode) {
+ unknown:
         default:
                 fprintf(stderr, "erresc: unknown sequence\n");
                 csidump();
@@ -672,8 +675,16 @@
                 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);
@@ -689,15 +700,25 @@
                 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);
@@ -766,6 +787,17 @@
                         } 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 '[':
@@ -774,6 +806,23 @@
                         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 %02X '%c'\n", c, isprint(c)?c:'.');
                         }
                 }
         } else {
@@ -931,6 +980,8 @@
 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.cw;
+ int i;
+
         if(base.mode & ATreverse)
                 xfg = dc.col[base.bg], xbg = dc.col[base.fg];
         else
@@ -938,6 +989,13 @@
 
         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)
@@ -1006,7 +1064,8 @@
                 }
                 xdraws(buf, base, ox, y, i);
         }
- xcursor(CSdraw);
+ if(!term.c.hidden)
+ xcursor(CSdraw);
 }
 
 void
@@ -1014,7 +1073,7 @@
         draw(SCredraw);
 }
 
-char *
+char*
 kmap(KeySym k) {
         int i;
         for(i = 0; i < LEN(key); i++)
Received on Wed Feb 03 2010 - 15:18:53 UTC

This archive was generated by hypermail 2.2.0 : Wed Feb 03 2010 - 15:24:28 UTC