diff options
| -rw-r--r-- | st.c | 22 | 
1 files changed, 13 insertions, 9 deletions
| @@ -663,9 +663,9 @@ bpress(XEvent *e) {  void  selcopy(void) { -	char *str, *ptr; +	char *str, *ptr, *p;  	int x, y, bufsize, is_selected = 0, size; -	Glyph *gp; +	Glyph *gp, *last;  	if(sel.bx == -1) {  		str = NULL; @@ -675,15 +675,19 @@ selcopy(void) {  		/* append every set & selected glyph to the selection */  		for(y = 0; y < term.row; y++) { -			for(x = 0; x < term.col; x++) { -				gp = &term.line[y][x]; +			gp = &term.line[y][0]; +			last = gp + term.col; -				if(!(is_selected = selected(x, y)) -						|| !(gp->state & GLYPH_SET)) { +			while(--last >= gp && !(last->state & GLYPH_SET)) +				/* nothing */; + +			for(x = 0; gp <= last; x++, ++gp) { +				if(!(is_selected = selected(x, y)))  					continue; -				} -				size = utf8size(gp->c); -				memcpy(ptr, gp->c, size); + +				p = (gp->state & GLYPH_SET) ? gp->c : " "; +				size = utf8size(p); +				memcpy(ptr, p, size);  				ptr += size;  			}  			/* \n at the end of every selected line except for the last one */ | 
