sites

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

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:
Mst.suckless.org/patches/newterm/index.md | 8++++++++
Ast.suckless.org/patches/newterm/st-newterm-orphan-20210712-4536f46.diff | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 +