Implement italic font support. - 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 462a966ee2c0f49f432bedaf8e6ebdff995262a9
 (DIR) parent 56c551e4f4b5678ba770106bf8a679c044bcf57e
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Wed,  5 Sep 2012 21:48:26 +0200
       
       Implement italic font support.
       
       Diffstat:
         M TODO                                |       1 -
         M config.def.h                        |      10 ++++++----
         M st.c                                |      30 ++++++++++++++++++++----------
         M st.info                             |      10 ++++++----
       
       4 files changed, 32 insertions(+), 19 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       @@ -4,7 +4,6 @@ vt emulation
        * implement BCE right
        * color definition in CSI
                * implement CSI parsing
       -* implement real italic
        * make the keypad keys really work
                * kf0 .. kf44
                * kend, kel, kent, kfnd, ked, kext
 (DIR) diff --git a/config.def.h b/config.def.h
       @@ -1,6 +1,8 @@
        
        #define FONT "-*-*-medium-r-*-*-*-120-75-75-*-60-*-*"
        #define BOLDFONT "-*-*-bold-r-*-*-*-120-75-75-*-60-*-*"
       +/* If italic is not availbel, fall back to bold. */
       +#define ITALICFONT "-*-*-medium-o-*-*-*-120-75-75-*-60-*-*," BOLDFONT
        
        /* Space in pixels around the terminal buffer */
        #define BORDER 2
       @@ -29,9 +31,9 @@ static const char *colorname[] = {
                "magenta",
                "cyan",
                "white",
       -        
       +
                [255] = 0,
       -        
       +
                /* more colors can be added after 255 to use with DefaultXX */
                "#cccccc",
                "#333333",
       @@ -50,11 +52,11 @@ static const char *colorname[] = {
           Mask value:
           * Use XK_ANY_MOD to match the key no matter modifiers state
           * Use XK_NO_MOD to match the key alone (no modifiers)
       -   
       +
              key,        mask,  output */
        static Key key[] = {
                { XK_BackSpace, XK_NO_MOD, "\177" },
       -           { XK_Insert,    XK_NO_MOD, "\033[2~" },
       +        { XK_Insert,    XK_NO_MOD, "\033[2~" },
                { XK_Delete,    XK_NO_MOD, "\033[3~" },
                { XK_Home,      XK_NO_MOD, "\033[1~" },
                { XK_End,       XK_NO_MOD, "\033[4~" },
 (DIR) diff --git a/st.c b/st.c
       @@ -76,6 +76,7 @@ enum glyph_attribute {
                ATTR_UNDERLINE = 2,
                ATTR_BOLD      = 4,
                ATTR_GFX       = 8,
       +        ATTR_ITALIC    = 16,
        };
        
        enum cursor_movement {
       @@ -238,7 +239,7 @@ typedef struct {
                        short lbearing;
                        short rbearing;
                        XFontSet set;
       -        } font, bfont;
       +        } font, bfont, ifont;
        } DC;
        
        static void die(const char*, ...);
       @@ -1122,8 +1123,8 @@ tsetattr(int *attr, int l) {
                        case 1:
                                term.c.attr.mode |= ATTR_BOLD;
                                break;
       -                case 3: /* enter standout (highlight) mode TODO: make it italic */
       -                        term.c.attr.mode |= ATTR_REVERSE;
       +                case 3: /* enter standout (highlight) */
       +                        term.c.attr.mode |= ATTR_ITALIC;
                                break;
                        case 4:
                                term.c.attr.mode |= ATTR_UNDERLINE;
       @@ -1134,8 +1135,8 @@ tsetattr(int *attr, int l) {
                        case 22:
                                term.c.attr.mode &= ~ATTR_BOLD;
                                break;
       -                case 23: /* leave standout (highlight) mode TODO: make it italic */
       -                        term.c.attr.mode &= ~ATTR_REVERSE;
       +                case 23: /* leave standout (highlight) mode */
       +                        term.c.attr.mode &= ~ATTR_ITALIC;
                                break;
                        case 24:
                                term.c.attr.mode &= ~ATTR_UNDERLINE;
       @@ -1886,14 +1887,20 @@ xgetfontinfo(XFontSet set, int *ascent, int *descent, short *lbearing, short *rb
        }
        
        void
       -initfonts(char *fontstr, char *bfontstr) {
       -        if((dc.font.set = xinitfont(fontstr)) == NULL ||
       -           (dc.bfont.set = xinitfont(bfontstr)) == NULL)
       -                die("Can't load font %s\n", dc.font.set ? BOLDFONT : FONT);
       +initfonts(char *fontstr, char *bfontstr, char *ifontstr) {
       +        if((dc.font.set = xinitfont(fontstr)) == NULL)
       +                die("Can't load font %s\n", fontstr);
       +        if((dc.bfont.set = xinitfont(bfontstr)) == NULL)
       +                die("Can't load bfont %s\n", bfontstr);
       +        if((dc.ifont.set = xinitfont(ifontstr)) == NULL)
       +                die("Can't load ifont %s\n", ifontstr);
       +
                xgetfontinfo(dc.font.set, &dc.font.ascent, &dc.font.descent,
                    &dc.font.lbearing, &dc.font.rbearing);
                xgetfontinfo(dc.bfont.set, &dc.bfont.ascent, &dc.bfont.descent,
                    &dc.bfont.lbearing, &dc.bfont.rbearing);
       +        xgetfontinfo(dc.ifont.set, &dc.ifont.ascent, &dc.ifont.descent,
       +            &dc.ifont.lbearing, &dc.ifont.rbearing);
        }
        
        void
       @@ -1927,7 +1934,7 @@ xinit(void) {
                }
        
                /* font */
       -        initfonts(FONT, BOLDFONT);
       +        initfonts(FONT, BOLDFONT, ITALICFONT);
        
                /* XXX: Assuming same size for bold font */
                xw.cw = dc.font.rbearing - dc.font.lbearing;
       @@ -2002,6 +2009,9 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                        fontset = dc.bfont.set;
                }
        
       +        if(base.mode & ATTR_ITALIC)
       +                fontset = dc.ifont.set;
       +
                XSetBackground(xw.dpy, dc.gc, dc.col[bg]);
                XSetForeground(xw.dpy, dc.gc, dc.col[fg]);
        
 (DIR) diff --git a/st.info b/st.info
       @@ -83,15 +83,16 @@ st| simpleterm,
                op=\E[39;49m,
                pairs#64,
                rc=\E8,
       -        rs1=\Ec,
       -        rs2=\E[4l\E>,
                rev=\E[7m,
                ri=\EM,
       +        ritm=\E[23m,
                rmacs=\E(B,
                rmcup=\E[?1049l,
       -        rmkx=\E>,
       +#        rmkx=\E>,
                rmso=\E[23m,
                rmul=\E[m,
       +        rs1=\Ec,
       +        rs2=\E[4l\E>,
                sc=\E7,
                setab=\E[4%p1%dm,
                setaf=\E[3%p1%dm,
       @@ -99,9 +100,10 @@ st| simpleterm,
                setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
                sgr0=\E[0m,
                sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
       +        sitm=\E[3m,
                smacs=\E(0,
                smcup=\E[?1049h,
       -        smkx=\E=,
       +#        smkx=\E=,
                smso=\E[3m,
                smul=\E[4m,
                tbc=\E[3g,