]> git.armaanb.net Git - st.git/blobdiff - st.c
Merge remote-tracking branch 'origin/master'
[st.git] / st.c
diff --git a/st.c b/st.c
index 71b1521cb15d7af96f529ff14eac1206aa1c3d25..8e51344555db4ef5f2d1c3c4d4f0e07875209fa0 100644 (file)
--- a/st.c
+++ b/st.c
@@ -158,8 +158,7 @@ enum escape_state {
 
 enum window_state {
        WIN_VISIBLE = 1,
-       WIN_REDRAW  = 2,
-       WIN_FOCUSED = 4
+       WIN_FOCUSED = 2
 };
 
 enum selection_type {
@@ -2269,8 +2268,7 @@ strhandle(void) {
 
        term.esc &= ~(ESC_STR_END|ESC_STR);
        strparse();
-       narg = strescseq.narg;
-       par = atoi(strescseq.args[0]);
+       par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0;
 
        switch(strescseq.type) {
        case ']': /* OSC -- Operating System Command */
@@ -2899,82 +2897,58 @@ sixd_to_16bit(int x) {
        return x == 0 ? 0 : 0x3737 + 0x2828 * x;
 }
 
+bool
+xloadcolor(int i, const char *name, Color *ncolor) {
+       XRenderColor color = { .alpha = 0xffff };
+
+       if(!name) {
+               if(BETWEEN(i, 16, 255)) { /* 256 color */
+                       if(i < 6*6*6+16) { /* same colors as xterm */
+                               color.red   = sixd_to_16bit( ((i-16)/36)%6 );
+                               color.green = sixd_to_16bit( ((i-16)/6) %6 );
+                               color.blue  = sixd_to_16bit( ((i-16)/1) %6 );
+                       } else { /* greyscale */
+                               color.red = 0x0808 + 0x0a0a * (i - (6*6*6+16));
+                               color.green = color.blue = color.red;
+                       }
+                       return XftColorAllocValue(xw.dpy, xw.vis,
+                                                 xw.cmap, &color, ncolor);
+               } else
+                       name = colorname[i];
+       }
+       return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
+}
+
 void
 xloadcols(void) {
        int i;
-       XRenderColor color = { .alpha = 0xffff };
        static bool loaded;
        Color *cp;
 
        if(loaded) {
-               for (cp = dc.col; cp < dc.col + LEN(dc.col); ++cp)
+               for (cp = dc.col; cp < &dc.col[LEN(dc.col)]; ++cp)
                        XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
        }
 
-       /* load colors [0-15] and [256-LEN(colorname)] (config.h) */
-       for(i = 0; i < LEN(colorname); i++) {
-               if(!colorname[i])
-                       continue;
-               if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, colorname[i], &dc.col[i])) {
-                       die("Could not allocate color '%s'\n", colorname[i]);
+       for(i = 0; i < LEN(dc.col); i++)
+               if(!xloadcolor(i, NULL, &dc.col[i])) {
+                       if(colorname[i])
+                               die("Could not allocate color '%s'\n", colorname[i]);
+                       else
+                               die("Could not allocate color %d\n", i);
                }
-       }
-
-       /* load colors [16-231] ; same colors as xterm */
-       for(i = 16; i < 6*6*6+16; i++) {
-               color.red   = sixd_to_16bit( ((i-16)/36)%6 );
-               color.green = sixd_to_16bit( ((i-16)/6) %6 );
-               color.blue  = sixd_to_16bit( ((i-16)/1) %6 );
-               if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[i]))
-                       die("Could not allocate color %d\n", i);
-       }
-
-       /* load colors [232-255] ; grayscale */
-       for(; i < 256; i++) {
-               color.red = color.green = color.blue = 0x0808 + 0x0a0a * (i-(6*6*6+16));
-               if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[i]))
-                       die("Could not allocate color %d\n", i);
-       }
        loaded = true;
 }
 
 int
 xsetcolorname(int x, const char *name) {
-       XRenderColor color = { .alpha = 0xffff };
        Color ncolor;
 
-       if(!BETWEEN(x, 0, LEN(colorname)))
+       if(!BETWEEN(x, 0, LEN(dc.col)))
                return 1;
 
-       if(!name) {
-               if(BETWEEN(x, 16, 16 + 215)) { /* 256 color */
-                       color.red   = sixd_to_16bit( ((x-16)/36)%6 );
-                       color.green = sixd_to_16bit( ((x-16)/6) %6 );
-                       color.blue  = sixd_to_16bit( ((x-16)/1) %6 );
-                       if(!XftColorAllocValue(xw.dpy, xw.vis,
-                                               xw.cmap, &color, &ncolor)) {
-                               return 1;
-                       }
 
-                       XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
-                       dc.col[x] = ncolor;
-                       return 0;
-               } else if(BETWEEN(x, 16 + 216, 255)) { /* greyscale */
-                       color.red = color.green = color.blue = \
-                                   0x0808 + 0x0a0a * (x - (16 + 216));
-                       if(!XftColorAllocValue(xw.dpy, xw.vis,
-                                               xw.cmap, &color, &ncolor)) {
-                               return 1;
-                       }
-
-                       XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
-                       dc.col[x] = ncolor;
-                       return 0;
-               } else { /* system colors */
-                       name = colorname[x];
-               }
-       }
-       if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, &ncolor))
+       if(!xloadcolor(x, name, &ncolor))
                return 1;
 
        XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
@@ -3739,12 +3713,6 @@ drawregion(int x1, int y1, int x2, int y2) {
 
 void
 expose(XEvent *ev) {
-       XExposeEvent *e = &ev->xexpose;
-
-       if(xw.state & WIN_REDRAW) {
-               if(!e->count)
-                       xw.state &= ~WIN_REDRAW;
-       }
        redraw();
 }
 
@@ -3752,12 +3720,7 @@ void
 visibility(XEvent *ev) {
        XVisibilityEvent *e = &ev->xvisibility;
 
-       if(e->state == VisibilityFullyObscured) {
-               xw.state &= ~WIN_VISIBLE;
-       } else if(!(xw.state & WIN_VISIBLE)) {
-               /* need a full redraw for next Expose, not just a buf copy */
-               xw.state |= WIN_VISIBLE | WIN_REDRAW;
-       }
+       MODBIT(xw.state, e->state != VisibilityFullyObscured, WIN_VISIBLE);
 }
 
 void
@@ -4102,7 +4065,7 @@ run:
        if(argc > 0) {
                /* eat all remaining arguments */
                opt_cmd = argv;
-               if(!opt_title)
+               if(!opt_title && !opt_line)
                        opt_title = basename(xstrdup(argv[0]));
        }
        setlocale(LC_CTYPE, "");