commit 8f6c89f111914f5a8fe7d9bcd8e06956ea87b78e
parent b81347e3f54c76f39bb2b068551a482073a7bb5b
Author: ssd @leno <ssd@mailless.org>
Date: Mon, 24 Aug 2015 23:28:58 +0200
st: update externalpipe patch
Diffstat:
3 files changed, 166 insertions(+), 0 deletions(-)
diff --git a/st.suckless.org/patches/externalpipe.md b/st.suckless.org/patches/externalpipe.md
@@ -27,11 +27,15 @@ Download
* [st-0.4.1-externalpipe.diff][0]
* [st-0.5-externalpipe.diff][3]
+* [st-0.6-externalpipe.diff][4]
+* [st-git-20150824-externalpipe.diff][5]
[0]: st-0.4.1-externalpipe.diff
[1]: https://raw.github.com/bobrippling/perlbin/master/xurls
[2]: https://github.com/bobrippling/open
[3]: http://witsquash.com/~marty/st-0.5-externalpipe.diff
+[4]: st-0.6-externalpipe.diff
+[5]: st-git-20150824-externalpipe.diff
Author
diff --git a/st.suckless.org/patches/st-0.6-externalpipe.diff b/st.suckless.org/patches/st-0.6-externalpipe.diff
@@ -0,0 +1,87 @@
+diff --git a/config.def.h b/config.def.h
+index 64e75b8..9245814 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -128,6 +128,7 @@ static Shortcut shortcuts[] = {
+ { MODKEY|ShiftMask, XK_C, clipcopy, {.i = 0} },
+ { MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} },
+ { MODKEY, XK_Num_Lock, numlock, {.i = 0} },
++ { MODKEY, XK_u, externalpipe, {.v = "rot13 > /tmp/test-externalpipe.txt"} },
+ };
+
+ /*
+diff --git a/st.c b/st.c
+index b89d094..941deb5 100644
+--- a/st.c
++++ b/st.c
+@@ -326,6 +326,7 @@ static void clipcopy(const Arg *);
+ static void clippaste(const Arg *);
+ static void numlock(const Arg *);
+ static void selpaste(const Arg *);
++static void externalpipe(const Arg *);
+ static void xzoom(const Arg *);
+ static void xzoomabs(const Arg *);
+ static void xzoomreset(const Arg *);
+@@ -2684,6 +2685,62 @@ eschandle(uchar ascii) {
+ }
+
+ void
++externalpipe(const Arg *arg)
++{
++ int to[2]; /* 0 = read, 1 = write */
++ pid_t child;
++ int n;
++ void (*oldsigpipe)(int);
++ char buf[UTF_SIZ];
++ Glyph *bp, *end;
++
++ if(pipe(to) == -1)
++ return;
++
++ /* sigchld() handles this */
++ switch(child = fork()){
++ case -1:
++ close(to[0]), close(to[1]);
++ return;
++ case 0:
++ /* child */
++ close(to[1]);
++ dup2(to[0], STDIN_FILENO); /* 0<&to */
++ close(to[0]);
++ execvp(
++ "sh",
++ (char *const []){
++ "/bin/sh",
++ "-c",
++ (char *)arg->v,
++ 0
++ });
++ exit(127);
++ }
++
++ /* parent */
++ close(to[0]);
++ /* ignore sigpipe for now, in case child exits early */
++ oldsigpipe = signal(SIGPIPE, SIG_IGN);
++
++ for(n = 0; n < term.row; n++){
++ bp = &term.line[n][0];
++ end = &bp[MIN(tlinelen(n), term.col) - 1];
++ if(bp != end || bp->u != ' ')
++ for(; bp <= end; ++bp)
++ if(xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
++ break;
++ if(xwrite(to[1], "\n", 1) < 0)
++ break;
++ }
++
++ close(to[1]);
++
++ /* restore */
++ signal(SIGPIPE, oldsigpipe);
++}
++
++void
+ tputc(Rune u) {
+ char c[UTF_SIZ];
+ bool control;
diff --git a/st.suckless.org/patches/st-git-20150824-externalpipe.diff b/st.suckless.org/patches/st-git-20150824-externalpipe.diff
@@ -0,0 +1,75 @@
+diff --git a/st.c b/st.c
+index 35a840b..bb2dd17 100644
+--- a/st.c
++++ b/st.c
+@@ -327,6 +327,7 @@ static void clipcopy(const Arg *);
+ static void clippaste(const Arg *);
+ static void numlock(const Arg *);
+ static void selpaste(const Arg *);
++static void externalpipe(const Arg *);
+ static void xzoom(const Arg *);
+ static void xzoomabs(const Arg *);
+ static void xzoomreset(const Arg *);
+@@ -2888,6 +2889,62 @@ eschandle(uchar ascii)
+ }
+
+ void
++externalpipe(const Arg *arg)
++{
++ int to[2]; /* 0 = read, 1 = write */
++ pid_t child;
++ int n;
++ void (*oldsigpipe)(int);
++ char buf[UTF_SIZ];
++ Glyph *bp, *end;
++
++ if(pipe(to) == -1)
++ return;
++
++ /* sigchld() handles this */
++ switch(child = fork()){
++ case -1:
++ close(to[0]), close(to[1]);
++ return;
++ case 0:
++ /* child */
++ close(to[1]);
++ dup2(to[0], STDIN_FILENO); /* 0<&to */
++ close(to[0]);
++ execvp(
++ "sh",
++ (char *const []){
++ "/bin/sh",
++ "-c",
++ (char *)arg->v,
++ 0
++ });
++ exit(127);
++ }
++
++ /* parent */
++ close(to[0]);
++ /* ignore sigpipe for now, in case child exits early */
++ oldsigpipe = signal(SIGPIPE, SIG_IGN);
++
++ for(n = 0; n < term.row; n++){
++ bp = &term.line[n][0];
++ end = &bp[MIN(tlinelen(n), term.col) - 1];
++ if(bp != end || bp->u != ' ')
++ for(; bp <= end; ++bp)
++ if(xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
++ break;
++ if(xwrite(to[1], "\n", 1) < 0)
++ break;
++ }
++
++ close(to[1]);
++
++ /* restore */
++ signal(SIGPIPE, oldsigpipe);
++}
++
++void
+ tputc(Rune u)
+ {
+ char c[UTF_SIZ];