]> git.armaanb.net Git - st.git/blobdiff - st.c
Do not mark as invalid UTF8 control codes
[st.git] / st.c
diff --git a/st.c b/st.c
index 4f958d866835caa42c1f84a61f4cb746423b3cff..35a840b66ef906c50e718ecd2176c98d3dfa8964 100644 (file)
--- a/st.c
+++ b/st.c
@@ -560,7 +560,8 @@ static int frclen = 0;
 ssize_t
 xwrite(int fd, const char *s, size_t len)
 {
-       size_t aux = len, r;
+       size_t aux = len;
+       ssize_t r;
 
        while (len > 0) {
                r = write(fd, s, len);
@@ -569,6 +570,7 @@ xwrite(int fd, const char *s, size_t len)
                len -= r;
                s += r;
        }
+
        return aux;
 }
 
@@ -622,6 +624,7 @@ utf8decode(char *c, Rune *u, size_t clen)
                return 0;
        *u = udecoded;
        utf8validate(u, len);
+
        return len;
 }
 
@@ -631,6 +634,7 @@ utf8decodebyte(char c, size_t *i)
        for (*i = 0; *i < LEN(utfmask); ++(*i))
                if (((uchar)c & utfmask[*i]) == utfbyte[*i])
                        return (uchar)c & ~utfmask[*i];
+
        return 0;
 }
 
@@ -642,11 +646,13 @@ utf8encode(Rune u, char *c)
        len = utf8validate(&u, 0);
        if (len > UTF_SIZ)
                return 0;
+
        for (i = len - 1; i != 0; --i) {
                c[i] = utf8encodebyte(u, 0);
                u >>= 6;
        }
        c[0] = utf8encodebyte(u, len);
+
        return len;
 }
 
@@ -669,6 +675,7 @@ utf8strchr(char *s, Rune u)
                if (r == u)
                        return &(s[i]);
        }
+
        return NULL;
 }
 
@@ -679,6 +686,7 @@ utf8validate(Rune *u, size_t i)
                *u = UTF_INVALID;
        for (i = 1; *u > utfmax[i]; ++i)
                ;
+
        return i;
 }
 
@@ -1322,9 +1330,8 @@ execsh(void)
                        die("who are you?\n");
        }
 
-       if (!(sh = getenv("SHELL"))) {
+       if ((sh = getenv("SHELL")) == NULL)
                sh = (pw->pw_shell[0]) ? pw->pw_shell : shell;
-       }
 
        if (opt_cmd)
                prog = opt_cmd[0];
@@ -2888,15 +2895,15 @@ tputc(Rune u)
        int width, len;
        Glyph *gp;
 
+       control = ISCONTROL(u);
        len = utf8encode(u, c);
-       if ((width = wcwidth(u)) == -1) {
+       if (!control && (width = wcwidth(u)) == -1) {
                memcpy(c, "\357\277\275", 4); /* UTF_INVALID */
                width = 1;
        }
 
        if (IS_SET(MODE_PRINT))
                tprinter(c, len);
-       control = ISCONTROL(u);
 
        /*
         * STR sequence must be checked before anything else
@@ -3127,6 +3134,7 @@ xloadcolor(int i, const char *name, Color *ncolor)
                } else
                        name = colorname[i];
        }
+
        return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
 }
 
@@ -3166,6 +3174,7 @@ xsetcolorname(int x, const char *name)
 
        XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
        dc.col[x] = ncolor;
+
        return 0;
 }
 
@@ -3235,6 +3244,7 @@ xgeommasktogravity(int mask)
        case YNegative:
                return SouthWestGravity;
        }
+
        return SouthEastGravity;
 }
 
@@ -3401,6 +3411,7 @@ xinit(void)
        Cursor cursor;
        Window parent;
        pid_t thispid = getpid();
+       XColor xmousefg, xmousebg;
 
        if (!(xw.dpy = XOpenDisplay(NULL)))
                die("Can't open display\n");
@@ -3473,11 +3484,22 @@ xinit(void)
                die("XCreateIC failed. Could not obtain input method.\n");
 
        /* white cursor, black outline */
-       cursor = XCreateFontCursor(xw.dpy, XC_xterm);
+       cursor = XCreateFontCursor(xw.dpy, mouseshape);
        XDefineCursor(xw.dpy, xw.win, cursor);
-       XRecolorCursor(xw.dpy, cursor,
-               &(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},
-               &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
+
+       if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) {
+               xmousefg.red   = 0xffff;
+               xmousefg.green = 0xffff;
+               xmousefg.blue  = 0xffff;
+       }
+
+       if (XParseColor(xw.dpy, xw.cmap, colorname[mousebg], &xmousebg) == 0) {
+               xmousebg.red   = 0x0000;
+               xmousebg.green = 0x0000;
+               xmousebg.blue  = 0x0000;
+       }
+
+       XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg);
 
        xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
        xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
@@ -4150,9 +4172,9 @@ run(void)
        do {
                XNextEvent(xw.dpy, &ev);
                /*
-                * XFilterEvent is required to be called after you using XOpenIM,
-                * this is not unnecessary.It does not only filter the key event,
-                * but some clientmessage for input method as well.
+                * This XFilterEvent call is required because of XOpenIM. It
+                * does filter out the key event and some client message for
+                * the input method too.
                 */
                if (XFilterEvent(&ev, None))
                        continue;
@@ -4249,9 +4271,11 @@ usage(void)
 {
        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 ...] [command ...]\n"
+       "          [-i] [-t title] [-T title] [-w windowid] [-e command ...]"
+       " [command ...]\n"
        "       st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]\n"
-       "          [-i] [-t title] [-w windowid] [-l line] [stty_args ...]\n",
+       "          [-i] [-t title] [-T title] [-w windowid] [-l line]"
+       " [stty_args ...]\n",
        argv0);
 }
 
@@ -4292,6 +4316,7 @@ main(int argc, char *argv[])
                opt_line = EARGF(usage());
                break;
        case 't':
+       case 'T':
                opt_title = EARGF(usage());
                break;
        case 'w':