@ -164,7 +164,7 @@ typedef struct {
int col ; /* nb col */
int col ; /* nb col */
Line * line ; /* screen */
Line * line ; /* screen */
Line * alt ; /* alternate screen */
Line * alt ; /* alternate screen */
bool * dirty ; /* dirtyness of lines */
bool * dirty ; /* dirtyness of lines */
TCursor c ; /* cursor */
TCursor c ; /* cursor */
int top ; /* top scroll limit */
int top ; /* top scroll limit */
int bot ; /* bottom scroll limit */
int bot ; /* bottom scroll limit */
@ -172,6 +172,7 @@ typedef struct {
int esc ; /* escape state flags */
int esc ; /* escape state flags */
char title [ ESC_TITLE_SIZ ] ;
char title [ ESC_TITLE_SIZ ] ;
int titlelen ;
int titlelen ;
bool * tabs ;
} Term ;
} Term ;
/* Purely graphic info */
/* Purely graphic info */
@ -847,12 +848,16 @@ tcursor(int mode) {
void
void
treset ( void ) {
treset ( void ) {
unsigned i ;
term . c = ( TCursor ) { {
term . c = ( TCursor ) { {
. mode = ATTR_NULL ,
. mode = ATTR_NULL ,
. fg = DefaultFG ,
. fg = DefaultFG ,
. bg = DefaultBG
. bg = DefaultBG
} , . x = 0 , . y = 0 , . state = CURSOR_DEFAULT } ;
} , . x = 0 , . y = 0 , . state = CURSOR_DEFAULT } ;
memset ( term . tabs , 0 , term . col * sizeof ( * term . tabs ) ) ;
for ( i = TAB ; i < term . col ; i + = TAB )
term . tabs [ i ] = 1 ;
term . top = 0 , term . bot = term . row - 1 ;
term . top = 0 , term . bot = term . row - 1 ;
term . mode = MODE_WRAP ;
term . mode = MODE_WRAP ;
tclearregion ( 0 , 0 , term . col - 1 , term . row - 1 ) ;
tclearregion ( 0 , 0 , term . col - 1 , term . row - 1 ) ;
@ -865,12 +870,14 @@ tnew(int col, int row) {
term . line = malloc ( term . row * sizeof ( Line ) ) ;
term . line = malloc ( term . row * sizeof ( Line ) ) ;
term . alt = malloc ( term . row * sizeof ( Line ) ) ;
term . alt = malloc ( term . row * sizeof ( Line ) ) ;
term . dirty = malloc ( term . row * sizeof ( * term . dirty ) ) ;
term . dirty = malloc ( term . row * sizeof ( * term . dirty ) ) ;
term . tabs = malloc ( term . col * sizeof ( * term . tabs ) ) ;
for ( row = 0 ; row < term . row ; row + + ) {
for ( row = 0 ; row < term . row ; row + + ) {
term . line [ row ] = malloc ( term . col * sizeof ( Glyph ) ) ;
term . line [ row ] = malloc ( term . col * sizeof ( Glyph ) ) ;
term . alt [ row ] = malloc ( term . col * sizeof ( Glyph ) ) ;
term . alt [ row ] = malloc ( term . col * sizeof ( Glyph ) ) ;
term . dirty [ row ] = 0 ;
term . dirty [ row ] = 0 ;
}
}
memset ( term . tabs , 0 , term . col * sizeof ( * term . tabs ) ) ;
/* setup screen */
/* setup screen */
treset ( ) ;
treset ( ) ;
}
}
@ -1588,6 +1595,7 @@ tresize(int col, int row) {
term . line = realloc ( term . line , row * sizeof ( Line ) ) ;
term . line = realloc ( term . line , row * sizeof ( Line ) ) ;
term . alt = realloc ( term . alt , row * sizeof ( Line ) ) ;
term . alt = realloc ( term . alt , row * sizeof ( Line ) ) ;
term . dirty = realloc ( term . dirty , row * sizeof ( * term . dirty ) ) ;
term . dirty = realloc ( term . dirty , row * sizeof ( * term . dirty ) ) ;
term . tabs = realloc ( term . tabs , col * sizeof ( * term . tabs ) ) ;
/* resize each row to new width, zero-pad if needed */
/* resize each row to new width, zero-pad if needed */
for ( i = 0 ; i < minrow ; i + + ) {
for ( i = 0 ; i < minrow ; i + + ) {
@ -1606,7 +1614,15 @@ tresize(int col, int row) {
term . line [ i ] = calloc ( col , sizeof ( Glyph ) ) ;
term . line [ i ] = calloc ( col , sizeof ( Glyph ) ) ;
term . alt [ i ] = calloc ( col , sizeof ( Glyph ) ) ;
term . alt [ i ] = calloc ( col , sizeof ( Glyph ) ) ;
}
}
if ( col > term . col ) {
bool * bp = term . tabs + term . col ;
memset ( bp , 0 , sizeof ( * term . tabs ) * ( col - term . col ) ) ;
while ( - - bp > term . tabs & & ! * bp )
/* nothing */ ;
for ( bp + = TAB ; bp < term . tabs + col ; bp + = TAB )
* bp = 1 ;
}
/* update terminal size */
/* update terminal size */
term . col = col , term . row = row ;
term . col = col , term . row = row ;
/* make use of the LIMIT in tmoveto */
/* make use of the LIMIT in tmoveto */