Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.