sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

st-paste_controls-0.9.2.diff (1021B)


      1 diff --git a/x.c b/x.c
      2 index bd23686..254d3d0 100644
      3 --- a/x.c
      4 +++ b/x.c
      5 @@ -580,11 +580,33 @@ selnotify(XEvent *e)
      6  		 * copy and pasting. When receiving some selection data,
      7  		 * replace all '\n' with '\r'.
      8  		 * FIXME: Fix the computer world.
      9 +		 *
     10 +		 * Also, replace most C0 control codes with spaces, except for
     11 +		 * HT and CR. Note that we are not replacing C1 control codes
     12 +		 * (0x80 to 0x9F), as these are possibly valid UTF-8
     13 +		 * continuation bytes.
     14  		 */
     15  		repl = data;
     16  		last = data + nitems * format / 8;
     17 -		while ((repl = memchr(repl, '\n', last - repl))) {
     18 -			*repl++ = '\r';
     19 +		while (repl != last) {
     20 +			if (*repl <= 0x1f) {
     21 +				switch (*repl) {
     22 +				case 0x09: /* HT \t */
     23 +				case 0x0D: /* CR \r */
     24 +					repl++;
     25 +					break;
     26 +				case 0x0a: /* LF \n */
     27 +					*repl++ = '\r';
     28 +					break;
     29 +				default:
     30 +					*repl++ = ' ';
     31 +					break;
     32 +				};
     33 +			} else if (*repl == 0x7f) { /* DEL */
     34 +				*repl++ = ' ';
     35 +			} else {
     36 +				repl++;
     37 +			}
     38  		}
     39  
     40  		if (IS_SET(MODE_BRCKTPASTE) && ofs == 0)