1
0
mirror of https://github.com/rfivet/uemacs.git synced 2024-06-10 14:00:41 +00:00

Refactoring display primitives.

This commit is contained in:
Renaud 2021-08-15 11:22:32 +08:00
parent 109e330861
commit 79c3dfa4d9
2 changed files with 507 additions and 550 deletions

269
display.c
View File

@ -80,8 +80,12 @@ static int scrolls(int inserts);
static void scrscroll( int from, int to, int count) ; static void scrscroll( int from, int to, int count) ;
static int texttest( int vrow, int prow) ; static int texttest( int vrow, int prow) ;
static int endofline( unicode_t *s, int n) ; static int endofline( unicode_t *s, int n) ;
static void upddex( void) ;
static void updext( void) ; static void updext( void) ;
static void updgar( void) ;
static void updpos( void) ;
static int updateline( int row, video_p vp1, video_p vp2) ; static int updateline( int row, video_p vp1, video_p vp2) ;
static boolean updupd( boolean force_f) ;
static void modeline( window_p wp) ; static void modeline( window_p wp) ;
static void mlputi( int i, int r) ; static void mlputi( int i, int r) ;
static void mlputli( long l, int r) ; static void mlputli( long l, int r) ;
@ -227,8 +231,8 @@ static int vtputs( const char *s) {
return n ; return n ;
} }
/*
* Erase from the end of the software cursor to the end of the line on which /* Erase from the end of the software cursor to the end of the line on which
* the software cursor is located. * the software cursor is located.
*/ */
static void vteeol( void) { static void vteeol( void) {
@ -260,7 +264,7 @@ static int scrflags;
boolean force_f ; force update past type ahead? boolean force_f ; force update past type ahead?
*/ */
int update( boolean force_f) { boolean update( boolean force_f) {
#if TYPEAH && ! PKCODE #if TYPEAH && ! PKCODE
if( force_f == FALSE && typahead()) if( force_f == FALSE && typahead())
return TRUE ; return TRUE ;
@ -340,8 +344,8 @@ int update( boolean force_f) {
return TRUE ; return TRUE ;
} }
/*
* reframe: /* reframe:
* check to see if the cursor is on in the window * check to see if the cursor is on in the window
* and re-frame it if needed or wanted * and re-frame it if needed or wanted
*/ */
@ -428,8 +432,7 @@ static int reframe( window_p wp) {
return TRUE ; return TRUE ;
} }
static void show_line( line_p lp) static void show_line( line_p lp) {
{
int i = 0, len = llength( lp) ; int i = 0, len = llength( lp) ;
while( i < len) { while( i < len) {
@ -439,24 +442,18 @@ static void show_line( line_p lp)
} }
} }
/*
* updone: /* updone:
* update the current line to the virtual screen * update the current line to the virtual screen
* *
* window_p wp; window to update current line in * window_p wp; window to update current line in
*/ */
static void updone(window_p wp) static void updone( window_p wp) {
{
line_p lp; /* line to update */
int sline; /* physical screen line to update */
/* search down the line we want */ /* search down the line we want */
lp = wp->w_linep; int sline = wp->w_toprow ; /* physical screen line to update */
sline = wp->w_toprow; line_p lp ;
while (lp != wp->w_dotp) { for( lp = wp->w_linep ; lp != wp->w_dotp ; lp = lforw( lp))
++sline ; ++sline ;
lp = lforw(lp);
}
/* and update the virtual line */ /* and update the virtual line */
vscreen[ sline]->v_flag |= VFCHG ; vscreen[ sline]->v_flag |= VFCHG ;
@ -470,22 +467,17 @@ static void updone(window_p wp)
vteeol() ; vteeol() ;
} }
/*
* updall: /* updall:
* update all the lines in a window on the virtual screen * update all the lines in a window on the virtual screen
* *
* window_p wp; window to update lines in * window_p wp; window to update lines in
*/ */
static void updall(window_p wp) static void updall( window_p wp) {
{
line_p lp; /* line to update */
int sline; /* physical screen line to update */
/* search down the lines, updating them */ /* search down the lines, updating them */
lp = wp->w_linep; line_p lp = wp->w_linep ; /* line to update */
sline = wp->w_toprow; int sline = wp->w_toprow ; /* physical screen line to update */
while( sline < wp->w_toprow + wp->w_ntrows) { while( sline < wp->w_toprow + wp->w_ntrows) {
/* and update the virtual line */ /* and update the virtual line */
vscreen[ sline]->v_flag |= VFCHG ; vscreen[ sline]->v_flag |= VFCHG ;
vscreen[ sline]->v_flag &= ~VFREQ ; vscreen[ sline]->v_flag &= ~VFREQ ;
@ -504,7 +496,6 @@ static void updall(window_p wp)
vteeol() ; vteeol() ;
++sline ; ++sline ;
} }
} }
@ -512,7 +503,7 @@ static void updall(window_p wp)
update the position of the hardware cursor and handle extended lines. update the position of the hardware cursor and handle extended lines.
This is the only update for simple moves. This is the only update for simple moves.
*/ */
void updpos(void) { static void updpos( void) {
/* find the current row */ /* find the current row */
line_p lp = curwp->w_linep ; line_p lp = curwp->w_linep ;
currow = curwp->w_toprow ; currow = curwp->w_toprow ;
@ -546,26 +537,18 @@ void updpos(void) {
lbound = 0 ; lbound = 0 ;
} }
/*
* upddex: /* upddex:
* de-extend any line that deserves it * de-extend any line that deserves it
*/ */
void upddex(void) static void upddex( void) {
{ for( window_p wp = wheadp ; wp != NULL ; wp = wp->w_wndp) {
window_p wp; line_p lp = wp->w_linep ;
line_p lp; for( int i = wp->w_toprow ; i < wp->w_toprow + wp->w_ntrows ; i++) {
int i;
wp = wheadp;
while (wp != NULL) {
lp = wp->w_linep;
i = wp->w_toprow;
while (i < wp->w_toprow + wp->w_ntrows) {
if( vscreen[ i]->v_flag & VFEXT) { if( vscreen[ i]->v_flag & VFEXT) {
if ((wp != curwp) || (lp != wp->w_dotp) || if( (wp != curwp)
(curcol < term.t_ncol - 1)) { || (lp != wp->w_dotp)
|| (curcol < term.t_ncol - 1)) {
vtmove( i, 0) ; vtmove( i, 0) ;
show_line( lp) ; show_line( lp) ;
vteeol() ; vteeol() ;
@ -575,25 +558,19 @@ void upddex(void)
vscreen[ i]->v_flag |= VFCHG ; vscreen[ i]->v_flag |= VFCHG ;
} }
} }
lp = lforw( lp) ; lp = lforw( lp) ;
++i;
} }
/* and onward to the next window */
wp = wp->w_wndp;
} }
} }
/*
* updgar: /* updgar:
* if the screen is garbage, clear the physical screen and * if the screen is garbage, clear the physical screen and
* the virtual screen and force a full update * the virtual screen and force a full update
*/ */
void updgar(void) static void updgar( void) {
{ for( int i = 0 ; i < term.t_nrow ; ++i) {
unicode_t *txt;
int i, j;
for (i = 0; i < term.t_nrow; ++i) {
vscreen[ i]->v_flag |= VFCHG ; vscreen[ i]->v_flag |= VFCHG ;
#if REVSTA #if REVSTA
vscreen[ i]->v_flag &= ~VFREV ; vscreen[ i]->v_flag &= ~VFREV ;
@ -603,14 +580,14 @@ void updgar(void)
vscreen[ i]->v_bcolor = gbcolor ; vscreen[ i]->v_bcolor = gbcolor ;
#endif #endif
#if MEMMAP == 0 || SCROLLCODE #if MEMMAP == 0 || SCROLLCODE
txt = pscreen[i]->v_text; unicode_t *txt = pscreen[ i]->v_text ;
for (j = 0; j < term.t_ncol; ++j) for( int j = 0 ; j < term.t_ncol ; ++j)
txt[ j] = ' ' ; txt[ j] = ' ' ;
#endif #endif
} }
movecursor( 0, 0) ; /* Erase the screen. */ movecursor( 0, 0) ; /* Erase the screen. */
(*term.t_eeop) (); term.t_eeop() ;
sgarbf = FALSE ; /* Erase-page clears */ sgarbf = FALSE ; /* Erase-page clears */
mpresf = FALSE ; /* the message area. */ mpresf = FALSE ; /* the message area. */
#if COLOR #if COLOR
@ -618,32 +595,30 @@ void updgar(void)
#endif #endif
} }
/*
* updupd: /* updupd:
* update the physical screen from the virtual screen * update the physical screen from the virtual screen
* *
* int force; forced update flag * int force; forced update flag
*/ */
int updupd(int force) static boolean updupd( boolean force_f) {
{
video_p vp1;
int i;
#if SCROLLCODE #if SCROLLCODE
if( scrflags & WFKILLS) if( scrflags & WFKILLS)
scrolls( FALSE) ; scrolls( FALSE) ;
if( scrflags & WFINS) if( scrflags & WFINS)
scrolls( TRUE) ; scrolls( TRUE) ;
scrflags = 0 ; scrflags = 0 ;
#endif #endif
for (i = 0; i < term.t_nrow; ++i) { for( int i = 0 ; i < term.t_nrow ; ++i) {
vp1 = vscreen[i]; video_p vp1 = vscreen[ i] ;
/* for each line that needs to be updated */ /* for each line that needs to be updated */
if( (vp1->v_flag & VFCHG) != 0) { if( (vp1->v_flag & VFCHG) != 0) {
#if TYPEAH && ! PKCODE #if TYPEAH && ! PKCODE
if (force == FALSE && typahead()) if( force_f == FALSE && typahead())
return TRUE ; return TRUE ;
#endif #endif
#if MEMMAP && ! SCROLLCODE #if MEMMAP && ! SCROLLCODE
@ -653,44 +628,39 @@ int updupd(int force)
#endif #endif
} }
} }
return TRUE ; return TRUE ;
} }
#if SCROLLCODE #if SCROLLCODE
/* /* optimize out scrolls (line breaks, and newlines)
* optimize out scrolls (line breaks, and newlines)
* arg. chooses between looking for inserts or deletes * arg. chooses between looking for inserts or deletes
* returns true if it does something
*/ */
static int scrolls(int inserts) static int scrolls( int inserts) {
{ /* returns true if it does something */
video_p vpv; /* virtual screen image */
video_p vpp; /* physical screen image */
int i, j, k ; int i, j, k ;
int rows, cols; int count, target, end ;
int first, match, count, target, end; int to ;
int longmatch, longcount;
int from, to;
if( !term.t_scroll) /* no way to scroll */ if( !term.t_scroll) /* no way to scroll */
return FALSE ; return FALSE ;
rows = term.t_nrow; int rows = term.t_nrow ;
cols = term.t_ncol; int cols = term.t_ncol ;
first = -1; for( i = 0 ; i < rows ; i++) /* find first wrong line */
for (i = 0; i < rows; i++) { /* find first wrong line */ if( !texttest( i, i))
if (!texttest(i, i)) {
first = i;
break ; break ;
}
}
if (first < 0) if( i == rows) /* no text changes */
return FALSE; /* no text changes */ return FALSE ;
vpv = vscreen[first]; int first = i ;
vpp = pscreen[first];
video_p vpv = vscreen[ first] ;
video_p vpp = pscreen[ first] ;
if( inserts) { if( inserts) {
/* determine types of potential scrolls */ /* determine types of potential scrolls */
@ -706,10 +676,10 @@ static int scrolls(int inserts)
} }
/* find the matching shifted area */ /* find the matching shifted area */
match = -1; int match = -1 ;
longmatch = -1; int longmatch = -1 ;
longcount = 0; int longcount = 0 ;
from = target; int from = target ;
for( i = from + 1 ; i < rows - longcount /* P.K. */ ; i++) { for( i = from + 1 ; i < rows - longcount /* P.K. */ ; i++) {
if( inserts ? texttest( i, from) : texttest( from, i)) { if( inserts ? texttest( i, from) : texttest( from, i)) {
match = i ; match = i ;
@ -728,6 +698,7 @@ static int scrolls(int inserts)
} }
} }
} }
match = longmatch ; match = longmatch ;
count = longcount ; count = longcount ;
@ -787,31 +758,28 @@ static int scrolls(int inserts)
return FALSE ; return FALSE ;
} }
/* move the "count" lines starting at "from" to "to" */ /* move the "count" lines starting at "from" to "to" */
static void scrscroll(int from, int to, int count) static void scrscroll( int from, int to, int count) {
{
ttrow = ttcol = -1 ; ttrow = ttcol = -1 ;
(*term.t_scroll) (from, to, count); term.t_scroll( from, to, count) ;
} }
/*
* return TRUE on text match /* return TRUE on text match
* *
* int vrow, prow; virtual, physical rows * int vrow, prow; virtual, physical rows
*/ */
static int texttest(int vrow, int prow) static int texttest( int vrow, int prow) {
{
video_p vpv = vscreen[ vrow] ; /* virtual screen image */ video_p vpv = vscreen[ vrow] ; /* virtual screen image */
video_p vpp = pscreen[ prow] ; /* physical screen image */ video_p vpp = pscreen[ prow] ; /* physical screen image */
return !memcmp( vpv->v_text, vpp->v_text, 4*term.t_ncol) ; return !memcmp( vpv->v_text, vpp->v_text, 4*term.t_ncol) ;
} }
/*
* return the index of the first blank of trailing whitespace /* return the index of the first blank of trailing whitespace */
*/ static int endofline( unicode_t *s, int n) {
static int endofline(unicode_t *s, int n)
{
int i ; int i ;
for( i = n - 1 ; i >= 0 ; i--) for( i = n - 1 ; i >= 0 ; i--)
if( s[ i] != ' ') if( s[ i] != ' ')
@ -821,15 +789,14 @@ static int endofline(unicode_t *s, int n)
#endif /* SCROLLCODE */ #endif /* SCROLLCODE */
/*
* updext: /* updext:
* update the extended line which the cursor is currently * update the extended line which the cursor is currently
* on at a column greater than the terminal width. The line * on at a column greater than the terminal width. The line
* will be scrolled right or left to let the user see where * will be scrolled right or left to let the user see where
* the cursor is * the cursor is
*/ */
static void updext(void) static void updext( void) {
{
int rcursor ; /* real cursor location */ int rcursor ; /* real cursor location */
line_p lp ; /* pointer to current line */ line_p lp ; /* pointer to current line */
@ -851,16 +818,15 @@ static void updext(void)
vscreen[ currow]->v_text[ 0] = '$' ; vscreen[ currow]->v_text[ 0] = '$' ;
} }
/*
* Update a single line. This does not know how to use insert or delete /* Update a single line. This does not know how to use insert or delete
* character sequences; we are using VT52 functionality. Update the physical * character sequences; we are using VT52 functionality. Update the physical
* row and column variables. It does try an exploit erase to end of line. * row and column variables. It does try an exploit erase to end of line.
*/ */
#if MEMMAP #if MEMMAP
/* UPDATELINE specific code for the IBM-PC and other compatables */ /* UPDATELINE specific code for the IBM-PC and other compatables */
static int updateline(int row, video_p vp1, video_p vp2) static int updateline( int row, video_p vp1, video_p vp2) {
{
#if SCROLLCODE #if SCROLLCODE
unicode_t *cp1 ; unicode_t *cp1 ;
unicode_t *cp2 ; unicode_t *cp2 ;
@ -887,7 +853,6 @@ static int updateline(int row, video_p vp1, video_p vp2)
scwrite( row, vp1->v_text, 7, 0) ; scwrite( row, vp1->v_text, 7, 0) ;
#endif #endif
vp1->v_flag &= ~(VFCHG | VFCOL) ; /* flag this line as changed */ vp1->v_flag &= ~(VFCHG | VFCOL) ; /* flag this line as changed */
} }
#else #else
@ -1028,8 +993,8 @@ static int updateline(int row, video_p vp1, video_p vp2) {
} }
#endif #endif
/*
* Redisplay the mode line for the window pointed to by the "wp". This is the /* Redisplay the mode line for the window pointed to by the "wp". This is the
* only routine that has any idea of how the modeline is formatted. You can * only routine that has any idea of how the modeline is formatted. You can
* change the modeline format by hacking at this routine. Called by "update" * change the modeline format by hacking at this routine. Called by "update"
* any time there is a dirty window. * any time there is a dirty window.
@ -1155,8 +1120,7 @@ static void modeline( window_p wp) {
int ratio = 0 ; int ratio = 0 ;
if( numlines != 0) if( numlines != 0)
ratio = ratio = (100L * predlines) / numlines ;
(100L * predlines) / numlines;
if( ratio > 99) if( ratio > 99)
ratio = 99 ; ratio = 99 ;
@ -1177,8 +1141,7 @@ static void modeline( window_p wp) {
} }
} }
void upmode(void) void upmode( void) { /* update all the mode lines */
{ /* update all the mode lines */
window_p wp ; window_p wp ;
wp = wheadp ; wp = wheadp ;
@ -1188,13 +1151,12 @@ void upmode(void)
} }
} }
/*
* Send a command to the terminal to move the hardware cursor to row "row" /* Send a command to the terminal to move the hardware cursor to row "row"
* and column "col". The row and column arguments are origin 0. Optimize out * and column "col". The row and column arguments are origin 0. Optimize out
* random calls. Update "ttrow" and "ttcol". * random calls. Update "ttrow" and "ttcol".
*/ */
void movecursor(int row, int col) void movecursor( int row, int col) {
{
if( row != ttrow || col != ttcol) { if( row != ttrow || col != ttcol) {
ttrow = row ; ttrow = row ;
ttcol = col ; ttcol = col ;
@ -1202,8 +1164,8 @@ void movecursor(int row, int col)
} }
} }
/*
* Erase the message line. This is a special routine because the message line /* Erase the message line. This is a special routine because the message line
* is not considered to be part of the virtual screen. It always works * is not considered to be part of the virtual screen. It always works
* immediately; the terminal buffer is flushed via a call to the flusher. * immediately; the terminal buffer is flushed via a call to the flusher.
*/ */
@ -1236,8 +1198,8 @@ static void mlputc( unicode_t c) {
} }
} }
/*
* output a string of output characters /* output a string of output characters
* *
* char *s; string to output * char *s; string to output
*/ */
@ -1247,8 +1209,8 @@ void ostring( const char *s) {
} }
/*
* Write a message into the message line. Keep track of the physical cursor /* Write a message into the message line. Keep track of the physical cursor
* position. A small class of printf like format items is handled. Assumes the * position. A small class of printf like format items is handled. Assumes the
* stack grows down; this assumption is made by the "++" in the argument scan * stack grows down; this assumption is made by the "++" in the argument scan
* loop. Set the "message line" flag TRUE. * loop. Set the "message line" flag TRUE.
@ -1339,8 +1301,8 @@ void mlwrite( const char *fmt, ...) {
va_end( ap) ; va_end( ap) ;
} }
/*
* Write out a string. Update the physical cursor position. This assumes that /* Write out a string. Update the physical cursor position. This assumes that
* the characters in the string all have width "1"; if this is not the case * the characters in the string all have width "1"; if this is not the case
* things will get screwed up a little. * things will get screwed up a little.
*/ */
@ -1357,8 +1319,8 @@ static void mlputs( const char *s) {
} }
} }
/*
* Write out an integer, in the specified radix. Update the physical cursor /* Write out an integer, in the specified radix. Update the physical cursor
* position. * position.
*/ */
static void mlputi( int i, int r) { static void mlputi( int i, int r) {
@ -1381,9 +1343,8 @@ static void mlputi( int i, int r) {
mlputc( hexdigits[ u % r]) ; mlputc( hexdigits[ u % r]) ;
} }
/*
* do the same except as a long integer. /* do the same except as a long integer. */
*/
static void mlputli( long l, int r) { static void mlputli( long l, int r) {
long q ; long q ;
@ -1400,8 +1361,8 @@ static void mlputli( long l, int r) {
mlputc( (int) (l % r) + '0') ; mlputc( (int) (l % r) + '0') ;
} }
/*
* write out a scaled integer with two decimal places /* write out a scaled integer with two decimal places
* *
* int s; scaled integer to output * int s; scaled integer to output
*/ */
@ -1425,8 +1386,7 @@ static void mlputf( int s) {
Store number of lines into *heightp and width into *widthp. Store number of lines into *heightp and width into *widthp.
If zero or a negative number is stored, the value is not valid. */ If zero or a negative number is stored, the value is not valid. */
void getscreensize(int *widthp, int *heightp) void getscreensize( int *widthp, int *heightp) {
{
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
struct winsize size ; struct winsize size ;
*widthp = 0 ; *widthp = 0 ;
@ -1442,8 +1402,7 @@ void getscreensize(int *widthp, int *heightp)
} }
#ifdef SIGWINCH #ifdef SIGWINCH
void sizesignal(int signr) void sizesignal( int signr) {
{
int w, h ; int w, h ;
int old_errno = errno ; int old_errno = errno ;
@ -1460,17 +1419,18 @@ void sizesignal(int signr)
errno = old_errno ; errno = old_errno ;
} }
static int newscreensize(int h, int w) static int newscreensize( int h, int w) {
{
/* do the change later */ /* do the change later */
if( displaying) { if( displaying) {
chg_width = w ; chg_width = w ;
chg_height = h ; chg_height = h ;
return FALSE ; return FALSE ;
} }
chg_width = chg_height = 0 ; chg_width = chg_height = 0 ;
if( h <= term.t_mrow) if( h <= term.t_mrow)
newsize( TRUE, h) ; newsize( TRUE, h) ;
if( w <= term.t_mcol) if( w <= term.t_mcol)
newwidth( TRUE, w) ; newwidth( TRUE, w) ;
@ -1480,8 +1440,8 @@ static int newscreensize(int h, int w)
#endif #endif
/*
* output a character when echo is enabled /* output a character when echo is enabled
* *
* char c ; character to output * char c ; character to output
*/ */
@ -1492,8 +1452,8 @@ void echoc( unicode_t c) {
} }
} }
/*
* output a string of characters when display input is enabled /* output a string of characters when display input is enabled
* *
* char *s; string to output * char *s; string to output
*/ */
@ -1507,6 +1467,7 @@ void echos( const char *s) {
} }
} }
void rubout( void) { void rubout( void) {
if( disinp) { if( disinp) {
TTputc( '\b') ; TTputc( '\b') ;

View File

@ -21,11 +21,7 @@ BINDABLE( upscreen) ;
void vtinit( void) ; void vtinit( void) ;
void vtfree( void) ; void vtfree( void) ;
void vttidy( void) ; void vttidy( void) ;
int update( boolean force_f) ; boolean update( boolean force_f) ;
void updpos( void) ;
void upddex( void) ;
void updgar( void) ;
int updupd( int force) ;
void upmode( void) ; void upmode( void) ;
void movecursor( int row, int col) ; void movecursor( int row, int col) ;
void mlerase( void) ; void mlerase( void) ;