| tImplementing line drawing right. - st - [fork] customized build of st, the sim… | |
| git clone git://src.adamsgaard.dk/st | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 3a095984b053ebb159956368eb3258f51f50e352 | |
| parent c3b0e2202b908834d3c08e3eaf70e0ac282cf319 | |
| Author: Christoph Lohmann <[email protected]> | |
| Date: Wed, 26 Sep 2012 20:21:08 +0200 | |
| Implementing line drawing right. | |
| Diffstat: | |
| M config.def.h | 8 -------- | |
| M st.c | 52 +++++++++++++++++++++--------… | |
| 2 files changed, 36 insertions(+), 24 deletions(-) | |
| --- | |
| diff --git a/config.def.h b/config.def.h | |
| t@@ -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 | |
| t@@ -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 … | |
| + 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 - _ */ | |
| + "◆", "▒", "␉", "␌", "␍", "␊", "°", "±", … | |
| + "", "␋", "┘", "┐", "┌", "└", "┼", "⎺"… | |
| + "⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬"… | |
| + "│", "≤", "≥", "π", "≠", "£", "·", /* 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); | |
| t@@ -1177,7 +1198,7 @@ tsetattr(int *attr, int l) { | |
| switch(attr[i]) { | |
| case 0: | |
| term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | … | |
| - | ATTR_ITALIC | ATTR_BLINK | ATTR_GFX); | |
| + | ATTR_ITALIC | ATTR_BLINK); | |
| term.c.attr.fg = DefaultFG; | |
| term.c.attr.bg = DefaultBG; | |
| break; | |
| t@@ -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 ( … | |
| } | |
| t@@ -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); | |
| t@@ -2067,7 +2098,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, i… | |
| int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch + dc.font.ascent, wid… | |
| Font *font = &dc.font; | |
| XGlyphInfo extents; | |
| - int i; | |
| /* only switch default fg/bg if term is in RV mode */ | |
| if(IS_SET(MODE_REVERSE)) { | |
| t@@ -2093,16 +2123,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, … | |
| 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, &exte… | |
| width = extents.xOff; | |
| XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, w… |