JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Add an option to disable alternative screens.
[st.git] / st.c
diff --git a/st.c b/st.c
index 599685c..18935d4 100644 (file)
--- a/st.c
+++ b/st.c
@@ -43,7 +43,7 @@
 
 #define USAGE \
        "st " VERSION " (c) 2010-2013 st engineers\n" \
-       "usage: st [-v] [-c class] [-f font] [-g geometry] [-o file]" \
+       "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \
        " [-t title] [-w windowid] [-e command ...]\n"
 
 /* XEMBED messages */
@@ -1615,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,
@@ -1625,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;
@@ -2711,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 */
@@ -2738,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];
@@ -2873,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++;
@@ -3310,6 +3318,9 @@ main(int argc, char *argv[]) {
 
        for(i = 1; i < argc; i++) {
                switch(argv[i][0] != '-' || argv[i][2] ? -1 : argv[i][1]) {
+               case 'a':
+                       allowaltscreen = false;
+                       break;
                case 'c':
                        if(++i < argc)
                                opt_class = argv[i];