st

Personal fork of ST from suckless.org; st is a simple terminal implementation for X.
git clone git://git.swab.dev/st.git
Log | Files | Refs | README | LICENSE

commit 3a095984b053ebb159956368eb3258f51f50e352
parent c3b0e2202b908834d3c08e3eaf70e0ac282cf319
Author: Christoph Lohmann <20h@r-36.net>
Date:   Wed, 26 Sep 2012 20:21:08 +0200

Implementing line drawing right.

Diffstat:
Mconfig.def.h | 8--------
Mst.c | 52++++++++++++++++++++++++++++++++++++----------------
2 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -79,14 +79,6 @@ static Key key[] = { /* Set TERM to this */ #define TNAME "st-256color" -/* Line drawing characters (sometime specific to each font...) */ -static char gfx[] = { - ['f'] = 'o', - ['g'] = '+', - ['i'] = '#', - [255] = 0, -}; - /* double-click timeout (in milliseconds) between clicks for selection */ #define DOUBLECLICK_TIMEOUT 300 #define TRIPLECLICK_TIMEOUT (2*DOUBLECLICK_TIMEOUT) diff --git a/st.c b/st.c @@ -1094,6 +1094,27 @@ tmoveto(int x, int y) { void tsetchar(char *c) { + /* + * The table is proudly stolen from rxvt. + */ + if(term.c.attr.mode & ATTR_GFX) { + char *vt100_0[62] = { /* 0x41 - 0x7e */ + "↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */ + 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ + 0, 0, 0, 0, 0, 0, 0, 0, /* P - W */ + 0, 0, 0, 0, 0, 0, 0, " ", /* X - _ */ + "◆", "▒", "␉", "␌", "␍", "␊", "°", "±", /* ` - g */ + "␤", "␋", "┘", "┐", "┌", "└", "┼", "⎺", /* h - o */ + "⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */ + "│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */ + }; + + if(c[0] >= 0x41 && c[0] <= 0x7e + && vt100_0[c[0] - 0x41]) { + c = vt100_0[c[0] - 0x41]; + } + } + term.dirty[term.c.y] = 1; term.line[term.c.y][term.c.x] = term.c.attr; memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); @@ -1177,7 +1198,7 @@ tsetattr(int *attr, int l) { switch(attr[i]) { case 0: term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | ATTR_BOLD \ - | ATTR_ITALIC | ATTR_BLINK | ATTR_GFX); + | ATTR_ITALIC | ATTR_BLINK); term.c.attr.fg = DefaultFG; term.c.attr.bg = DefaultBG; break; @@ -1676,12 +1697,18 @@ tputc(char *c, int len) { strhandle(); } else if(term.esc & ESC_ALTCHARSET) { switch(ascii) { - case '0': /* Line drawing crap */ + case '0': /* Line drawing set */ term.c.attr.mode |= ATTR_GFX; break; - case 'B': /* Back to regular text */ + case 'B': /* USASCII */ term.c.attr.mode &= ~ATTR_GFX; break; + case 'A': /* UK (IGNORED) */ + case '<': /* multinational charset (IGNORED) */ + case '5': /* Finnish (IGNORED) */ + case 'C': /* Finnish (IGNORED) */ + case 'K': /* German (IGNORED) */ + break; default: fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); } @@ -1700,10 +1727,14 @@ tputc(char *c, int len) { strescseq.type = ascii; term.esc |= ESC_STR; break; - case ')': - case '(': + case '(': /* set primary charset G0 */ term.esc |= ESC_ALTCHARSET; break; + case ')': /* set secondary charset G1 (IGNORED) */ + case '*': /* set tertiary charset G2 (IGNORED) */ + case '+': /* set quaternary charset G3 (IGNORED) */ + term.esc = 0; + break; case 'D': /* IND -- Linefeed */ if(term.c.y == term.bot) tscrollup(term.top, 1); @@ -2067,7 +2098,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch + dc.font.ascent, width = charlen*xw.cw; Font *font = &dc.font; XGlyphInfo extents; - int i; /* only switch default fg/bg if term is in RV mode */ if(IS_SET(MODE_REVERSE)) { @@ -2093,16 +2123,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { XSetBackground(xw.dpy, dc.gc, dc.col[bg]); XSetForeground(xw.dpy, dc.gc, dc.col[fg]); - if(base.mode & ATTR_GFX) { - for(i = 0; i < bytelen; i++) { - char c = gfx[(uint)s[i] % 256]; - if(c) - s[i] = c; - else if(s[i] > 0x5f) - s[i] -= 0x5f; - } - } - XftTextExtentsUtf8(xw.dpy, font->xft_set, (FcChar8 *)s, bytelen, &extents); width = extents.xOff; XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch);