linux-qubasis

linux oasis port as a qubes template

git clone https://9o.is/git/linux-qubasis.git

0003-Add-support-for-plumbing-via-right-click.patch

(3818B)


      1 From 85a6bb6ba81de493c0ceb9a8d4c2f78eb5d1567f Mon Sep 17 00:00:00 2001
      2 From: Michael Forney <mforney@mforney.org>
      3 Date: Wed, 2 Dec 2020 17:54:35 -0800
      4 Subject: [PATCH] Add support for plumbing via right click
      5 
      6 ---
      7  config.def.h |  5 ++++
      8  st.c         | 79 ++++++++++++++++++++++++++++++++++++++++++++--------
      9  2 files changed, 72 insertions(+), 12 deletions(-)
     10 
     11 diff --git a/config.def.h b/config.def.h
     12 index 49ca50b..a63d2be 100644
     13 --- a/config.def.h
     14 +++ b/config.def.h
     15 @@ -460,3 +460,8 @@ static char ascii_printable[] =
     16  	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
     17  	"`abcdefghijklmnopqrstuvwxyz{|}~";
     18  
     19 +/*
     20 + * plumb_cmd is run on mouse button 3 click, with first NULL set to
     21 + * current selection and with cwd set to the cwd of the active shell
     22 + */
     23 +static char *plumb_cmd[] = {"plumb", NULL, NULL};
     24 diff --git a/st.c b/st.c
     25 index 20a3c3c..914fdd5 100644
     26 --- a/st.c
     27 +++ b/st.c
     28 @@ -44,6 +44,9 @@ char *argv0;
     29  #elif defined(__FreeBSD__) || defined(__DragonFly__)
     30   #include <libutil.h>
     31  #endif
     32 +#if defined(__OpenBSD__)
     33 + #include <sys/sysctl.h>
     34 +#endif
     35  
     36  
     37  /* Arbitrary sizes */
     38 @@ -558,6 +561,8 @@ static void *xmalloc(size_t);
     39  static void *xrealloc(void *, size_t);
     40  static char *xstrdup(char *);
     41  
     42 +static int subprocwd(char *, size_t);
     43 +
     44  static void usage(void);
     45  
     46  static struct wl_registry_listener reglistener = { regglobal, regglobalremove };
     47 @@ -579,6 +584,7 @@ static struct wl_data_source_listener datasrclistener =
     48  	{ datasrctarget, datasrcsend, datasrccancelled };
     49  
     50  /* Globals */
     51 +static int plumbsel;
     52  static DC dc;
     53  static Wayland wl;
     54  static WLD wld;
     55 @@ -763,6 +769,21 @@ utf8validate(Rune *u, size_t i)
     56  	return i;
     57  }
     58  
     59 +int
     60 +subprocwd(char *path, size_t len)
     61 +{
     62 +#if defined(__linux__)
     63 +	if (snprintf(path, len, "/proc/%d/cwd", pid) < 0)
     64 +		return -1;
     65 +	return 0;
     66 +#elif defined(__OpenBSD__)
     67 +	int name[3] = {CTL_KERN, KERN_PROC_CWD, pid};
     68 +	if (sysctl(name, 3, path, &len, 0, 0) == -1)
     69 +		return -1;
     70 +	return 0;
     71 +#endif
     72 +}
     73 +
     74  void
     75  selinit(void)
     76  {
     77 @@ -1165,6 +1186,29 @@ wlsetsel(char *str, uint32_t serial)
     78  	wl_data_device_set_selection(wl.datadev, sel.source, serial);
     79  }
     80  
     81 +void
     82 +plumbinit(void)
     83 +{
     84 +	for (plumbsel = 0; plumb_cmd[plumbsel]; ++plumbsel)
     85 +		;
     86 +}
     87 +
     88 +void
     89 +plumb(char *sel)
     90 +{
     91 +	char cwd[PATH_MAX];
     92 +
     93 +	if (!sel || subprocwd(cwd, sizeof(cwd)) != 0)
     94 +		return;
     95 +	plumb_cmd[plumbsel] = sel;
     96 +
     97 +	if (fork() == 0) {
     98 +		if (chdir(cwd) == 0)
     99 +			execvp(plumb_cmd[0], plumb_cmd);
    100 +		_exit(1);
    101 +	}
    102 +}
    103 +
    104  void
    105  die(const char *errstr, ...)
    106  {
    107 @@ -1227,15 +1271,18 @@ sigchld(int a)
    108  	int stat;
    109  	pid_t p;
    110  
    111 -	if ((p = waitpid(pid, &stat, WNOHANG)) < 0)
    112 -		die("Waiting for pid %hd failed: %s\n", pid, strerror(errno));
    113 -
    114 -	if (pid != p)
    115 -		return;
    116 -
    117 -	if (!WIFEXITED(stat) || WEXITSTATUS(stat))
    118 -		die("child finished with error '%d'\n", stat);
    119 -	exit(0);
    120 +	for (;;) {
    121 +		p = waitpid(-1, &stat, WNOHANG);
    122 +		if (p == 0)
    123 +			break;
    124 +		if (p < 0)
    125 +			die("waitpid: %s\n", strerror(errno));
    126 +		if (pid == p) {
    127 +			if (!WIFEXITED(stat) || WEXITSTATUS(stat))
    128 +				die("child finished with error '%d'\n", stat);
    129 +			exit(0);
    130 +		}
    131 +	}
    132  }
    133  
    134  
    135 @@ -4224,16 +4271,23 @@ ptrbutton(void * data, struct wl_pointer * pointer, uint32_t serial,
    136  
    137  	switch (state) {
    138  	case WL_POINTER_BUTTON_STATE_RELEASED:
    139 -		if (button == BTN_MIDDLE) {
    140 +		switch (button) {
    141 +		case BTN_MIDDLE:
    142  			selpaste(NULL);
    143 -		} else if (button == BTN_LEFT) {
    144 +			break;
    145 +		case BTN_LEFT:
    146  			if (sel.mode == SEL_READY) {
    147  				getbuttoninfo();
    148  				selcopy(serial);
    149 -			} else
    150 +			} else {
    151  				selclear();
    152 +			}
    153  			sel.mode = SEL_IDLE;
    154  			tsetdirt(sel.nb.y, sel.ne.y);
    155 +			break;
    156 +		case BTN_RIGHT:
    157 +			plumb(sel.primary);
    158 +			break;
    159  		}
    160  		break;
    161  
    162 @@ -4557,6 +4611,7 @@ main(int argc, char *argv[])
    163  	} ARGEND;
    164  
    165  run:
    166 +	plumbinit();
    167  	if (argc > 0) {
    168  		/* eat all remaining arguments */
    169  		opt_cmd = argv;
    170 -- 
    171 2.37.3
    172