st-newterm-20220221-0.8.5.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
st-newterm-20220221-0.8.5.diff (2833B)
---
1 From 063d3eff86c788798d8219a7eb10b39d41f06482 Mon Sep 17 00:00:00 2001
2 From: Santtu Lakkala <inz@inz.fi>
3 Date: Sat, 19 Feb 2022 14:12:02 +0200
4 Subject: [PATCH] Add shortcut to spawn new terminal in the current dir
5
6 Build on bakkeby's doule fork version. Use /proc/self/exe as the binary,
7 and argv[0] as the called name. This allows to have several different
8 st's and running from build tree etc. Also skip the unnecessary readlink
9 part, shell shall do that anyway. Futher mark the pty master as cloexec,
10 so the fd's are not leaked to spawned processes.
11 ---
12 config.def.h | 1 +
13 st.c | 36 ++++++++++++++++++++++++++++++++++++
14 st.h | 1 +
15 3 files changed, 38 insertions(+)
16
17 diff --git a/config.def.h b/config.def.h
18 index 91ab8ca..7c75246 100644
19 --- a/config.def.h
20 +++ b/config.def.h
21 @@ -201,6 +201,7 @@ static Shortcut shortcuts[] = {
22 { TERMMOD, XK_Y, selpaste, {.i = 0} },
23 { ShiftMask, XK_Insert, selpaste, {.i = 0} },
24 { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
25 + { TERMMOD, XK_Return, newterm, {.i = 0} },
26 };
27
28 /*
29 diff --git a/st.c b/st.c
30 index 51049ba..5d435de 100644
31 --- a/st.c
32 +++ b/st.c
33 @@ -20,6 +20,8 @@
34 #include "st.h"
35 #include "win.h"
36
37 +extern char *argv0;
38 +
39 #if defined(__linux)
40 #include <pty.h>
41 #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
42 @@ -153,6 +155,7 @@ typedef struct {
43 } STREscape;
44
45 static void execsh(char *, char **);
46 +static int chdir_by_pid(pid_t pid);
47 static void stty(char **);
48 static void sigchld(int);
49 static void ttywriteraw(const char *, size_t);
50 @@ -813,6 +816,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
51 if (pledge("stdio rpath tty proc", NULL) == -1)
52 die("pledge\n");
53 #endif
54 + fcntl(m, F_SETFD, FD_CLOEXEC);
55 close(s);
56 cmdfd = m;
57 signal(SIGCHLD, sigchld);
58 @@ -1061,6 +1065,38 @@ tswapscreen(void)
59 tfulldirt();
60 }
61
62 +void
63 +newterm(const Arg* a)
64 +{
65 + int res;
66 + switch (fork()) {
67 + case -1:
68 + die("fork failed: %s\n", strerror(errno));
69 + break;
70 + case 0:
71 + switch (fork()) {
72 + case -1:
73 + die("fork failed: %s\n", strerror(errno));
74 + break;
75 + case 0:
76 + chdir_by_pid(pid);
77 + execlp("/proc/self/exe", argv0, NULL);
78 + exit(1);
79 + break;
80 + default:
81 + exit(0);
82 + }
83 + default:
84 + wait(NULL);
85 + }
86 +}
87 +
88 +static int chdir_by_pid(pid_t pid) {
89 + char buf[32];
90 + snprintf(buf, sizeof buf, "/proc/%ld/cwd", (long)pid);
91 + return chdir(buf);
92 +}
93 +
94 void
95 tscrolldown(int orig, int n)
96 {
97 diff --git a/st.h b/st.h
98 index 519b9bd..fbdad18 100644
99 --- a/st.h
100 +++ b/st.h
101 @@ -81,6 +81,7 @@ void die(const char *, ...);
102 void redraw(void);
103 void draw(void);
104
105 +void newterm(const Arg *);
106 void printscreen(const Arg *);
107 void printsel(const Arg *);
108 void sendbreak(const Arg *);
109 --
110 2.32.0
111