st-externalpipe-externalpipein-20200418-5e6a125.diff - sites - public wiki cont… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
st-externalpipe-externalpipein-20200418-5e6a125.diff (3567B) | |
--- | |
1 From 5e6a125f14d050945be6add49bf5940277b4278f Mon Sep 17 00:00:00 2001 | |
2 From: Christian Tenllado <[email protected]> | |
3 Date: Sat, 18 Apr 2020 20:45:40 +0200 | |
4 Subject: [PATCH] externalpipe and externalpipein | |
5 | |
6 This patch must be applied on the externalpipe patch. It adds the | |
7 function externalpipein to redirect the standard output of the external | |
8 command to the slave size of the pty, that is, as if the external | |
9 program had been manually executed on the terminal. It can be used to | |
10 send desired escape sequences to the terminal with a shortcut. | |
11 | |
12 I created the patch to make use of the dynamic-colors program | |
13 (https://github.com/sos4nt/dynamic-colors) that uses the OSC escape | |
14 sequences to change the colors of the terminal. The program keeps the | |
15 last colorscheme selected in a file, so you can use it to select the | |
16 colorscheme for all newly opened terminals from that moment on. If you | |
17 want to change the color of the background and foreground independently | |
18 from the palette, you have to merge in the patch for the OSC escape | |
19 sequences 10, 11, and 12. | |
20 | |
21 This patch includes the changes of the externalpipe sigaction patch to | |
22 prevent reseting the signal handler for SIGCHLD when the proces of the | |
23 external command exits. | |
24 --- | |
25 st.c | 28 ++++++++++++++++++++++++---- | |
26 st.h | 1 + | |
27 2 files changed, 25 insertions(+), 4 deletions(-) | |
28 | |
29 diff --git a/st.c b/st.c | |
30 index ab291ac..ac19ebf 100644 | |
31 --- a/st.c | |
32 +++ b/st.c | |
33 @@ -225,6 +225,7 @@ static CSIEscape csiescseq; | |
34 static STREscape strescseq; | |
35 static int iofd = 1; | |
36 static int cmdfd; | |
37 +static int csdfd; | |
38 static pid_t pid; | |
39 | |
40 static uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; | |
41 @@ -712,12 +713,14 @@ sigchld(int a) | |
42 int stat; | |
43 pid_t p; | |
44 | |
45 - if ((p = waitpid(pid, &stat, WNOHANG)) < 0) | |
46 + if ((p = waitpid(-1, &stat, WNOHANG)) < 0) | |
47 die("waiting for pid %hd failed: %s\n", pid, strerror(e… | |
48 | |
49 if (pid != p) | |
50 return; | |
51 | |
52 + close(csdfd); | |
53 + | |
54 if (WIFEXITED(stat) && WEXITSTATUS(stat)) | |
55 die("child exited with status %d\n", WEXITSTATUS(stat)); | |
56 else if (WIFSIGNALED(stat)) | |
57 @@ -753,6 +756,7 @@ int | |
58 ttynew(char *line, char *cmd, char *out, char **args) | |
59 { | |
60 int m, s; | |
61 + struct sigaction sa; | |
62 | |
63 if (out) { | |
64 term.mode |= MODE_PRINT; | |
65 @@ -802,9 +806,12 @@ ttynew(char *line, char *cmd, char *out, char **arg… | |
66 if (pledge("stdio rpath tty proc", NULL) == -1) | |
67 die("pledge\n"); | |
68 #endif | |
69 - close(s); | |
70 + csdfd = s; | |
71 cmdfd = m; | |
72 - signal(SIGCHLD, sigchld); | |
73 + memset(&sa, 0, sizeof(sa)); | |
74 + sigemptyset(&sa.sa_mask); | |
75 + sa.sa_handler = sigchld; | |
76 + sigaction(SIGCHLD, &sa, NULL); | |
77 break; | |
78 } | |
79 return cmdfd; | |
80 @@ -1920,7 +1927,7 @@ strparse(void) | |
81 } | |
82 | |
83 void | |
84 -externalpipe(const Arg *arg) | |
85 +extpipe(const Arg *arg, int in) | |
86 { | |
87 int to[2]; | |
88 char buf[UTF_SIZ]; | |
89 @@ -1940,6 +1947,9 @@ externalpipe(const Arg *arg) | |
90 dup2(to[0], STDIN_FILENO); | |
91 close(to[0]); | |
92 close(to[1]); | |
93 + if (in) | |
94 + dup2(csdfd, STDOUT_FILENO); | |
95 + close(csdfd); | |
96 execvp(((char **)arg->v)[0], (char **)arg->v); | |
97 fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]… | |
98 perror("failed"); | |
99 @@ -1972,6 +1982,16 @@ externalpipe(const Arg *arg) | |
100 signal(SIGPIPE, oldsigpipe); | |
101 } | |
102 | |
103 +void | |
104 +externalpipe(const Arg *arg) { | |
105 + extpipe(arg, 0); | |
106 +} | |
107 + | |
108 +void | |
109 +externalpipein(const Arg *arg) { | |
110 + extpipe(arg, 1); | |
111 +} | |
112 + | |
113 void | |
114 strdump(void) | |
115 { | |
116 diff --git a/st.h b/st.h | |
117 index fe84fda..bbf38fa 100644 | |
118 --- a/st.h | |
119 +++ b/st.h | |
120 @@ -82,6 +82,7 @@ void redraw(void); | |
121 void draw(void); | |
122 | |
123 void externalpipe(const Arg *); | |
124 +void externalpipein(const Arg *); | |
125 void printscreen(const Arg *); | |
126 void printsel(const Arg *); | |
127 void sendbreak(const Arg *); | |
128 -- | |
129 2.20.1 | |
130 |