# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 462a966ee2c0f49f432bedaf8e6ebdff995262a9
    parent 56c551e4f4b5678ba770106bf8a679c044bcf57e
    Author: Christoph Lohmann <20h@r-36.net>
    Date:   Wed,  5 Sep 2012 21:48:26 +0200

    Implement italic font support.

    Diffstat:
    MTODO | 1-
    Mconfig.def.h | 10++++++----
    Mst.c | 30++++++++++++++++++++----------
    Mst.info | 10++++++----

    4 files changed, 32 insertions(+), 19 deletions(-)
    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
    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~" },
    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]);

    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,