st-newterm-0.9.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
st-newterm-0.9.diff (2756B) | |
--- | |
1 From e1cf625f4f225a007a5835421896089669195e02 Mon Sep 17 00:00:00 2001 | |
2 From: meator <[email protected]> | |
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 = … | |
22 { ShiftMask, XK_Insert, selpaste, {.i = … | |
23 { TERMMOD, XK_Num_Lock, numlock, {.i = … | |
24 + { TERMMOD, XK_Return, newterm, {.i = … | |
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,… | |
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(e… | |
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 |