JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
End a sequence only on CAN, SUB, \a and C1s.
[st.git] / st.c
diff --git a/st.c b/st.c
index 5198749..fd872c1 100644 (file)
--- a/st.c
+++ b/st.c
@@ -94,12 +94,11 @@ enum glyph_attribute {
        ATTR_REVERSE   = 1,
        ATTR_UNDERLINE = 2,
        ATTR_BOLD      = 4,
-       ATTR_GFX       = 8,
-       ATTR_ITALIC    = 16,
-       ATTR_BLINK     = 32,
-       ATTR_WRAP      = 64,
-       ATTR_WIDE      = 128,
-       ATTR_WDUMMY    = 256,
+       ATTR_ITALIC    = 8,
+       ATTR_BLINK     = 16,
+       ATTR_WRAP      = 32,
+       ATTR_WIDE      = 64,
+       ATTR_WDUMMY    = 128,
 };
 
 enum cursor_movement {
@@ -393,10 +392,9 @@ static void tsetdirtattr(int);
 static void tsetmode(bool, bool, int *, int);
 static void tfulldirt(void);
 static void techo(char *, int);
-static bool tcontrolcode(uchar );
+static void tcontrolcode(uchar );
 static void tdectest(char );
 static int32_t tdefcolor(int *, int *, int);
-static void tselcs(void);
 static void tdeftran(char);
 static inline bool match(uint, uint);
 static void ttynew(void);
@@ -1535,7 +1533,7 @@ tsetchar(char *c, Glyph *attr, int x, int y) {
        /*
         * The table is proudly stolen from rxvt.
         */
-       if(attr->mode & ATTR_GFX) {
+       if(term.trantbl[term.charset] == CS_GRAPHIC0) {
                if(BETWEEN(c[0], 0x41, 0x7e) && vt100_0[c[0] - 0x41]) {
                        c = vt100_0[c[0] - 0x41];
                }
@@ -1839,7 +1837,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                if (!allowaltscreen)
                                        break;
                                tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
-                               /* FALLTHRU */
+                               /* FALLTHROUGH */
                        case 47: /* swap screen */
                        case 1047:
                                if (!allowaltscreen)
@@ -1853,7 +1851,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                        tswapscreen();
                                if(*args != 1049)
                                        break;
-                               /* FALLTRU */
+                               /* FALLTHROUGH */
                        case 1048:
                                tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
                                break;
@@ -2148,7 +2146,7 @@ strhandle(void) {
                        if(narg < 3)
                                break;
                        p = strescseq.args[2];
-                       /* fall through */
+                       /* FALLTHROUGH */
                case 104: /* color reset, here p = NULL */
                        j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
                        if (!xsetcolorname(j, p)) {
@@ -2317,9 +2315,7 @@ void
 tdeftran(char ascii) {
        char c, (*bp)[2];
        static char tbl[][2] = {
-               {'0', CS_GRAPHIC0}, {'1', CS_GRAPHIC1}, {'A', CS_UK},
-               {'B', CS_USA},      {'<', CS_MULTI},    {'K', CS_GER},
-               {'5', CS_FIN},      {'C', CS_FIN},
+               {'0', CS_GRAPHIC0}, {'B', CS_USA},
                {0, 0}
        };
 
@@ -2333,32 +2329,25 @@ tdeftran(char ascii) {
 }
 
 void
-tselcs(void) {
-       MODBIT(term.c.attr.mode,
-              term.trantbl[term.charset] == CS_GRAPHIC0,
-              ATTR_GFX);
-}
-
-bool
 tcontrolcode(uchar ascii) {
        static char question[UTF_SIZ] = "?";
 
        switch(ascii) {
        case '\t':   /* HT */
                tputtab(1);
-               break;
+               return;
        case '\b':   /* BS */
                tmoveto(term.c.x-1, term.c.y);
-               break;
+               return;
        case '\r':   /* CR */
                tmoveto(0, term.c.y);
-               break;
+               return;
        case '\f':   /* LF */
        case '\v':   /* VT */
        case '\n':   /* LF */
                /* go to first col if the mode is set */
                tnewline(IS_SET(MODE_CRLF));
-               break;
+               return;
        case '\a':   /* BEL */
                if(term.esc & ESC_STR_END) {
                        /* backwards compatibility to xterm */
@@ -2374,15 +2363,13 @@ tcontrolcode(uchar ascii) {
                csireset();
                term.esc &= ~(ESC_CSI|ESC_ALTCHARSET|ESC_TEST);
                term.esc |= ESC_START;
-               return 1;
+               return;
        case '\016': /* SO */
                term.charset = 0;
-               tselcs();
-               break;
+               return;
        case '\017': /* SI */
                term.charset = 1;
-               tselcs();
-               break;
+               return;
        case '\032': /* SUB */
                tsetchar(question, &term.c.attr, term.c.x, term.c.y);
        case '\030': /* CAN */
@@ -2393,6 +2380,7 @@ tcontrolcode(uchar ascii) {
        case '\021': /* XON (IGNORED) */
        case '\023': /* XOFF (IGNORED) */
        case 0177:   /* DEL (IGNORED) */
+               return;
        case 0x84:   /* TODO: IND */
        case 0x85:   /* TODO: NEL */
        case 0x88:   /* TODO: HTS */
@@ -2408,11 +2396,10 @@ tcontrolcode(uchar ascii) {
        case 0x9e:   /* TODO: PM */
        case 0x9f:   /* TODO: APC */
                break;
-       default:
-               return 0;
        }
+       /* only CAN, SUB, \a and C1 chars interrupt a sequence */
        term.esc &= ~(ESC_STR_END|ESC_STR);
-       return 1;
+       return;
 }
 
 void
@@ -2461,7 +2448,7 @@ tputc(char *c, int len) {
                   (ascii == '\a' || ascii == 030 ||
                    ascii == 032  || ascii == 033 ||
                    ISCONTROLC1(unicodep))) {
-                       term.esc &= ~ESC_STR;
+                       term.esc &= ~(ESC_START|ESC_STR);
                        term.esc |= ESC_STR_END;
                } else if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
                        memmove(&strescseq.buf[strescseq.len], c, len);
@@ -2491,8 +2478,11 @@ tputc(char *c, int len) {
         * they must not cause conflicts with sequences.
         */
        if(control) {
-               if (tcontrolcode(ascii))
-                       return;
+               tcontrolcode(ascii);
+               /*
+                * control codes are not shown ever
+                */
+               return;
        } else if(term.esc & ESC_START) {
                if(term.esc & ESC_CSI) {
                        csiescseq.buf[csiescseq.len++] = ascii;
@@ -2506,7 +2496,6 @@ tputc(char *c, int len) {
                        return;
                } else if(term.esc & ESC_ALTCHARSET) {
                        tdeftran(ascii);
-                       tselcs();
                } else if(term.esc & ESC_TEST) {
                        tdectest(ascii);
                } else {
@@ -2590,11 +2579,6 @@ tputc(char *c, int len) {
                 */
                return;
        }
-       /*
-        * Display control codes only if we are in graphic mode
-        */
-       if(control && !(term.c.attr.mode & ATTR_GFX))
-               return;
        if(sel.ob.x != -1 && BETWEEN(term.c.y, sel.ob.y, sel.oe.y))
                selclear(NULL);
 
@@ -2634,6 +2618,7 @@ tresize(int col, int row) {
        int slide = term.c.y - row + 1;
        bool *bp;
        Line *orig;
+       TCursor c;
 
        if(col < 1 || row < 1)
                return 0;
@@ -2695,6 +2680,7 @@ tresize(int col, int row) {
        tmoveto(term.c.x, term.c.y);
        /* Clearing both screens */
        orig = term.line;
+       c = term.c;
        do {
                if(mincol < col && 0 < minrow) {
                        tclearregion(mincol, 0, col - 1, minrow - 1);
@@ -2702,10 +2688,10 @@ tresize(int col, int row) {
                if(0 < col && minrow < row) {
                        tclearregion(0, minrow, col - 1, row - 1);
                }
-               tcursor(CURSOR_SAVE);
                tswapscreen();
                tcursor(CURSOR_LOAD);
        } while(orig != term.line);
+       term.c = c;
 
        return (slide > 0);
 }