JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Adopting arg.h with more flexible cmd handling.
[st.git] / st.c
diff --git a/st.c b/st.c
index 0923cec..c938ff4 100644 (file)
--- a/st.c
+++ b/st.c
 #include <X11/Xft/Xft.h>
 #include <fontconfig/fontconfig.h>
 
+#include "arg.h"
+
+char *argv0;
+
 #define Glyph Glyph_
 #define Font Font_
 #define Draw XftDraw *
  #include <libutil.h>
 #endif
 
-#define USAGE \
-       "st " VERSION " (c) 2010-2013 st engineers\n" \
-       "usage: st [-v] [-c class] [-f font] [-g geometry] [-o file]" \
-       " [-t title] [-w windowid] [-e command ...]\n"
 
 /* XEMBED messages */
 #define XEMBED_FOCUS_IN  4
@@ -649,23 +649,18 @@ selected(int x, int y) {
        if(sel.ey == y && sel.by == y) {
                bx = MIN(sel.bx, sel.ex);
                ex = MAX(sel.bx, sel.ex);
+
                return BETWEEN(x, bx, ex);
        }
 
-       return ((sel.b.y < y && y < sel.e.y)
-                       || (y == sel.e.y && x <= sel.e.x))
-                       || (y == sel.b.y && x >= sel.b.x
-                               && (x <= sel.e.x || sel.b.y != sel.e.y));
-       switch(sel.type) {
-       case SEL_REGULAR:
-               return ((sel.b.y < y && y < sel.e.y)
-                       || (y == sel.e.y && x <= sel.e.x))
-                       || (y == sel.b.y && x >= sel.b.x
-                               && (x <= sel.e.x || sel.b.y != sel.e.y));
-       case SEL_RECTANGULAR:
+       if(sel.type == SEL_RECTANGULAR) {
                return ((sel.b.y <= y && y <= sel.e.y)
                        && (sel.b.x <= x && x <= sel.e.x));
-       };
+       }
+       return ((sel.b.y < y && y < sel.e.y)
+               || (y == sel.e.y && x <= sel.e.x))
+               || (y == sel.b.y && x >= sel.b.x
+                       && (x <= sel.e.x || sel.b.y != sel.e.y));
 }
 
 void
@@ -1257,8 +1252,12 @@ selscroll(int orig, int n) {
                        sel.bx = -1;
                        return;
                }
-               switch(sel.type) {
-               case SEL_REGULAR:
+               if(sel.type == SEL_RECTANGULAR) {
+                       if(sel.by < term.top)
+                               sel.by = term.top;
+                       if(sel.ey > term.bot)
+                               sel.ey = term.bot;
+               } else {
                        if(sel.by < term.top) {
                                sel.by = term.top;
                                sel.bx = 0;
@@ -1267,14 +1266,7 @@ selscroll(int orig, int n) {
                                sel.ey = term.bot;
                                sel.ex = term.col;
                        }
-                       break;
-               case SEL_RECTANGULAR:
-                       if(sel.by < term.top)
-                               sel.by = term.top;
-                       if(sel.ey > term.bot)
-                               sel.ey = term.bot;
-                       break;
-               };
+               }
                sel.b.y = sel.by, sel.b.x = sel.bx;
                sel.e.y = sel.ey, sel.e.x = sel.ex;
        }
@@ -1623,7 +1615,10 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                break;
                        case 1049: /* = 1047 and 1048 */
                        case 47:
