Making the copy and pasting consistent.
The copying and pasting in the terminald and GUI world is flawed. Due to the discussion on the mailinglist it seems that sending '\n' is what GUIs expect and '\r' what terminal applications want. St now implements that behaviour.
This commit is contained in:
		
							parent
							
								
									ddd429ea24
								
							
						
					
					
						commit
						4018b2c507
					
				
							
								
								
									
										35
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								st.c
									
									
									
									
									
								
							| @ -788,9 +788,18 @@ selcopy(void) { | ||||
| 				memcpy(ptr, p, size); | ||||
| 				ptr += size; | ||||
| 			} | ||||
| 			/* \n at the end of every selected line except for the last one */ | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * 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(is_selected && y < sel.e.y) | ||||
| 				*ptr++ = '\r'; | ||||
| 				*ptr++ = '\n'; | ||||
| 		} | ||||
| 		*ptr = 0; | ||||
| 	} | ||||
| @ -801,7 +810,7 @@ void | ||||
| selnotify(XEvent *e) { | ||||
| 	ulong nitems, ofs, rem; | ||||
| 	int format; | ||||
| 	uchar *data; | ||||
| 	uchar *data, *last, *repl; | ||||
| 	Atom type; | ||||
| 
 | ||||
| 	ofs = 0; | ||||
| @ -812,7 +821,25 @@ selnotify(XEvent *e) { | ||||
| 			fprintf(stderr, "Clipboard allocation failed\n"); | ||||
| 			return; | ||||
| 		} | ||||
| 		ttywrite((const char *) data, nitems * format / 8); | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * As seen in selcopy: | ||||
| 		 * Line endings are inconsistent in the terminal and GUI world | ||||
| 		 * copy and pasting. When receiving some selection data, | ||||
| 		 * replace all '\n' with '\r'. | ||||
| 		 * FIXME: Fix the computer world. | ||||
| 		 */ | ||||
| 		repl = data; | ||||
| 		last = data + nitems * format / 8; | ||||
| 		while((repl = memchr(repl, '\n', last - repl))) { | ||||
| 			*repl++ = '\r'; | ||||
| 		} | ||||
| 
 | ||||
| 		last = data + nitems * format / 8; | ||||
| 		repl = data; | ||||
| 
 | ||||
| 
 | ||||
| 		ttywrite((const char *)data, nitems * format / 8); | ||||
| 		XFree(data); | ||||
| 		/* number of 32-bit chunks returned */ | ||||
| 		ofs += nitems * format / 32; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Christoph Lohmann
						Christoph Lohmann