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 <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