-                       case 1047: {
+                       case 1047:
+                               if (!allowaltscreen)
+                                       break;
+
                                alt = IS_SET(MODE_ALTSCREEN);
                                if(alt) {
                                        tclearregion(0, 0, term.col-1,
@@ -1633,8 +1628,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                        tswapscreen();
                                if(*args != 1049)
                                        break;
-                       }
-                               /* pass through */
+                               /* FALLTRU */
                        case 1048:
                                tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
                                break;
@@ -2719,12 +2713,28 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
        FcPattern *fcpattern, *fontpattern;
        FcFontSet *fcsets[] = { NULL };
        FcCharSet *fccharset;
-       Colour *fg = &dc.col[base.fg], *bg = &dc.col[base.bg],
-                *temp, revfg, revbg;
+       Colour *fg, *bg, *temp, revfg, revbg;
        XRenderColor colfg, colbg;
 
        frcflags = FRC_NORMAL;
 
+       if(base.mode & ATTR_ITALIC) {
+               if(base.fg == defaultfg)
+                       base.fg = defaultitalic;
+               font = &dc.ifont;
+               frcflags = FRC_ITALIC;
+       } else if((base.mode & ATTR_ITALIC) && (base.mode & ATTR_BOLD)) {
+               if(base.fg == defaultfg)
+                       base.fg = defaultitalic;
+               font = &dc.ibfont;
+               frcflags = FRC_ITALICBOLD;
+       } else if(base.mode & ATTR_UNDERLINE) {
+               if(base.fg == defaultfg)
+                       base.fg = defaultunderline;
+       }
+       fg = &dc.col[base.fg];
+       bg = &dc.col[base.bg];
+
        if(base.mode & ATTR_BOLD) {
                if(BETWEEN(base.fg, 0, 7)) {
                        /* basic system colors */
@@ -2746,15 +2756,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                frcflags = FRC_BOLD;
        }
 
-       if(base.mode & ATTR_ITALIC) {
-               font = &dc.ifont;
-               frcflags = FRC_ITALIC;
-       }
-       if((base.mode & ATTR_ITALIC) && (base.mode & ATTR_BOLD)) {
-               font = &dc.ibfont;
-               frcflags = FRC_ITALICBOLD;
-       }
-
        if(IS_SET(MODE_REVERSE)) {
                if(fg == &dc.col[defaultfg]) {
                        fg = &dc.col[defaultbg];
@@ -2881,8 +2882,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                                        FcTrue, fcpattern, &fcres);
 
                        /*
-                        * Overwrite or create the new cache entry
-                        * entry.
+                        * Overwrite or create the new cache entry.
                         */
                        frccur++;
                        frclen++;
@@ -3308,67 +3308,66 @@ run(void) {
        }
 }
 
+void
+usage(void) {
+       die("%s " VERSION " (c) 2010-2013 st engineers\n" \
+       "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \
+       " [-t title] [-w windowid] [-e command ...]\n", argv0);
+}
+
 int
 main(int argc, char *argv[]) {
-       int i, bitm, xr, yr;
+       int bitm, xr, yr;
        uint wr, hr;
 
        xw.fw = xw.fh = xw.fx = xw.fy = 0;
        xw.isfixed = False;
 
-       for(i = 1; i < argc; i++) {
-               switch(argv[i][0] != '-' || argv[i][2] ? -1 : argv[i][1]) {
-               case 'c':
-                       if(++i < argc)
-                               opt_class = argv[i];
-                       break;
-               case 'e':
-                       /* eat all remaining arguments */
-                       if(++i < argc)
-                               opt_cmd = &argv[i];
-                       goto run;
-               case 'f':
-                       if(++i < argc)
-                               opt_font = argv[i];
-                       break;
-               case 'g':
-                       if(++i >= argc)
-                               break;
-
-                       bitm = XParseGeometry(argv[i], &xr, &yr, &wr, &hr);
-                       if(bitm & XValue)
-                               xw.fx = xr;
-                       if(bitm & YValue)
-                               xw.fy = yr;
-                       if(bitm & WidthValue)
-                               xw.fw = (int)wr;
-                       if(bitm & HeightValue)
-                               xw.fh = (int)hr;
-                       if(bitm & XNegative && xw.fx == 0)
-                               xw.fx = -1;
-                       if(bitm & XNegative && xw.fy == 0)
-                               xw.fy = -1;
-
-                       if(xw.fh != 0 && xw.fw != 0)
-                               xw.isfixed = True;
-                       break;
-               case 'o':
-                       if(++i < argc)
-                               opt_io = argv[i];
-                       break;
-               case 't':
-                       if(++i < argc)
-                               opt_title = argv[i];
-                       break;
-               case 'v':
-               default:
-                       die(USAGE);
-               case 'w':
-                       if(++i < argc)
-                               opt_embed = argv[i];
-                       break;
-               }
-       }
+       ARGBEGIN {
+       case 'a':
+               allowaltscreen = false;
+               break;
+       case 'c':
+               opt_class = EARGF(usage());
+               break;
+       case 'e':
+               /* eat all remaining arguments */
+               opt_cmd = &argv[1];
+               goto run;
+       case 'f':
+               opt_font = EARGF(usage());
+               break;
+       case 'g':
+               bitm = XParseGeometry(EARGF(usage()), &xr, &yr, &wr, &hr);
+               if(bitm & XValue)
+                       xw.fx = xr;
+               if(bitm & YValue)
+                       xw.fy = yr;
+               if(bitm & WidthValue)
+                       xw.fw = (int)wr;
+               if(bitm & HeightValue)
+                       xw.fh = (int)hr;
+               if(bitm & XNegative && xw.fx == 0)
+                       xw.fx = -1;
+               if(bitm & XNegative && xw.fy == 0)
+                       xw.fy = -1;
+
+               if(xw.fh != 0 && xw.fw != 0)
+                       xw.isfixed = True;
+               break;
+       case 'o':
+               opt_io = EARGF(usage());
+               break;
+       case 't':
+               opt_title = EARGF(usage());
+               break;
+       case 'w':
+               opt_embed = EARGF(usage());
+               break;
+       case 'v':
+       default:
+               usage();
+       } ARGEND;
 
 run:
        setlocale(LC_CTYPE, "");