patch: newterm

This commit is contained in:
frosty 2024-08-19 22:56:16 +00:00
parent 57a0ed774d
commit 4d63ceec5f
3 changed files with 40 additions and 0 deletions

View file

@ -226,6 +226,7 @@ static Shortcut shortcuts[] = {
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
{ XK_NO_MOD, XK_F11, fullscreen, {.i = 0} }, { XK_NO_MOD, XK_F11, fullscreen, {.i = 0} },
{ MODKEY, XK_Return, fullscreen, {.i = 0} }, { MODKEY, XK_Return, fullscreen, {.i = 0} },
{ TERMMOD, XK_Return, newterm, {.i = 0} },
}; };
/* /*

38
st.c
View file

@ -20,6 +20,8 @@
#include "st.h" #include "st.h"
#include "win.h" #include "win.h"
extern char *argv0;
#if defined(__linux) #if defined(__linux)
#include <pty.h> #include <pty.h>
#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
@ -166,6 +168,7 @@ typedef struct {
} STREscape; } STREscape;
static void execsh(char *, char **); static void execsh(char *, char **);
static int chdir_by_pid(pid_t pid);
static void stty(char **); static void stty(char **);
static void sigchld(int); static void sigchld(int);
static void ttywriteraw(const char *, size_t); static void ttywriteraw(const char *, size_t);
@ -822,6 +825,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
if (pledge("stdio rpath tty proc", NULL) == -1) if (pledge("stdio rpath tty proc", NULL) == -1)
die("pledge\n"); die("pledge\n");
#endif #endif
fcntl(m, F_SETFD, FD_CLOEXEC);
close(s); close(s);
cmdfd = m; cmdfd = m;
signal(SIGCHLD, sigchld); signal(SIGCHLD, sigchld);
@ -1116,6 +1120,40 @@ kscrolldown(const Arg *a)
tfulldirt(); tfulldirt();
} }
void
newterm(const Arg* a)
{
switch (fork()) {
case -1:
die("fork failed: %s\n", strerror(errno));
break;
case 0:
switch (fork()) {
case -1:
fprintf(stderr, "fork failed: %s\n", strerror(errno));
_exit(1);
break;
case 0:
chdir_by_pid(pid);
execl("/proc/self/exe", argv0, NULL);
_exit(1);
break;
default:
_exit(0);
}
default:
wait(NULL);
}
}
static int
chdir_by_pid(pid_t pid)
{
char buf[32];
snprintf(buf, sizeof buf, "/proc/%ld/cwd", (long)pid);
return chdir(buf);
}
void void
tscrolldown(int orig, int n) tscrolldown(int orig, int n)
{ {

1
st.h
View file

@ -90,6 +90,7 @@ void redraw(void);
void draw(void); void draw(void);
void fullscreen(const Arg *); void fullscreen(const Arg *);
void newterm(const Arg *);
void printscreen(const Arg *); void printscreen(const Arg *);
void printsel(const Arg *); void printsel(const Arg *);
void sendbreak(const Arg *); void sendbreak(const Arg *);