@ -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,7 +1473,9 @@ 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 ) ;
@ -1593,7 +1612,7 @@ csihandle(void) {
case ' f ' : /* HVP */
DEFAULT ( csiescseq . arg [ 0 ] , 1 ) ;
DEFAULT ( csiescseq . arg [ 1 ] , 1 ) ;
tmove to( csiescseq . arg [ 1 ] - 1 , csiescseq . arg [ 0 ] - 1 ) ;
tmove a to( 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 @@ csihandle(void) {
break ;
case ' d ' : /* VPA -- Move to <row> */
DEFAULT ( csiescseq . arg [ 0 ] , 1 ) ;
tmove to( term . c . x , csiescseq . arg [ 0 ] - 1 ) ;
tmove a to( 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 @@ csihandle(void) {
DEFAULT ( csiescseq . arg [ 0 ] , 1 ) ;
DEFAULT ( csiescseq . arg [ 1 ] , term . row ) ;
tsetscroll ( csiescseq . arg [ 0 ] - 1 , csiescseq . arg [ 1 ] - 1 ) ;
tmove to( 0 , 0 ) ;
tmove a to( 0 , 0 ) ;
}
break ;
case ' s ' : /* DECSC -- Save cursor position (ANSI.SYS) */
@ -2119,10 +2138,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 ) ;
}