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