Introduction
Introduction Statistics Contact Development Disclaimer Help
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;
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.