commit 97988681134630a84c9824d83027d0f429d427e8
parent 953e60e96aca92491703ff1cb6aec33f91c0e945
Author: parazyd <parazyd@dyne.org>
Date: Tue, 26 Apr 2022 20:45:45 +0200
plumb selected text with right click
Diffstat:
4 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -476,3 +476,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 be the cwd of the active shell
+ */
+static char *plumb_cmd = "/usr/local/bin/plumber";
diff --git a/st.c b/st.c
@@ -232,6 +232,15 @@ 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 (snprintf(path, PATH_MAX, "/proc/%d/cwd", pid) < 0)
+ return -1;
+
+ return 0;
+}
+
ssize_t
xwrite(int fd, const char *s, size_t len)
{
diff --git 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
@@ -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>
@@ -721,6 +722,31 @@ xsetsel(char *str)
}
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)
{
int btn = e->xbutton.button;
@@ -737,6 +763,8 @@ brelease(XEvent *e)
return;
if (btn == Button1)
mousesel(e, 1);
+ else if (btn == Button3)
+ plumb(xsel.primary);
}
void