| tMaking the copy and pasting consistent. - st - [fork] customized build of st, … | |
| git clone git://src.adamsgaard.dk/st | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 4018b2c5075c1cab603ca137ef5f6d68b9cee483 | |
| parent ddd429ea2478beeb7d17d9b548abd9173049dcc6 | |
| Author: Christoph Lohmann <[email protected]> | |
| 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 | |
| t@@ -788,9 +788,18 @@ selcopy(void) { | |
| memcpy(ptr, p, size); | |
| ptr += size; | |
| } | |
| - /* \n at the end of every selected line except for the… | |
| + | |
| + /* | |
| + * 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; | |
| } | |
| t@@ -801,7 +810,7 @@ void | |
| selnotify(XEvent *e) { | |
| ulong nitems, ofs, rem; | |
| int format; | |
| - uchar *data; | |
| + uchar *data, *last, *repl; | |
| Atom type; | |
| ofs = 0; | |
| t@@ -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; |