sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit 1a3aad0efcfbb8995033785433f3b6225dc0719e
parent 97720f9277a652f9bbb8cfc225f0d57af70253af
Author: John Soros <j@roxor.me>
Date:   Sat,  3 Nov 2018 21:03:43 +0100

right_click_to_plumb: add a version fully implemented in C

Diffstat:
Mst.suckless.org/patches/right_click_to_plumb/index.md | 18++++++++++++++++++
Ast.suckless.org/patches/right_click_to_plumb/plumb_without_shell_OSC.diff | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 148 insertions(+), 0 deletions(-)

diff --git a/st.suckless.org/patches/right_click_to_plumb/index.md b/st.suckless.org/patches/right_click_to_plumb/index.md @@ -47,3 +47,21 @@ The plumbing program can be defined via `config.h`: * [jerome](http://blog.jardinmagique.info) <jerome@gcu.info> + +# A simpler plumb patch + +The plumbing command is run in the working directory of the shell, with as parameter the text selected with the mouse. + +Configuration is done in config.h and an example is supplied in config.def.h: + + static char *plumb_cmd = "plumb"; + +I made this version since I had a hard time understanding how the OSC 7 stuff works and I preferred a full C implementation of a plumbing patch. + +## Download + +* [plumb_without_shell_OSC.diff](plumb_without_shell_OSC.diff) (2018-11-03) + +## Authors + +* [john](http://roxor.me) <j@roxor.me> diff --git a/st.suckless.org/patches/right_click_to_plumb/plumb_without_shell_OSC.diff b/st.suckless.org/patches/right_click_to_plumb/plumb_without_shell_OSC.diff @@ -0,0 +1,130 @@ + config.def.h | 6 ++++++ + st.c | 21 ++++++++++++++++++++- + st.h | 2 ++ + x.c | 26 ++++++++++++++++++++++++++ + 4 files changed, 54 insertions(+), 1 deletion(-) + +diff --git a/config.def.h b/config.def.h +index 823e79f..08e6ed4 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -459,3 +459,9 @@ static char ascii_printable[] = + " !\"#$%&'()*+,-./0123456789:;<=>?" + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" + "`abcdefghijklmnopqrstuvwxyz{|}~"; ++ ++/* ++ * plumb_cmd is run on mouse button 3 click, with argument set to ++ * current selection and with cwd set to the cwd of the active shell ++ */ ++static char *plumb_cmd = "plumb"; +diff --git a/st.c b/st.c +index 46cf2da..46d7c8a 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 uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; + static Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; + static 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(char *line, char *cmd, 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\n"); + #endif + close(s); +diff --git a/st.h b/st.h +index 38c61c4..1f87287 100644 +--- a/st.h ++++ b/st.h +@@ -110,6 +110,8 @@ void *xmalloc(size_t); + void *xrealloc(void *, size_t); + char *xstrdup(char *); + ++int subprocwd(char *); ++ + /* config.h globals */ + extern char *utmp; + extern char *stty_args; +diff --git a/x.c b/x.c +index 00cb6b1..e03dc71 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> +@@ -635,6 +636,29 @@ xsetsel(char *str) + setsel(str, CurrentTime); + } + ++void ++plumb(char *sel) { ++ if (sel == NULL) ++ return; ++ char cwd[PATH_MAX]; ++ pid_t child; ++ if (subprocwd(cwd) != 0) ++ return; ++ ++ switch(child = fork()) { ++ case -1: ++ return; ++ case 0: ++ if (chdir(cwd) != 0) ++ exit(1); ++ if (execvp(plumb_cmd, (char *const []){plumb_cmd, sel, 0}) == -1) ++ exit(1); ++ exit(0); ++ default: ++ waitpid(child, NULL, 0); ++ } ++} ++ + void + brelease(XEvent *e) + { +@@ -647,6 +671,8 @@ brelease(XEvent *e) + selpaste(NULL); + else if (e->xbutton.button == Button1) + mousesel(e, 1); ++ else if (e->xbutton.button == Button3) ++ plumb(xsel.primary); + } + + void