diff options
| -rw-r--r-- | st.c | 46 | 
1 files changed, 26 insertions, 20 deletions
| @@ -441,7 +441,7 @@ static void selclear(XEvent *);  static void selrequest(XEvent *);  static void selinit(void); -static void selsort(void); +static void selnormalize(void);  static inline bool selected(int, int);  static char *getsel(void);  static void selcopy(void); @@ -657,8 +657,19 @@ y2row(int y) {  	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 -selsort(void) { +selnormalize(void) { +	int i; +  	if(sel.ob.y == sel.oe.y) {  		sel.nb.x = MIN(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.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 @@ -683,8 +703,6 @@ selected(int x, int y) {  void  selsnap(int mode, int *x, int *y, int direction) { -	int i; -  	switch(mode) {  	case SNAP_WORD:  		/* @@ -716,7 +734,7 @@ selsnap(int mode, int *x, int *y, int direction) {  				continue;  			} -			if(strchr(worddelimiters, +			if(*x >= tlinelen(*y) || strchr(worddelimiters,  					term.line[*y][*x+direction].c[0])) {  				break;  			} @@ -747,18 +765,6 @@ selsnap(int mode, int *x, int *y, int direction) {  			}  		}  		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.ob.x, &sel.ob.y, +1);  	} -	selsort(); +	selnormalize();  	sel.type = SEL_REGULAR;  	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.oe.x, &sel.oe.y, +1); -		selsort(); +		selnormalize();  		/*  		 * 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;  			}  		} -		selsort(); +		selnormalize();  	}  } | 
