@ -703,6 +703,9 @@ selected(int x, int y) {
void
void
selsnap ( int mode , int * x , int * y , int direction ) {
selsnap ( int mode , int * x , int * y , int direction ) {
int newx , newy , xt , yt ;
Glyph * gp ;
switch ( mode ) {
switch ( mode ) {
case SNAP_WORD :
case SNAP_WORD :
/*
/*
@ -710,36 +713,31 @@ selsnap(int mode, int *x, int *y, int direction) {
* beginning of a line .
* beginning of a line .
*/
*/
for ( ; ; ) {
for ( ; ; ) {
if ( direction < 0 & & * x < = 0 ) {
newx = * x + direction ;
if ( * y > 0 & & term . line [ * y - 1 ] [ term . col - 1 ] . mode
newy = * y ;
& ATTR_WRAP ) {
if ( ! BETWEEN ( newx , 0 , term . col - 1 ) ) {
* y - = 1 ;
newy + = direction ;
* x = term . col - 1 ;
newx = ( newx + term . col ) % term . col ;
} else {
if ( ! BETWEEN ( newy , 0 , term . row - 1 ) )
break ;
break ;
}
}
if ( direction > 0 )
if ( direction > 0 & & * x > = term . col - 1 ) {
yt = * y , xt = * x ;
if ( * y < term . row - 1 & & term . line [ * y ] [ * x ] . mode
else
& ATTR_WRAP ) {
yt = newy , xt = newx ;
* y + = 1 ;
if ( ! ( term . line [ yt ] [ xt ] . mode & ATTR_WRAP ) )
* x = 0 ;
} else {
break ;
break ;
}
}
}
if ( term . line [ * y ] [ * x + direction ] . mode & ATTR_WDUMMY ) {
if ( newx > = tlinelen ( newy ) )
* x + = direction ;
break ;
continue ;
}
if ( * x > = tlinelen ( * y ) | | strchr ( worddelimiters ,
gp = & term . line [ newy ] [ newx ] ;
term . line [ * y ] [ * x + direction ] . c [ 0 ] ) ) {
if ( ! ( gp - > mode & ATTR_WDUMMY ) & & strchr ( worddelimiters , gp - > c [ 0 ] ) )
break ;
break ;
}
* x + = direction ;
* x = newx ;
* y = newy ;
}
}
break ;
break ;
case SNAP_LINE :
case SNAP_LINE :