|
@@ -97,6 +97,7 @@ enum cursor_movement {
|
|
enum cursor_state {
|
|
enum cursor_state {
|
|
CURSOR_DEFAULT = 0,
|
|
CURSOR_DEFAULT = 0,
|
|
CURSOR_WRAPNEXT = 1,
|
|
CURSOR_WRAPNEXT = 1,
|
|
|
|
+ CURSOR_ORIGIN = 2
|
|
};
|
|
};
|
|
|
|
|
|
enum glyph_state {
|
|
enum glyph_state {
|
|
@@ -300,6 +301,7 @@ static void tdeleteline(int);
|
|
static void tinsertblank(int);
|
|
static void tinsertblank(int);
|
|
static void tinsertblankline(int);
|
|
static void tinsertblankline(int);
|
|
static void tmoveto(int, int);
|
|
static void tmoveto(int, int);
|
|
|
|
+static void tmoveato(int x, int y);
|
|
static void tnew(int, int);
|
|
static void tnew(int, int);
|
|
static void tnewline(int);
|
|
static void tnewline(int);
|
|
static void tputtab(bool);
|
|
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
|
|
void
|
|
tmoveto(int x, int y) {
|
|
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(x, 0, term.col-1);
|
|
- LIMIT(y, 0, term.row-1);
|
|
|
|
|
|
+ LIMIT(y, miny, maxy);
|
|
term.c.state &= ~CURSOR_WRAPNEXT;
|
|
term.c.state &= ~CURSOR_WRAPNEXT;
|
|
term.c.x = x;
|
|
term.c.x = x;
|
|
term.c.y = y;
|
|
term.c.y = y;
|
|
@@ -1456,7 +1473,9 @@ tsetmode(bool priv, bool set, int *args, int narg) {
|
|
if(mode != term.mode)
|
|
if(mode != term.mode)
|
|
redraw();
|
|
redraw();
|
|
break;
|
|
break;
|
|
- case 6: /* XXX: DECOM -- Origin */
|
|
|
|
|
|
+ case 6: /* DECOM -- Origin */
|
|
|
|
+ MODBIT(term.c.state, set, CURSOR_ORIGIN);
|
|
|
|
+ tmoveato(0, 0);
|
|
break;
|
|
break;
|
|
case 7: /* DECAWM -- Auto wrap */
|
|
case 7: /* DECAWM -- Auto wrap */
|
|
MODBIT(term.mode, set, MODE_WRAP);
|
|
MODBIT(term.mode, set, MODE_WRAP);
|
|
@@ -1593,7 +1612,7 @@ csihandle(void) {
|
|
case 'f': /* HVP */
|
|
case 'f': /* HVP */
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
DEFAULT(csiescseq.arg[1], 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;
|
|
break;
|
|
case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
|
|
case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
@@ -1667,7 +1686,7 @@ csihandle(void) {
|
|
break;
|
|
break;
|
|
case 'd': /* VPA -- Move to <row> */
|
|
case 'd': /* VPA -- Move to <row> */
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
- tmoveto(term.c.x, csiescseq.arg[0]-1);
|
|
|
|
|
|
+ tmoveato(term.c.x, csiescseq.arg[0]-1);
|
|
break;
|
|
break;
|
|
case 'h': /* SM -- Set terminal mode */
|
|
case 'h': /* SM -- Set terminal mode */
|
|
tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg);
|
|
tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg);
|
|
@@ -1682,7 +1701,7 @@ csihandle(void) {
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
DEFAULT(csiescseq.arg[1], term.row);
|
|
DEFAULT(csiescseq.arg[1], term.row);
|
|
tsetscroll(csiescseq.arg[0]-1, csiescseq.arg[1]-1);
|
|
tsetscroll(csiescseq.arg[0]-1, csiescseq.arg[1]-1);
|
|
- tmoveto(0, 0);
|
|
|
|
|
|
+ tmoveato(0, 0);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case 's': /* DECSC -- Save cursor position (ANSI.SYS) */
|
|
case 's': /* DECSC -- Save cursor position (ANSI.SYS) */
|
|
@@ -2119,10 +2138,10 @@ tresize(int col, int row) {
|
|
/* update terminal size */
|
|
/* update terminal size */
|
|
term.col = col;
|
|
term.col = col;
|
|
term.row = row;
|
|
term.row = row;
|
|
- /* make use of the LIMIT in tmoveto */
|
|
|
|
- tmoveto(term.c.x, term.c.y);
|
|
|
|
/* reset scrolling region */
|
|
/* reset scrolling region */
|
|
tsetscroll(0, row-1);
|
|
tsetscroll(0, row-1);
|
|
|
|
+ /* make use of the LIMIT in tmoveto */
|
|
|
|
+ tmoveto(term.c.x, term.c.y);
|
|
|
|
|
|
return (slide > 0);
|
|
return (slide > 0);
|
|
}
|
|
}
|