| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -922,60 +922,59 @@ getsel(void) { | 
															
														
														
													
														
															
																 | 
																 | 
																	int x, y, bufsize, size, i, ex; | 
																 | 
																 | 
																	int x, y, bufsize, size, i, ex; | 
															
														
														
													
														
															
																 | 
																 | 
																	Glyph *gp, *last; | 
																 | 
																 | 
																	Glyph *gp, *last; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(sel.ob.x == -1) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		str = NULL; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	} else { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		bufsize = (term.col+1) * (sel.ne.y-sel.nb.y+1) * UTF_SIZ; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		ptr = str = xmalloc(bufsize); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	if(sel.ob.x == -1) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		return NULL; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																		/* append every set & selected glyph to the selection */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																		for(y = sel.nb.y; y < sel.ne.y + 1; y++) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			gp = &term.line[y][0]; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			last = &gp[term.col-1]; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	bufsize = (term.col+1) * (sel.ne.y-sel.nb.y+1) * UTF_SIZ; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	ptr = str = xmalloc(bufsize); | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																			while(last >= gp && !(selected(last - gp, y) && | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			                      strcmp(last->c, " ") != 0)) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				--last; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	/* append every set & selected glyph to the selection */ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	for(y = sel.nb.y; y < sel.ne.y + 1; y++) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		gp = &term.line[y][0]; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		last = &gp[term.col-1]; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																			for(x = 0; gp <= last; x++, ++gp) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				if(!selected(x, y) || (gp->mode & ATTR_WDUMMY)) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																					continue; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		while(last >= gp && !(selected(last - gp, y) && | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				      strcmp(last->c, " ") != 0)) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			--last; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																				size = utf8len(gp->c); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				memcpy(ptr, gp->c, size); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				ptr += size; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		for(x = 0; gp <= last; x++, ++gp) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			if(!selected(x, y) || (gp->mode & ATTR_WDUMMY)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				continue; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																			/* | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * Copy and pasting of line endings is inconsistent | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * in the inconsistent terminal and GUI world. | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * The best solution seems like to produce '\n' when | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * something is copied from st and convert '\n' to | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * '\r', when something to be pasted is received by | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * st. | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * FIXME: Fix the computer world. | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			if(y < sel.ne.y && x > 0 && !((gp-1)->mode & ATTR_WRAP)) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				*ptr++ = '\n'; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			size = utf8len(gp->c); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			memcpy(ptr, gp->c, size); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			ptr += size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																			/* | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * If the last selected line expands in the selection | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 * after the visible text '\n' is appended. | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			 */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			if(y == sel.ne.y) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				i = term.col; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				while(--i > 0 && term.line[y][i].c[0] == ' ') | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																					/* nothing */; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				ex = sel.ne.x; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				if(sel.nb.y == sel.ne.y && sel.ne.x < sel.nb.x) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																					ex = sel.nb.x; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				if(i < ex) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																					*ptr++ = '\n'; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		/* | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * Copy and pasting of line endings is inconsistent | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * in the inconsistent terminal and GUI world. | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * The best solution seems like to produce '\n' when | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * something is copied from st and convert '\n' to | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * '\r', when something to be pasted is received by | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * st. | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * FIXME: Fix the computer world. | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 */ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		if(y < sel.ne.y && x > 0 && !((gp-1)->mode & ATTR_WRAP)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			*ptr++ = '\n'; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		/* | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * If the last selected line expands in the selection | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 * after the visible text '\n' is appended. | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		 */ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		if(y == sel.ne.y) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			i = term.col; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			while(--i > 0 && term.line[y][i].c[0] == ' ') | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				/* nothing */; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			ex = sel.ne.x; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			if(sel.nb.y == sel.ne.y && sel.ne.x < sel.nb.x) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				ex = sel.nb.x; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			if(i < ex) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				*ptr++ = '\n'; | 
															
														
														
													
														
															
																 | 
																 | 
																		} | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																		*ptr = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																	} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																	*ptr = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																	return str; | 
																 | 
																 | 
																	return str; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																	
																 | 
																
  |