commit 5ceb2670fea749bf8d87474e860cbac01766b484
parent b28caeee01e20ada2db8b853e96755c43cbb01d8
Author: bakkeby <bakkeby@gmail.com>
Date: Mon, 26 Jul 2021 11:42:11 +0200
[st][patch][newterm] Added orphan variant of the newterm patch
Diffstat:
2 files changed, 113 insertions(+), 0 deletions(-)
diff --git a/st.suckless.org/patches/newterm/index.md b/st.suckless.org/patches/newterm/index.md
@@ -7,11 +7,19 @@ will have the same CWD (current working directory) as the original st instance.
The `getcwd_by_pid` function is inspired on [the function with the same name of
dvtm](https://github.com/martanne/dvtm/blob/master/dvtm.c#L1036).
+By default the current st terminal will be the parent process of the new terminal.
+This can conflict with the swallow patch for dwm and can result in the wrong st
+terminal window being swallowd. The orphan variant of this patch works around this
+issue by spawning the new terminal window as an orphan instead (meaning that it
+will have no parent process).
+
Download
--------
* [st-newterm-0.8.2.diff](st-newterm-0.8.2.diff)
+* [st-newterm-orphan-20210712-4536f46.diff](st-newterm-orphan-20210712-4536f46.diff)
Authors
-------
* MatÃas Lang
+* Stein Bakkeby (orphan version)
diff --git a/st.suckless.org/patches/newterm/st-newterm-orphan-20210712-4536f46.diff b/st.suckless.org/patches/newterm/st-newterm-orphan-20210712-4536f46.diff
@@ -0,0 +1,105 @@
+From e6ac257f362f8b879b62225bedca9e8aafef4f3b Mon Sep 17 00:00:00 2001
+From: bakkeby <bakkeby@gmail.com>
+Date: Mon, 12 Jul 2021 09:35:04 +0200
+Subject: [PATCH] Add shortcut to spawn new terminal in the current dir
+
+Ctrl-Shift-Return now creates a new ST terminal, whose CWD is the same
+as the parent st's CWD.
+
+This version of the patch does a double fork, a technique commonly used
+by daemons to spawn orphan processes.
+
+This solution is specific to the swallow patch for dwm which traverses
+the process tree to determine if the new window is a decendant of a
+terminal window, in which case the new window should take the place of
+the terminal window.
+
+The way the original newterm patch worked the new st terminal would be
+a direct decendant of the parent st terminal process, which could lead
+to the wrong terminal window being swallowed.
+
+The double fork method avoids this by leaving all new st terminals as
+orphans, i.e. they will have no parent process.
+---
+ config.def.h | 1 +
+ st.c | 32 ++++++++++++++++++++++++++++++++
+ st.h | 1 +
+ 3 files changed, 34 insertions(+)
+
+diff --git a/config.def.h b/config.def.h
+index 6f05dce..9029e8d 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -199,6 +199,7 @@ static Shortcut shortcuts[] = {
+ { TERMMOD, XK_Y, selpaste, {.i = 0} },
+ { ShiftMask, XK_Insert, selpaste, {.i = 0} },
+ { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
++ { TERMMOD, XK_Return, newterm, {.i = 0} },
+ };
+
+ /*
+diff --git a/st.c b/st.c
+index ebdf360..cb79bc0 100644
+--- a/st.c
++++ b/st.c
+@@ -153,6 +153,7 @@ typedef struct {
+ } STREscape;
+
+ static void execsh(char *, char **);
++static char *getcwd_by_pid(pid_t pid);
+ static void stty(char **);
+ static void sigchld(int);
+ static void ttywriteraw(const char *, size_t);
+@@ -1060,6 +1061,37 @@ tswapscreen(void)
+ tfulldirt();
+ }
+
++void
++newterm(const Arg* a)
++{
++ int res;
++ switch (fork()) {
++ case -1:
++ die("fork failed: %s\n", strerror(errno));
++ break;
++ case 0:
++ switch (fork()) {
++ case -1:
++ die("fork failed: %s\n", strerror(errno));
++ break;
++ case 0:
++ res = chdir(getcwd_by_pid(pid));
++ execlp("st", "./st", NULL);
++ break;
++ default:
++ exit(0);
++ }
++ default:
++ wait(NULL);
++ }
++}
++
++static char *getcwd_by_pid(pid_t pid) {
++ char buf[32];
++ snprintf(buf, sizeof buf, "/proc/%d/cwd", pid);
++ return realpath(buf, NULL);
++}
++
+ void
+ tscrolldown(int orig, int n)
+ {
+diff --git a/st.h b/st.h
+index fa2eddf..b13399b 100644
+--- a/st.h
++++ b/st.h
+@@ -81,6 +81,7 @@ void die(const char *, ...);
+ void redraw(void);
+ void draw(void);
+
++void newterm(const Arg *);
+ void printscreen(const Arg *);
+ void printsel(const Arg *);
+ void sendbreak(const Arg *);
+--
+2.32.0
+