Implementing line drawing right. - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3a095984b053ebb159956368eb3258f51f50e352
 (DIR) parent c3b0e2202b908834d3c08e3eaf70e0ac282cf319
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       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(-)
       ---
 (DIR) 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)
 (DIR) 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);