Fix point and mark update when inserting in buffer with multiple windows.

This commit is contained in:
Renaud 2022-09-04 16:08:37 +08:00
parent 041210b228
commit 5b2884b93c
1 changed files with 39 additions and 20 deletions

59
line.c
View File

@ -293,7 +293,7 @@ boolean linstr( char *instr) {
boolean linsert_byte( int n, int c) { boolean linsert_byte( int n, int c) {
char *cp1; char *cp1;
char *cp2; char *cp2;
line_p lp2, lp3 ; line_p lp2 ;
int i ; int i ;
assert( (curbp->b_mode & MDVIEW) == 0) ; assert( (curbp->b_mode & MDVIEW) == 0) ;
@ -308,16 +308,34 @@ boolean linsert_byte( int n, int c) {
if( lp2 == NULL) if( lp2 == NULL)
return FALSE ; return FALSE ;
lp3 = lp1->l_bp ; /* Previous line */ /* Insert after previous line */
lp3->l_fp = lp2 ; /* Link in */ lp1->l_bp->l_fp = lp2 ;
lp2->l_fp = lp1 ; lp2->l_fp = lp1 ;
lp2->l_bp = lp1->l_bp ;
lp1->l_bp = lp2 ; lp1->l_bp = lp2 ;
lp2->l_bp = lp3 ;
for( i = 0 ; i < n ; ++i) for( i = 0 ; i < n ; ++i)
lp2->l_text[ i] = c ; lp2->l_text[ i] = c ;
/* update point of current window */
curwp->w_dotp = lp2 ; curwp->w_dotp = lp2 ;
curwp->w_doto = n ; curwp->w_doto = n ;
/* update all windows displaying current buffer */
for( window_p wp = wheadp ; wp != NULL ; wp = wp->w_wndp)
if( wp->w_bufp == curbp) {
/* update top window line */
if( wp->w_linep == lp1)
wp->w_linep = lp2 ;
/* dot at end of buffer is now at beginning of new line */
if( wp->w_dotp == lp1)
wp->w_dotp = lp2 ;
/* mark at end of buffer is now at beginning of new line */
if( wp->w_markp == lp1)
wp->w_markp = lp2 ;
}
return TRUE ; return TRUE ;
} }
@ -460,24 +478,25 @@ boolean lnewline( void) {
lp2->l_bp = lp1->l_bp ; lp2->l_bp = lp1->l_bp ;
lp1->l_bp = lp2 ; lp1->l_bp = lp2 ;
lp2->l_bp->l_fp = lp2 ; lp2->l_bp->l_fp = lp2 ;
for( window_p wp = wheadp ; wp != NULL ; wp = wp->w_wndp) { for( window_p wp = wheadp ; wp != NULL ; wp = wp->w_wndp)
if( wp->w_linep == lp1) if( wp->w_bufp == curbp) {
wp->w_linep = lp2 ; if( wp->w_linep == lp1)
wp->w_linep = lp2 ;
if( wp->w_dotp == lp1) { if( wp->w_dotp == lp1) {
if( wp->w_doto < doto) if( wp == curwp || wp->w_doto > doto)
wp->w_dotp = lp2 ; wp->w_doto -= doto ;
else else
wp->w_doto -= doto ; wp->w_dotp = lp2 ;
} }
if (wp->w_markp == lp1) { if( wp->w_markp == lp1) {
if( wp->w_marko < doto) if( wp->w_marko > doto)
wp->w_markp = lp2 ; wp->w_marko -= doto ;
else else
wp->w_marko -= doto ; wp->w_markp = lp2 ;
} }
} }
return TRUE ; return TRUE ;
} }