JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
FAQ: fix wording
[st.git] / st.c
diff --git a/st.c b/st.c
index 6a68c3c..a494c7d 100644 (file)
--- a/st.c
+++ b/st.c
@@ -63,8 +63,6 @@ char *argv0;
 #define XK_NO_MOD     0
 #define XK_SWITCH_MOD (1<<13)
 
-#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
-
 /* macros */
 #define MIN(a, b)  ((a) < (b) ? (a) : (b))
 #define MAX(a, b)  ((a) < (b) ? (b) : (a))
@@ -349,7 +347,7 @@ typedef struct {
 
 static void die(const char *, ...);
 static void draw(void);
-static void redraw(int);
+static void redraw(void);
 static void drawregion(int, int, int, int);
 static void execsh(void);
 static void sigchld(int);
@@ -524,6 +522,7 @@ enum {
 typedef struct {
        XftFont *font;
        int flags;
+       long unicodep;
 } Fontcache;
 
 /* Fontcache is an array now. A new font will be appended to the array. */
@@ -1826,7 +1825,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                mode = term.mode;
                                MODBIT(term.mode, set, MODE_REVERSE);
                                if(mode != term.mode)
-                                       redraw(REDRAW_TIMEOUT);
+                                       redraw();
                                break;
                        case 6: /* DECOM -- Origin */
                                MODBIT(term.c.state, set, CURSOR_ORIGIN);
@@ -2200,7 +2199,7 @@ strhandle(void) {
                                 * TODO if defaultbg color is changed, borders
                                 * are dirty
                                 */
-                               redraw(0);
+                               redraw();
                        }
                        return;
                }
@@ -2676,8 +2675,8 @@ tputc(char *c, int len) {
                gp = &term.line[term.c.y][term.c.x];
        }
 
-       if(IS_SET(MODE_INSERT) && term.c.x+1 < term.col)
-               memmove(gp+1, gp, (term.col - term.c.x - 1) * sizeof(Glyph));
+       if(IS_SET(MODE_INSERT) && term.c.x+width < term.col)
+               memmove(gp+width, gp, (term.col - term.c.x - width) * sizeof(Glyph));
 
        if(term.c.x+width > term.col) {
                tnewline(1);
@@ -2992,7 +2991,7 @@ xloadfonts(char *fontstr, double fontsize) {
        if(!pattern)
                die("st: can't open font %s\n", fontstr);
 
-       if(fontsize > 0) {
+       if(fontsize > 1) {
                FcPatternDel(pattern, FC_PIXEL_SIZE);
                FcPatternDel(pattern, FC_SIZE);
                FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)fontsize);
@@ -3093,7 +3092,7 @@ xzoomabs(const Arg *arg) {
        xunloadfonts();
        xloadfonts(usedfont, arg->i);
        cresize(0, 0);
-       redraw(0);
+       redraw();
        xhints();
 }
 
@@ -3210,7 +3209,7 @@ void
 xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
        int winx = borderpx + x * xw.cw, winy = borderpx + y * xw.ch,
            width = charlen * xw.cw, xp, i;
-       int frcflags;
+       int frcflags, charexists;
        int u8fl, u8fblen, u8cblen, doesexist;
        char *u8c, *u8fs;
        long unicodep;
@@ -3393,8 +3392,13 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
 
                /* Search the font cache. */
                for(i = 0; i < frclen; i++) {
-                       if(XftCharExists(xw.dpy, frc[i].font, unicodep)
-                                       && frc[i].flags == frcflags) {
+                       charexists = XftCharExists(xw.dpy, frc[i].font, unicodep);
+                       /* Everything correct. */
+                       if(charexists && frc[i].flags == frcflags)
+                               break;
+                       /* We got a default font for a not found glyph. */
+                       if(!charexists && frc[i].flags == frcflags \
+                                       && frc[i].unicodep == unicodep) {
                                break;
                        }
                }
@@ -3425,8 +3429,8 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                                        FcMatchPattern);
                        FcDefaultSubstitute(fcpattern);
 
-                       fontpattern = FcFontSetMatch(0, fcsets,
-                                       FcTrue, fcpattern, &fcres);
+                       fontpattern = FcFontSetMatch(0, fcsets, 1,
+                                       fcpattern, &fcres);
 
                        /*
                         * Overwrite or create the new cache entry.
@@ -3434,11 +3438,13 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                        if(frclen >= LEN(frc)) {
                                frclen = LEN(frc) - 1;
                                XftFontClose(xw.dpy, frc[frclen].font);
+                               frc[frclen].unicodep = 0;
                        }
 
                        frc[frclen].font = XftFontOpenPattern(xw.dpy,
                                        fontpattern);
                        frc[frclen].flags = frcflags;
+                       frc[frclen].unicodep = unicodep;
 
                        i = frclen;
                        frclen++;
@@ -3558,16 +3564,9 @@ xresettitle(void) {
 }
 
 void
-redraw(int timeout) {
-       struct timespec tv = {0, timeout * 1000};
-
+redraw(void) {
        tfulldirt();
        draw();
-
-       if(timeout > 0) {
-               nanosleep(&tv, NULL);
-               XSync(xw.dpy, False); /* necessary for a good tput flash */
-       }
 }
 
 void
@@ -3634,7 +3633,7 @@ expose(XEvent *ev) {
                if(!e->count)
                        xw.state &= ~WIN_REDRAW;
        }
-       redraw(0);
+       redraw();
 }
 
 void
@@ -3938,7 +3937,7 @@ run(void) {
 
 void
 usage(void) {
-       die("%s " VERSION " (c) 2010-2014 st engineers\n" \
+       die("%s " VERSION " (c) 2010-2015 st engineers\n" \
        "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]\n"
        "          [-i] [-t title] [-w windowid] [-e command ...]\n", argv0);
 }