commit f22615875d880bbf2dc79a7e10f056c05a48273b
Author: Alexander Arkhipov <[email protected]>
Date:   Tue Jan 18 20:04:21 2022 +0300

    [st] Update the right click to plumb patch for st 0.8.5

diff --git a/st.suckless.org/patches/right_click_to_plumb/index.md 
b/st.suckless.org/patches/right_click_to_plumb/index.md
index 9695a10b..16aba109 100644
--- a/st.suckless.org/patches/right_click_to_plumb/index.md
+++ b/st.suckless.org/patches/right_click_to_plumb/index.md
@@ -83,9 +83,11 @@ the current selection.
 
 Download
 --------
+* [simple_plumb-0.8.5.diff](simple_plumb-0.8.5.diff) (2022-01-18)
 * [simple_plumb.diff](simple_plumb.diff) (2020-04-10)
 
 Authors
 -------
 * [dallin](https://dallinjdahl.github.io/) <[email protected]>
+* [Alexander Arkhipov](gopher://mineeyes.cyou/) (0.8.5 port)
 
diff --git 
a/st.suckless.org/patches/right_click_to_plumb/simple_plumb-0.8.5.diff 
b/st.suckless.org/patches/right_click_to_plumb/simple_plumb-0.8.5.diff
new file mode 100644
index 00000000..f0eb5f3b
--- /dev/null
+++ b/st.suckless.org/patches/right_click_to_plumb/simple_plumb-0.8.5.diff
@@ -0,0 +1,148 @@
+diff --git a/config.def.h b/config.def.h
+index 91ab8ca..d0343e3 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 51049ba..11756c4 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
+@@ -231,6 +234,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)
+ {
+@@ -810,7 +829,7 @@ ttynew(const char *line, char *cmd, const char *out, char 
**args)
+               break;
+       default:
+ #ifdef __OpenBSD__
+-              if (pledge("stdio rpath tty proc", NULL) == -1)
++              if (pledge("stdio rpath tty proc ps exec", NULL) == -1)
+                       die("pledge
");
+ #endif
+               close(s);
+diff --git a/st.h b/st.h
+index 519b9bd..8255556 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 *);
++
+ int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b);
+ 
+ /* config.h globals */
+diff --git a/x.c b/x.c
+index cd96575..5d3948a 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 (e->xbutton.button == Button1)
+               mousesel(e, 1);
++      else if (e->xbutton.button == Button3)
++              plumb(xsel.primary);
+ }
+ 
+ void
+@@ -2076,6 +2111,7 @@ main(int argc, char *argv[])
+       } ARGEND;
+ 
+ run:
++      plumbinit();
+       if (argc > 0) /* eat all remaining arguments */
+               opt_cmd = argv;
+ 


Reply via email to