]> Sergey Matveev's repositories - st.git/commitdiff
Making the copy and pasting consistent.
authorChristoph Lohmann <20h@r-36.net>
Sat, 13 Apr 2013 06:48:17 +0000 (08:48 +0200)
committerChristoph Lohmann <20h@r-36.net>
Sat, 13 Apr 2013 06:48:17 +0000 (08:48 +0200)
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.

st.c

diff --git a/st.c b/st.c
index 93058b9fb8e7c23695b348220fd69a714a47ff07..49a9770c4f55b92322339eb2fe9f73cbd150032a 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;