st-externalpipe-20170608-b331da5.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       st-externalpipe-20170608-b331da5.diff (2413B)
       ---
            1 diff --git a/st.c b/st.c
            2 index 8d4a9f2..3b05f0b 100644
            3 --- a/st.c
            4 +++ b/st.c
            5 @@ -138,6 +138,7 @@ static void printscreen(const Arg *) ;
            6  static void iso14755(const Arg *);
            7  static void toggleprinter(const Arg *);
            8  static void sendbreak(const Arg *);
            9 +static void externalpipe(const Arg *);
           10  
           11  /* config.h for applying patches and the configuration. */
           12  #include "config.h"
           13 @@ -2344,6 +2345,59 @@ eschandle(uchar ascii)
           14  }
           15  
           16  void
           17 +externalpipe(const Arg *arg)
           18 +{
           19 +        int to[2];
           20 +        char buf[UTF_SIZ];
           21 +        void (*oldsigpipe)(int);
           22 +        Glyph *bp, *end;
           23 +        int lastpos, n, newline;
           24 +
           25 +        if (pipe(to) == -1)
           26 +                return;
           27 +
           28 +        switch (fork()) {
           29 +        case -1:
           30 +                close(to[0]);
           31 +                close(to[1]);
           32 +                return;
           33 +        case 0:
           34 +                dup2(to[0], STDIN_FILENO);
           35 +                close(to[0]);
           36 +                close(to[1]);
           37 +                execvp(((char **)arg->v)[0], (char **)arg->v);
           38 +                fprintf(stderr, "st: execvp %s ", ((char **)arg->v)[0]);
           39 +                perror("failed");
           40 +                exit(0);
           41 +        }
           42 +
           43 +        close(to[0]);
           44 +        /* ignore sigpipe for now, in case child exits early */
           45 +        oldsigpipe = signal(SIGPIPE, SIG_IGN);
           46 +        newline = 0;
           47 +        for (n = 0; n < term.row; n++) {
           48 +                bp = term.line[n];
           49 +                lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
           50 +                if (lastpos < 0)
           51 +                        break;
           52 +                end = &bp[lastpos + 1];
           53 +                for (; bp < end; ++bp)
           54 +                        if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
           55 +                                break;
           56 +                if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
           57 +                        continue;
           58 +                if (xwrite(to[1], "\n", 1) < 0)
           59 +                        break;
           60 +                newline = 0;
           61 +        }
           62 +        if (newline)
           63 +                (void)xwrite(to[1], "\n", 1);
           64 +        close(to[1]);
           65 +        /* restore */
           66 +        signal(SIGPIPE, oldsigpipe);
           67 +}
           68 +
           69 +void
           70  tputc(Rune u)
           71  {
           72          char c[UTF_SIZ];
           73 diff --git a/win.h b/win.h
           74 index 428111c..a012a24 100644
           75 --- a/win.h
           76 +++ b/win.h
           77 @@ -28,3 +28,5 @@ void xresize(int, int);
           78  void xselpaste(void);
           79  unsigned long xwinid(void);
           80  void xsetsel(char *, Time);
           81 +
           82 +extern char winid[64];
           83 diff --git a/x.c b/x.c
           84 index fbfd350..ff052e6 100644
           85 --- a/x.c
           86 +++ b/x.c
           87 @@ -139,6 +139,7 @@ static void (*handler[LASTEvent])(XEvent *) = {
           88  static DC dc;
           89  static XWindow xw;
           90  static XSelection xsel;
           91 +char winid[64];
           92  
           93  /* Font Ring Cache */
           94  enum {
           95 @@ -915,6 +916,7 @@ xinit(void)
           96                          win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
           97                          xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
           98                          | CWEventMask | CWColormap, &xw.attrs);
           99 +        snprintf(winid, LEN(winid), "%lu", (unsigned long)xw.win);
          100  
          101          memset(&gcvalues, 0, sizeof(gcvalues));
          102          gcvalues.graphics_exposures = False;