@ -441,7 +441,7 @@ static void selclear(XEvent *);
static void selrequest ( XEvent * ) ;
static void selrequest ( XEvent * ) ;
static void selinit ( void ) ;
static void selinit ( void ) ;
static void sel sort ( void ) ;
static void sel normalize ( void ) ;
static inline bool selected ( int , int ) ;
static inline bool selected ( int , int ) ;
static char * getsel ( void ) ;
static char * getsel ( void ) ;
static void selcopy ( void ) ;
static void selcopy ( void ) ;
@ -657,8 +657,19 @@ y2row(int y) {
return LIMIT ( y , 0 , term . row - 1 ) ;
return LIMIT ( y , 0 , term . row - 1 ) ;
}
}
static int tlinelen ( int y ) {
int i = term . col ;
while ( i > 0 & & term . line [ y ] [ i - 1 ] . c [ 0 ] = = ' ' )
- - i ;
return i ;
}
static void
static void
selsort ( void ) {
selnormalize ( void ) {
int i ;
if ( sel . ob . y = = sel . oe . y ) {
if ( sel . ob . y = = sel . oe . y ) {
sel . nb . x = MIN ( sel . ob . x , sel . oe . x ) ;
sel . nb . x = MIN ( sel . ob . x , sel . oe . x ) ;
sel . ne . x = MAX ( sel . ob . x , sel . oe . x ) ;
sel . ne . x = MAX ( sel . ob . x , sel . oe . x ) ;
@ -668,6 +679,15 @@ selsort(void) {
}
}
sel . nb . y = MIN ( sel . ob . y , sel . oe . y ) ;
sel . nb . y = MIN ( sel . ob . y , sel . oe . y ) ;
sel . ne . y = MAX ( sel . ob . y , sel . oe . y ) ;
sel . ne . y = MAX ( sel . ob . y , sel . oe . y ) ;
/* expand selection over line breaks */
if ( sel . type = = SEL_RECTANGULAR )
return ;
i = tlinelen ( sel . nb . y ) ;
if ( i < sel . nb . x )
sel . nb . x = i ;
if ( tlinelen ( sel . ne . y ) < = sel . ne . x )
sel . ne . x = term . col - 1 ;
}
}
static inline bool
static inline bool
@ -683,8 +703,6 @@ 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 i ;
switch ( mode ) {
switch ( mode ) {
case SNAP_WORD :
case SNAP_WORD :
/*
/*
@ -716,7 +734,7 @@ selsnap(int mode, int *x, int *y, int direction) {
continue ;
continue ;
}
}
if ( strchr ( worddelimiters ,
if ( * x > = tlinelen ( * y ) | | strchr ( worddelimiters ,
term . line [ * y ] [ * x + direction ] . c [ 0 ] ) ) {
term . line [ * y ] [ * x + direction ] . c [ 0 ] ) ) {
break ;
break ;
}
}
@ -747,18 +765,6 @@ selsnap(int mode, int *x, int *y, int direction) {
}
}
}
}
break ;
break ;
default :
/*
* Select the whole line when the end of line is reached .
*/
if ( direction > 0 ) {
i = term . col ;
while ( - - i > 0 & & term . line [ * y ] [ i ] . c [ 0 ] = = ' ' )
/* nothing */ ;
if ( i > 0 & & i < * x )
* x = term . col - 1 ;
}
break ;
}
}
}
}
@ -780,7 +786,7 @@ getbuttoninfo(XEvent *e) {
selsnap ( sel . snap , & sel . oe . x , & sel . oe . y , - 1 ) ;
selsnap ( sel . snap , & sel . oe . x , & sel . oe . y , - 1 ) ;
selsnap ( sel . snap , & sel . ob . x , & sel . ob . y , + 1 ) ;
selsnap ( sel . snap , & sel . ob . x , & sel . ob . y , + 1 ) ;
}
}
sel sort ( ) ;
sel normalize ( ) ;
sel . type = SEL_REGULAR ;
sel . type = SEL_REGULAR ;
for ( type = 1 ; type < LEN ( selmasks ) ; + + type ) {
for ( type = 1 ; type < LEN ( selmasks ) ; + + type ) {
@ -896,7 +902,7 @@ bpress(XEvent *e) {
}
}
selsnap ( sel . snap , & sel . ob . x , & sel . ob . y , - 1 ) ;
selsnap ( sel . snap , & sel . ob . x , & sel . ob . y , - 1 ) ;
selsnap ( sel . snap , & sel . oe . x , & sel . oe . y , + 1 ) ;
selsnap ( sel . snap , & sel . oe . x , & sel . oe . y , + 1 ) ;
sel sort ( ) ;
sel normalize ( ) ;
/*
/*
* Draw selection , unless it ' s regular and we don ' t want to
* Draw selection , unless it ' s regular and we don ' t want to
@ -1451,7 +1457,7 @@ selscroll(int orig, int n) {
sel . oe . x = term . col ;
sel . oe . x = term . col ;
}
}
}
}
sel sort ( ) ;
sel normalize ( ) ;
}
}
}
}