all repos — st @ 5260a9ea2249b9159c188a6e27a39a38d131e411

st (suckless terminal) config

Add DECOM sequence

DECOM sequence allows to the user defines a new home position. The home
position is used as base for all the movement commands except HVP and
VPA. It is important notice than DECSLM moves cursor to absolute position
0,0.
---
 st.c |   33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)
Roberto E. Vargas Caballero k0ga@shike2.com
commit

5260a9ea2249b9159c188a6e27a39a38d131e411

parent

ee3e0a9fd032bb35eea5c46fc0a9efcd6a80579a

1 files changed, 26 insertions(+), 7 deletions(-)

jump to
M st.cst.c

@@ -97,6 +97,7 @@

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 @@ }

} } +/* 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,7 +1473,9 @@ MODBIT(term.mode, set, MODE_REVERSE);

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);

@@ -1593,7 +1612,7 @@ case 'H': /* CUP -- Move to <row> <col> */

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 +1686,7 @@ tputtab(0);

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 +1701,7 @@ } else {

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 +2138,10 @@ }

/* update terminal size */ term.col = col; term.row = row; + /* reset scrolling region */ + tsetscroll(0, row-1); /* make use of the LIMIT in tmoveto */ tmoveto(term.c.x, term.c.y); - /* reset scrolling region */ - tsetscroll(0, row-1); return (slide > 0); }