JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Move unsupported sequences to ignored.
[st.git] / st.c
diff --git a/st.c b/st.c
index 4a77d71..8059b16 100644 (file)
--- a/st.c
+++ b/st.c
@@ -97,6 +97,7 @@ enum cursor_movement {
 enum cursor_state {
        CURSOR_DEFAULT  = 0,
        CURSOR_WRAPNEXT = 1,
+       CURSOR_ORIGIN   = 2
 };
 
 enum glyph_state {
@@ -300,6 +301,7 @@ static void tdeleteline(int);
 static void tinsertblank(int);
 static void tinsertblankline(int);
 static void tmoveto(int, int);
+static void tmoveato(int x, int y);
 static void tnew(int, int);
 static void tnewline(int);
 static void tputtab(bool);
@@ -1211,10 +1213,25 @@ csiparse(void) {
        }
 }
 
+/* for absolute user moves, when decom is set */
+void
+tmoveato(int x, int y) {
+       tmoveto(x, y + ((term.c.state & CURSOR_ORIGIN) ? term.top: 0));
+}
+
 void
 tmoveto(int x, int y) {
+       int miny, maxy;
+
+       if(term.c.state & CURSOR_ORIGIN) {
+               miny = term.top;
+               maxy = term.bot;
+       } else {
+               miny = 0;
+               maxy = term.row - 1;
+       }
        LIMIT(x, 0, term.col-1);
-       LIMIT(y, 0, term.row-1);
+       LIMIT(y, miny, maxy);
        term.c.state &= ~CURSOR_WRAPNEXT;
        term.c.x = x;
        term.c.y = y;
@@ -1456,14 +1473,21 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                if(mode != term.mode)
                                        redraw();
                                break;
-                       case 6: /* XXX: DECOM -- Origin */
+                       case 6: /* DECOM -- Origin */
+                               MODBIT(term.c.state, set, CURSOR_ORIGIN);
+                               tmoveato(0, 0);
                                break;
                        case 7: /* DECAWM -- Auto wrap */
                                MODBIT(term.mode, set, MODE_WRAP);
                                break;
-                       case 8: /* XXX: DECARM -- Auto repeat */
-                               break;
                        case 0:  /* Error (IGNORED) */
+                       case 2:  /* DECANM -- ANSI/VT52 (IGNORED) */
+                       case 3:  /* DECCOLM -- Column  (IGNORED) */
+                       case 4:  /* DECSCLM -- Scroll (IGNORED) */
+                       case 8:  /* DECARM -- Auto repeat (IGNORED) */
+                       case 18: /* DECPFF -- Printer feed (IGNORED) */
+                       case 19: /* DECPEX -- Printer extent (IGNORED) */
+                       case 42: /* DECNRCM -- National characters (IGNORED) */
                        case 12: /* att610 -- Start blinking cursor (IGNORED) */
                                break;
                        case 25: /* DECTCEM -- Text Cursor Enable Mode */
@@ -1491,12 +1515,6 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
                                break;
                        default:
-                       /* case 2:  DECANM -- ANSI/VT52 (NOT SUPPOURTED) */
-                       /* case 3:  DECCOLM -- Column  (NOT SUPPORTED) */
-                       /* case 4:  DECSCLM -- Scroll (NOT SUPPORTED) */
-                       /* case 18: DECPFF -- Printer feed (NOT SUPPORTED) */
-                       /* case 19: DECPEX -- Printer extent (NOT SUPPORTED) */
-                       /* case 42: DECNRCM -- National characters (NOT SUPPORTED) */
                                fprintf(stderr,
                                        "erresc: unknown private set/reset mode %d\n",
                                        *args);
@@ -1543,11 +1561,11 @@ csihandle(void) {
                tinsertblank(csiescseq.arg[0]);
                break;
        case 'A': /* CUU -- Cursor <n> Up */
-       case 'e':
                DEFAULT(csiescseq.arg[0], 1);
                tmoveto(term.c.x, term.c.y-csiescseq.arg[0]);
                break;
        case 'B': /* CUD -- Cursor <n> Down */
+       case 'e': /* VPR --Cursor <n> Down */
                DEFAULT(csiescseq.arg[0], 1);
                tmoveto(term.c.x, term.c.y+csiescseq.arg[0]);
                break;
@@ -1556,7 +1574,7 @@ csihandle(void) {
                        ttywrite(VT102ID, sizeof(VT102ID) - 1);
                break;
        case 'C': /* CUF -- Cursor <n> Forward */
-       case 'a':
+       case 'a': /* HPR -- Cursor <n> Forward */
                DEFAULT(csiescseq.arg[0], 1);
                tmoveto(term.c.x+csiescseq.arg[0], term.c.y);
                break;
@@ -1593,7 +1611,7 @@ csihandle(void) {
        case 'f': /* HVP */
                DEFAULT(csiescseq.arg[0], 1);
                DEFAULT(csiescseq.arg[1], 1);
-               tmoveto(csiescseq.arg[1]-1, csiescseq.arg[0]-1);
+               tmoveato(csiescseq.arg[1]-1, csiescseq.arg[0]-1);
                break;
        case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
                DEFAULT(csiescseq.arg[0], 1);
@@ -1667,7 +1685,7 @@ csihandle(void) {
                break;
        case 'd': /* VPA -- Move to <row> */
                DEFAULT(csiescseq.arg[0], 1);
-               tmoveto(term.c.x, csiescseq.arg[0]-1);
+               tmoveato(term.c.x, csiescseq.arg[0]-1);
                break;
        case 'h': /* SM -- Set terminal mode */
                tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg);
@@ -1682,7 +1700,7 @@ csihandle(void) {
                        DEFAULT(csiescseq.arg[0], 1);
                        DEFAULT(csiescseq.arg[1], term.row);
                        tsetscroll(csiescseq.arg[0]-1, csiescseq.arg[1]-1);
-                       tmoveto(0, 0);
+                       tmoveato(0, 0);
                }
                break;
        case 's': /* DECSC -- Save cursor position (ANSI.SYS) */
@@ -2119,10 +2137,10 @@ tresize(int col, int row) {
        /* update terminal size */
        term.col = col;
        term.row = row;
-       /* make use of the LIMIT in tmoveto */
-       tmoveto(term.c.x, term.c.y);
        /* reset scrolling region */
        tsetscroll(0, row-1);
+       /* make use of the LIMIT in tmoveto */
+       tmoveto(term.c.x, term.c.y);
 
        return (slide > 0);
 }