mirror of
https://github.com/bakkeby/patches
synced 2024-11-13 07:10:31 +00:00
106 lines
2.7 KiB
Diff
106 lines
2.7 KiB
Diff
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
|
|
|