st
simple terminal
git clone https://9o.is/git/st.git
commit d1525b5390acac89a18c04c3181fc260ff576255 parent feb912e0a18dcb309169aa1b383fa09a8ac8a80d Author: Christoph Lohmann <20h@r-36.net> Date: Sat, 13 Apr 2013 08:48:17 +0200 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. Diffstat:
| M | st.c | | | 35 | +++++++++++++++++++++++++++++++---- |
1 file changed, 31 insertions(+), 4 deletions(-)
diff --git 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;