st-newterm-0.9.diff (2756B)
1 From e1cf625f4f225a007a5835421896089669195e02 Mon Sep 17 00:00:00 2001 2 From: meator <meator.dev@gmail.com> 3 Date: Wed, 26 Oct 2022 13:05:38 +0200 4 Subject: [PATCH] Add shortcut to spawn new terminal in the current dir 5 6 This commit is inspired by Santtu's st-newterm-20220221-0.8.5.diff. It 7 removes the unused res variable, it makes use of _exit() instead of 8 exit() and it replaces execlp() with execl() (PATH searching is useless 9 when the path is absolute). 10 --- 11 config.def.h | 1 + 12 st.c | 38 ++++++++++++++++++++++++++++++++++++++ 13 st.h | 1 + 14 3 files changed, 40 insertions(+) 15 16 diff --git a/config.def.h b/config.def.h 17 index 91ab8ca..7c75246 100644 18 --- a/config.def.h 19 +++ b/config.def.h 20 @@ -201,6 +201,7 @@ static Shortcut shortcuts[] = { 21 { TERMMOD, XK_Y, selpaste, {.i = 0} }, 22 { ShiftMask, XK_Insert, selpaste, {.i = 0} }, 23 { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, 24 + { TERMMOD, XK_Return, newterm, {.i = 0} }, 25 }; 26 27 /* 28 diff --git a/st.c b/st.c 29 index 62def59..0261283 100644 30 --- a/st.c 31 +++ b/st.c 32 @@ -20,6 +20,8 @@ 33 #include "st.h" 34 #include "win.h" 35 36 +extern char *argv0; 37 + 38 #if defined(__linux) 39 #include <pty.h> 40 #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) 41 @@ -153,6 +155,7 @@ typedef struct { 42 } STREscape; 43 44 static void execsh(char *, char **); 45 +static int chdir_by_pid(pid_t pid); 46 static void stty(char **); 47 static void sigchld(int); 48 static void ttywriteraw(const char *, size_t); 49 @@ -806,6 +809,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args) 50 if (pledge("stdio rpath tty proc", NULL) == -1) 51 die("pledge\n"); 52 #endif 53 + fcntl(m, F_SETFD, FD_CLOEXEC); 54 close(s); 55 cmdfd = m; 56 signal(SIGCHLD, sigchld); 57 @@ -1054,6 +1058,40 @@ tswapscreen(void) 58 tfulldirt(); 59 } 60 61 +void 62 +newterm(const Arg* a) 63 +{ 64 + switch (fork()) { 65 + case -1: 66 + die("fork failed: %s\n", strerror(errno)); 67 + break; 68 + case 0: 69 + switch (fork()) { 70 + case -1: 71 + fprintf(stderr, "fork failed: %s\n", strerror(errno)); 72 + _exit(1); 73 + break; 74 + case 0: 75 + chdir_by_pid(pid); 76 + execl("/proc/self/exe", argv0, NULL); 77 + _exit(1); 78 + break; 79 + default: 80 + _exit(0); 81 + } 82 + default: 83 + wait(NULL); 84 + } 85 +} 86 + 87 +static int 88 +chdir_by_pid(pid_t pid) 89 +{ 90 + char buf[32]; 91 + snprintf(buf, sizeof buf, "/proc/%ld/cwd", (long)pid); 92 + return chdir(buf); 93 +} 94 + 95 void 96 tscrolldown(int orig, int n) 97 { 98 diff --git a/st.h b/st.h 99 index fd3b0d8..f2b03b0 100644 100 --- a/st.h 101 +++ b/st.h 102 @@ -81,6 +81,7 @@ void die(const char *, ...); 103 void redraw(void); 104 void draw(void); 105 106 +void newterm(const Arg *); 107 void printscreen(const Arg *); 108 void printsel(const Arg *); 109 void sendbreak(const Arg *); 110 -- 111 2.38.0 112