JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Making the copy and pasting consistent.
[st.git] / st.c
diff --git a/st.c b/st.c
index 93058b9..49a9770 100644 (file)
--- a/st.c
+++ b/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;