From a7eedc85e0609177cdb1ed3f6203fa37e6420012 Mon Sep 17 00:00:00 2001
From: Matias Lang <yo@matiaslang.me>
Date: Wed, 17 Jul 2019 01:10:44 -0300
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
---
 config.h |  1 +
 st.c         | 21 +++++++++++++++++++++
 st.h         |  1 +
 3 files changed, 23 insertions(+)

diff --git a/config.h b/config.h
index 0e01717..31f26d8 100644
--- a/config.h
+++ b/config.h
@@ -178,6 +178,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 b8e6077..044e29b 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);
@@ -1059,6 +1060,26 @@ tswapscreen(void)
 	tfulldirt();
 }
 
+void
+newterm(const Arg* a)
+{
+	switch (fork()) {
+	case -1:
+		die("fork failed: %s\n", strerror(errno));
+		break;
+	case 0:
+		chdir(getcwd_by_pid(pid));
+		execlp("st", "./st", NULL);
+		break;
+	}
+}
+
+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 38c61c4..54d4a43 100644
--- a/st.h
+++ b/st.h
@@ -80,6 +80,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.19.2