mirror of
https://github.com/mintycube/st.git
synced 2024-10-22 14:05:49 +02:00
b71d9f6669
This patch must be applied on the externalpipe patch. It adds the function externalpipein to redirect the standard output of the external command to the slave size of the pty, that is, as if the external program had been manually executed on the terminal. It can be used to send desired escape sequences to the terminal with a shortcut. I created the patch to make use of the dynamic-colors program (https://github.com/sos4nt/dynamic-colors) that uses the OSC escape sequences to change the colors of the terminal. The program keeps the last colorscheme selected in a file, so you can use it to select the colorscheme for all newly opened terminals from that moment on. If you want to change the color of the background and foreground independently from the palette, you have to merge in the patch for the OSC escape sequences 10, 11, and 12. This patch includes the changes of the externalpipe sigaction patch to prevent reseting the signal handler for SIGCHLD when the proces of the external command exits.
73 lines
1.4 KiB
C
73 lines
1.4 KiB
C
void
|
|
#if EXTERNALPIPEIN_PATCH
|
|
extpipe(const Arg *arg, int in)
|
|
#else
|
|
externalpipe(const Arg *arg)
|
|
#endif // EXTERNALPIPEIN_PATCH
|
|
{
|
|
int to[2];
|
|
char buf[UTF_SIZ];
|
|
void (*oldsigpipe)(int);
|
|
Glyph *bp, *end;
|
|
int lastpos, n, newline;
|
|
|
|
if (pipe(to) == -1)
|
|
return;
|
|
|
|
switch (fork()) {
|
|
case -1:
|
|
close(to[0]);
|
|
close(to[1]);
|
|
return;
|
|
case 0:
|
|
dup2(to[0], STDIN_FILENO);
|
|
close(to[0]);
|
|
close(to[1]);
|
|
#if EXTERNALPIPEIN_PATCH
|
|
if (in)
|
|
dup2(csdfd, STDOUT_FILENO);
|
|
close(csdfd);
|
|
#endif // EXTERNALPIPEIN_PATCH
|
|
execvp(((char **)arg->v)[0], (char **)arg->v);
|
|
fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
|
|
perror("failed");
|
|
exit(0);
|
|
}
|
|
|
|
close(to[0]);
|
|
/* ignore sigpipe for now, in case child exists early */
|
|
oldsigpipe = signal(SIGPIPE, SIG_IGN);
|
|
newline = 0;
|
|
for (n = 0; n < term.row; n++) {
|
|
bp = term.line[n];
|
|
lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
|
|
if (lastpos < 0)
|
|
break;
|
|
end = &bp[lastpos + 1];
|
|
for (; bp < end; ++bp)
|
|
if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
|
|
break;
|
|
if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
|
|
continue;
|
|
if (xwrite(to[1], "\n", 1) < 0)
|
|
break;
|
|
newline = 0;
|
|
}
|
|
if (newline)
|
|
(void)xwrite(to[1], "\n", 1);
|
|
close(to[1]);
|
|
/* restore */
|
|
signal(SIGPIPE, oldsigpipe);
|
|
}
|
|
|
|
#if EXTERNALPIPEIN_PATCH
|
|
void
|
|
externalpipe(const Arg *arg) {
|
|
extpipe(arg, 0);
|
|
}
|
|
|
|
void
|
|
externalpipein(const Arg *arg) {
|
|
extpipe(arg, 1);
|
|
}
|
|
#endif // EXTERNALPIPEIN_PATCH
|