st-externalpipe-0.7.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
st-externalpipe-0.7.diff (2228B) | |
--- | |
1 diff --git a/st.c b/st.c | |
2 index 2594c65..ecd9bdc 100644 | |
3 --- a/st.c | |
4 +++ b/st.c | |
5 @@ -329,6 +329,7 @@ static void clipcopy(const Arg *); | |
6 static void clippaste(const Arg *); | |
7 static void numlock(const Arg *); | |
8 static void selpaste(const Arg *); | |
9 +static void externalpipe(const Arg *); | |
10 static void xzoom(const Arg *); | |
11 static void xzoomabs(const Arg *); | |
12 static void xzoomreset(const Arg *); | |
13 @@ -337,6 +338,9 @@ static void printscreen(const Arg *) ; | |
14 static void toggleprinter(const Arg *); | |
15 static void sendbreak(const Arg *); | |
16 | |
17 +/* variables used in config.h */ | |
18 +static char winid[64]; | |
19 + | |
20 /* Config.h for applying patches and the configuration. */ | |
21 #include "config.h" | |
22 | |
23 @@ -2922,6 +2926,59 @@ eschandle(uchar ascii) | |
24 } | |
25 | |
26 void | |
27 +externalpipe(const Arg *arg) | |
28 +{ | |
29 + int to[2]; | |
30 + char buf[UTF_SIZ]; | |
31 + void (*oldsigpipe)(int); | |
32 + Glyph *bp, *end; | |
33 + int lastpos, n, newline; | |
34 + | |
35 + if (pipe(to) == -1) | |
36 + return; | |
37 + | |
38 + switch (fork()) { | |
39 + case -1: | |
40 + close(to[0]); | |
41 + close(to[1]); | |
42 + return; | |
43 + case 0: | |
44 + dup2(to[0], STDIN_FILENO); | |
45 + close(to[0]); | |
46 + close(to[1]); | |
47 + execvp(((char **)arg->v)[0], (char **)arg->v); | |
48 + fprintf(stderr, "st: execvp %s ", ((char **)arg->v)[0]); | |
49 + perror("failed"); | |
50 + exit(0); | |
51 + } | |
52 + | |
53 + close(to[0]); | |
54 + /* ignore sigpipe for now, in case child exits early */ | |
55 + oldsigpipe = signal(SIGPIPE, SIG_IGN); | |
56 + newline = 0; | |
57 + for (n = 0; n < term.row; n++) { | |
58 + bp = term.line[n]; | |
59 + lastpos = MIN(tlinelen(n) + 1, term.col) - 1; | |
60 + if (lastpos < 0) | |
61 + break; | |
62 + end = &bp[lastpos + 1]; | |
63 + for (; bp < end; ++bp) | |
64 + if (xwrite(to[1], buf, utf8encode(bp->u, buf)) … | |
65 + break; | |
66 + if ((newline = term.line[n][lastpos].mode & ATTR_WRAP)) | |
67 + continue; | |
68 + if (xwrite(to[1], "\n", 1) < 0) | |
69 + break; | |
70 + newline = 0; | |
71 + } | |
72 + if (newline) | |
73 + (void)xwrite(to[1], "\n", 1); | |
74 + close(to[1]); | |
75 + /* restore */ | |
76 + signal(SIGPIPE, oldsigpipe); | |
77 +} | |
78 + | |
79 +void | |
80 tputc(Rune u) | |
81 { | |
82 char c[UTF_SIZ]; | |
83 @@ -3479,6 +3536,7 @@ xinit(void) | |
84 xw.w, xw.h, 0, XDefaultDepth(xw.dpy, xw.scr), I… | |
85 xw.vis, CWBackPixel | CWBorderPixel | CWBitGrav… | |
86 | CWEventMask | CWColormap, &xw.attrs); | |
87 + snprintf(winid, LEN(winid), "%lu", (unsigned long)xw.win); | |
88 | |
89 memset(&gcvalues, 0, sizeof(gcvalues)); | |
90 gcvalues.graphics_exposures = False; |