[hackers] [st][PATCH] add basic tmux PRIMARY clipboard support

From: fpqc ?? <harry.gindi_AT_live.com>
Date: Wed, 18 Jan 2017 15:58:59 +0000

---
 base64dec.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 st.c        | 12 +++++++++++-
 st.info     |  1 +
 3 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 base64dec.c
diff --git a/base64dec.c b/base64dec.c
new file mode 100644
index 0000000..335e3c5
--- /dev/null
+++ b/base64dec.c
_AT_@ -0,0 +1,42 @@
+/*taken from libulz with permission*/
+
+static const char base64_tbl[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static inline int chrpos(int c) {
+	int i = 0;
+	for(;i<64;i++) if(base64_tbl[i] == c) return i;
+	return -1;
+}
+static size_t base64dec(void* dst, const char* src, size_t dst_len) {
+	const char* s = src;
+	unsigned char *d = dst;
+	size_t l = dst_len, o = 0;
+	int n = 0, cnt = 0, skip = 0;
+	if(l) for(;;) {
+		int p;
+		if(*s == '=') {
+			skip++;
+			if(skip > 2) return 0;
+			p = 0;
+		} else if (!*s) {
+			if(cnt % 4 != 0 || !l) return 0;
+			*d++ = 0;
+			return o;
+		} else if(skip) {
+			return 0;
+		} else if((p = chrpos(*s)) == -1) return 0;
+		n = (n << 6) | p;
+		cnt++;
+		if(cnt % 4 == 0) {
+			if(l < 3) return 0;
+			*d++ = n >> 16;
+			*d++ = n >> 8 & 0xff;
+			*d++ = n & 0xff;
+			l -= 3;
+			o += 3-skip;
+			n = 0;
+		}
+		s++;
+	}
+	return 0;
+}
diff --git a/st.c b/st.c
index fbcd9e0..158521e 100644
--- a/st.c
+++ b/st.c
_AT_@ -32,7 +32,7 @@
 #include <wchar.h>
 
 #include "arg.h"
-
+#include "base64dec.c"
 char *argv0;
 
 #define Glyph Glyph_
_AT_@ -2538,6 +2538,16 @@ strhandle(void)
 				break;
 			p = strescseq.args[2];
 			/* FALLTHROUGH */
+		case 52:
+			if (narg > 2){
+				char *src=strescseq.args[2];
+				size_t l = (strlen(src)/4)*3;
+				char *buf=xmalloc(l+1);
+				base64dec(buf, src, l);
+				printf(buf);
+				xsetsel(buf, CurrentTime);
+				free(buf);
+			}
 		case 104: /* color reset, here p = NULL */
 			j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
 			if (xsetcolorname(j, p)) {
diff --git a/st.info b/st.info
index 13cc8eb..0b928af 100644
--- a/st.info
+++ b/st.info
_AT_@ -189,6 +189,7 @@ st| simpleterm,
 	Se,
 	Ss,
 	Tc,
+	Ms=\E]52;%p1%s;%p2%s\007,
 
 st-256color| simpleterm with 256 colors,
 	use=st,
-- 
2.11.0
Received on Wed Jan 18 2017 - 16:58:59 CET

This archive was generated by hypermail 2.3.0 : Wed Jan 18 2017 - 17:00:24 CET