[st][patches][right_click_to_plumb] Updated simple_plumb patch for st 0.9.3 - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 96f25c7dffe9663795508ca36c2454b394243441
 (DIR) parent b669832d833ece52923075821e3ceda1bcd35e69
 (HTM) Author: Caleb Lindgren <calebmlindgren@gmail.com>
       Date:   Tue, 19 Aug 2025 12:47:54 -0400
       
       [st][patches][right_click_to_plumb] Updated simple_plumb patch for st 0.9.3
       
       Diffstat:
         M st.suckless.org/patches/right_clic… |       1 +
         A st.suckless.org/patches/right_clic… |     148 +++++++++++++++++++++++++++++++
       
       2 files changed, 149 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/st.suckless.org/patches/right_click_to_plumb/index.md b/st.suckless.org/patches/right_click_to_plumb/index.md
       @@ -83,6 +83,7 @@ the current selection.
        
        Download
        --------
       +* [simple_plumb-0.9.3.diff](simple_plumb-0.9.3.diff) (2025-08-19)
        * [simple_plumb-0.8.5.diff](simple_plumb-0.8.5.diff) (2022-01-18)
        * [simple_plumb.diff](simple_plumb.diff) (2020-04-10)
        
 (DIR) diff --git a/st.suckless.org/patches/right_click_to_plumb/simple_plumb-0.9.3.diff b/st.suckless.org/patches/right_click_to_plumb/simple_plumb-0.9.3.diff
       @@ -0,0 +1,148 @@
       +diff --git a/config.def.h b/config.def.h
       +index 2cd740a..502e4b6 100644
       +--- a/config.def.h
       ++++ b/config.def.h
       +@@ -472,3 +472,9 @@ static char ascii_printable[] =
       +         " !\"#$%&'()*+,-./0123456789:;<=>?"
       +         "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
       +         "`abcdefghijklmnopqrstuvwxyz{|}~";
       ++
       ++/*
       ++ * plumb_cmd is run on mouse button 3 click, with first NULL set to
       ++ * current selection and with cwd set to the cwd of the active shell
       ++ */
       ++static char *plumb_cmd[] = {"plumb", "-m", NULL, NULL};
       +diff --git a/st.c b/st.c
       +index 8e57991..36bfb3e 100644
       +--- a/st.c
       ++++ b/st.c
       +@@ -27,6 +27,9 @@
       + #elif defined(__FreeBSD__) || defined(__DragonFly__)
       +  #include <libutil.h>
       + #endif
       ++#if defined(__OpenBSD__)
       ++ #include <sys/sysctl.h>
       ++#endif
       + 
       + /* Arbitrary sizes */
       + #define UTF_INVALID   0xFFFD
       +@@ -232,6 +235,22 @@ static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
       + static const Rune utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
       + static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
       + 
       ++int
       ++subprocwd(char *path)
       ++{
       ++#if   defined(__linux)
       ++        if (snprintf(path, PATH_MAX, "/proc/%d/cwd", pid) < 0)
       ++                return -1;
       ++        return 0;
       ++#elif defined(__OpenBSD__)
       ++        size_t sz = PATH_MAX;
       ++        int name[3] = {CTL_KERN, KERN_PROC_CWD, pid};
       ++        if (sysctl(name, 3, path, &sz, 0, 0) == -1)
       ++                return -1;
       ++        return 0;
       ++#endif
       ++}
       ++
       + ssize_t
       + xwrite(int fd, const char *s, size_t len)
       + {
       +@@ -796,7 +815,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
       +                 if (s > 2)
       +                         close(s);
       + #ifdef __OpenBSD__
       +-                if (pledge("stdio getpw proc exec", NULL) == -1)
       ++                if (pledge("stdio rpath tty proc ps exec", NULL) == -1)
       +                         die("pledge\n");
       + #endif
       +                 execsh(cmd, args);
       +diff --git a/st.h b/st.h
       +index fd3b0d8..14095c9 100644
       +--- a/st.h
       ++++ b/st.h
       +@@ -111,6 +111,8 @@ void *xmalloc(size_t);
       + void *xrealloc(void *, size_t);
       + char *xstrdup(const char *);
       + 
       ++int subprocwd(char *);
       ++
       + /* config.h globals */
       + extern char *utmp;
       + extern char *scroll;
       +diff --git a/x.c b/x.c
       +index d73152b..b98b923 100644
       +--- a/x.c
       ++++ b/x.c
       +@@ -5,6 +5,7 @@
       + #include <locale.h>
       + #include <signal.h>
       + #include <sys/select.h>
       ++#include <sys/wait.h>
       + #include <time.h>
       + #include <unistd.h>
       + #include <libgen.h>
       +@@ -216,6 +217,7 @@ static void (*handler[LASTEvent])(XEvent *) = {
       + };
       + 
       + /* Globals */
       ++static int plumbsel;
       + static DC dc;
       + static XWindow xw;
       + static XSelection xsel;
       +@@ -694,6 +696,37 @@ xsetsel(char *str)
       +         setsel(str, CurrentTime);
       + }
       + 
       ++void
       ++plumbinit()
       ++{
       ++        for(plumbsel = 0; plumb_cmd[plumbsel]; plumbsel++);
       ++}
       ++
       ++void
       ++plumb(char *sel) {
       ++        if (sel == NULL)
       ++                return;
       ++        char cwd[PATH_MAX];
       ++        pid_t child;
       ++        if (subprocwd(cwd) != 0)
       ++                return;
       ++
       ++        plumb_cmd[plumbsel] = sel;
       ++
       ++        switch(child = fork()) {
       ++                case -1:
       ++                        return;
       ++                case 0:
       ++                        if (chdir(cwd) != 0)
       ++                                exit(1);
       ++                        if (execvp(plumb_cmd[0], plumb_cmd) == -1)
       ++                                exit(1);
       ++                        exit(0);
       ++                default:
       ++                        waitpid(child, NULL, 0);
       ++        }
       ++}
       ++
       + void
       + brelease(XEvent *e)
       + {
       +@@ -711,6 +744,8 @@ brelease(XEvent *e)
       +                 return;
       +         if (btn == Button1)
       +                 mousesel(e, 1);
       ++        else if (btn == Button3)
       ++                plumb(xsel.primary);
       + }
       + 
       + void
       +@@ -2088,6 +2123,7 @@ main(int argc, char *argv[])
       +         } ARGEND;
       + 
       + run:
       ++        plumbinit();
       +         if (argc > 0) /* eat all remaining arguments */
       +                 opt_cmd = argv;
       +