simple_plumb.diff - sites - public wiki contents of suckless.org
HTML git clone git://git.suckless.org/sites
DIR Log
DIR Files
DIR Refs
---
simple_plumb.diff (3265B)
---
1 diff --git a/config.def.h b/config.def.h
2 index 546edda..df14610 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -457,3 +457,9 @@ static char ascii_printable[] =
6 " !\"#$%&'()*+,-./0123456789:;<=>?"
7 "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
8 "`abcdefghijklmnopqrstuvwxyz{|}~";
9 +
10 +/*
11 + * plumb_cmd is run on mouse button 3 click, with first NULL set to
12 + * current selection and with cwd set to the cwd of the active shell
13 + */
14 +static char *plumb_cmd[] = {"plumb", "-m", NULL, NULL};
15 diff --git a/st.c b/st.c
16 index 3e48410..11dda7b 100644
17 --- a/st.c
18 +++ b/st.c
19 @@ -27,6 +27,9 @@
20 #elif defined(__FreeBSD__) || defined(__DragonFly__)
21 #include <libutil.h>
22 #endif
23 +#if defined(__OpenBSD__)
24 + #include <sys/sysctl.h>
25 +#endif
26
27 /* Arbitrary sizes */
28 #define UTF_INVALID 0xFFFD
29 @@ -232,6 +235,22 @@ static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
30 static Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
31 static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
32
33 +int
34 +subprocwd(char *path)
35 +{
36 +#if defined(__linux)
37 + if (snprintf(path, PATH_MAX, "/proc/%d/cwd", pid) < 0)
38 + return -1;
39 + return 0;
40 +#elif defined(__OpenBSD__)
41 + size_t sz = PATH_MAX;
42 + int name[3] = {CTL_KERN, KERN_PROC_CWD, pid};
43 + if (sysctl(name, 3, path, &sz, 0, 0) == -1)
44 + return -1;
45 + return 0;
46 +#endif
47 +}
48 +
49 ssize_t
50 xwrite(int fd, const char *s, size_t len)
51 {
52 @@ -799,7 +818,7 @@ ttynew(char *line, char *cmd, char *out, char **args)
53 break;
54 default:
55 #ifdef __OpenBSD__
56 - if (pledge("stdio rpath tty proc", NULL) == -1)
57 + if (pledge("stdio rpath tty proc ps exec", NULL) == -1)
58 die("pledge\n");
59 #endif
60 close(s);
61 diff --git a/st.h b/st.h
62 index a1928ca..4f5abc4 100644
63 --- a/st.h
64 +++ b/st.h
65 @@ -111,6 +111,8 @@ void *xmalloc(size_t);
66 void *xrealloc(void *, size_t);
67 char *xstrdup(char *);
68
69 +int subprocwd(char *);
70 +
71 /* config.h globals */
72 extern char *utmp;
73 extern char *stty_args;
74 diff --git a/x.c b/x.c
75 index e5f1737..cc58642 100644
76 --- a/x.c
77 +++ b/x.c
78 @@ -5,6 +5,7 @@
79 #include <locale.h>
80 #include <signal.h>
81 #include <sys/select.h>
82 +#include <sys/wait.h>
83 #include <time.h>
84 #include <unistd.h>
85 #include <libgen.h>
86 @@ -216,6 +217,7 @@ static void (*handler[LASTEvent])(XEvent *) = {
87 };
88
89 /* Globals */
90 +static int plumbsel;
91 static DC dc;
92 static XWindow xw;
93 static XSelection xsel;
94 @@ -681,6 +683,37 @@ xsetsel(char *str)
95 setsel(str, CurrentTime);
96 }
97
98 +void
99 +plumbinit()
100 +{
101 + for(plumbsel = 0; plumb_cmd[plumbsel]; plumbsel++);
102 +}
103 +
104 +void
105 +plumb(char *sel) {
106 + if (sel == NULL)
107 + return;
108 + char cwd[PATH_MAX];
109 + pid_t child;
110 + if (subprocwd(cwd) != 0)
111 + return;
112 +
113 + plumb_cmd[plumbsel] = sel;
114 +
115 + switch(child = fork()) {
116 + case -1:
117 + return;
118 + case 0:
119 + if (chdir(cwd) != 0)
120 + exit(1);
121 + if (execvp(plumb_cmd[0], plumb_cmd) == -1)
122 + exit(1);
123 + exit(0);
124 + default:
125 + waitpid(child, NULL, 0);
126 + }
127 +}
128 +
129 void
130 brelease(XEvent *e)
131 {
132 @@ -693,6 +726,8 @@ brelease(XEvent *e)
133 return;
134 if (e->xbutton.button == Button1)
135 mousesel(e, 1);
136 + else if (e->xbutton.button == Button3)
137 + plumb(xsel.primary);
138 }
139
140 void
141 @@ -2035,6 +2070,7 @@ main(int argc, char *argv[])
142 } ARGEND;
143
144 run:
145 + plumbinit();
146 if (argc > 0) /* eat all remaining arguments */
147 opt_cmd = argv;
148