|
@@ -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;
|