sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dwm-cool_autostart-6.5.diff (2985B)


      1 diff --git a/config.def.h b/config.def.h
      2 index 9efa774..aba210d 100644
      3 --- a/config.def.h
      4 +++ b/config.def.h
      5 @@ -18,6 +18,11 @@ static const char *colors[][3]      = {
      6  	[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
      7  };
      8  
      9 +static const char *const autostart[] = {
     10 +	"st", NULL,
     11 +	NULL /* terminate */
     12 +};
     13 +
     14  /* tagging */
     15  static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
     16  
     17 diff --git a/dwm.c b/dwm.c
     18 index f1d86b2..3ce99fc 100644
     19 --- a/dwm.c
     20 +++ b/dwm.c
     21 @@ -233,6 +233,7 @@ static int xerror(Display *dpy, XErrorEvent *ee);
     22  static int xerrordummy(Display *dpy, XErrorEvent *ee);
     23  static int xerrorstart(Display *dpy, XErrorEvent *ee);
     24  static void zoom(const Arg *arg);
     25 +static void autostart_exec(void);
     26  
     27  /* variables */
     28  static const char broken[] = "broken";
     29 @@ -274,6 +275,36 @@ static Window root, wmcheckwin;
     30  /* compile-time check if all tags fit into an unsigned int bit array. */
     31  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
     32  
     33 +/* dwm will keep pid's of processes from autostart array and kill them at quit */
     34 +static pid_t *autostart_pids;
     35 +static size_t autostart_len;
     36 +
     37 +/* execute command from autostart array */
     38 +static void
     39 +autostart_exec() {
     40 +	const char *const *p;
     41 +	size_t i = 0;
     42 +
     43 +	/* count entries */
     44 +	for (p = autostart; *p; autostart_len++, p++)
     45 +		while (*++p);
     46 +
     47 +	autostart_pids = malloc(autostart_len * sizeof(pid_t));
     48 +	for (p = autostart; *p; i++, p++) {
     49 +		if ((autostart_pids[i] = fork()) == 0) {
     50 +			setsid();
     51 +			execvp(*p, (char *const *)p);
     52 +			fprintf(stderr, "dwm: execvp %s\n", *p);
     53 +			perror(" failed");
     54 +			_exit(EXIT_FAILURE);
     55 +		}
     56 +		/* skip arguments */
     57 +		while (*++p);
     58 +	}
     59 +}
     60 +
     61 +
     62 +
     63  /* function implementations */
     64  void
     65  applyrules(Client *c)
     66 @@ -1258,6 +1289,16 @@ propertynotify(XEvent *e)
     67  void
     68  quit(const Arg *arg)
     69  {
     70 +	size_t i;
     71 +
     72 +	/* kill child processes */
     73 +	for (i = 0; i < autostart_len; i++) {
     74 +		if (0 < autostart_pids[i]) {
     75 +			kill(autostart_pids[i], SIGTERM);
     76 +			waitpid(autostart_pids[i], NULL, 0);
     77 +		}
     78 +	}
     79 +
     80  	running = 0;
     81  }
     82  
     83 @@ -1543,6 +1584,7 @@ setup(void)
     84  	XSetWindowAttributes wa;
     85  	Atom utf8string;
     86  	struct sigaction sa;
     87 +	pid_t pid;
     88  
     89  	/* do not transform children into zombies when they terminate */
     90  	sigemptyset(&sa.sa_mask);
     91 @@ -1551,7 +1593,21 @@ setup(void)
     92  	sigaction(SIGCHLD, &sa, NULL);
     93  
     94  	/* clean up any zombies (inherited from .xinitrc etc) immediately */
     95 -	while (waitpid(-1, NULL, WNOHANG) > 0);
     96 +	while (0 < (pid = waitpid(-1, NULL, WNOHANG))) {
     97 +		pid_t *p, *lim;
     98 +
     99 +		if (!(p = autostart_pids))
    100 +			continue;
    101 +		lim = &p[autostart_len];
    102 +
    103 +		for (; p < lim; p++) {
    104 +			if (*p == pid) {
    105 +				*p = -1;
    106 +				break;
    107 +			}
    108 +		}
    109 +
    110 +	}
    111  
    112  	/* init screen */
    113  	screen = DefaultScreen(dpy);
    114 @@ -2152,6 +2208,7 @@ main(int argc, char *argv[])
    115  	if (!(dpy = XOpenDisplay(NULL)))
    116  		die("dwm: cannot open display");
    117  	checkotherwm();
    118 +	autostart_exec();
    119  	setup();
    120  #ifdef __OpenBSD__
    121  	if (pledge("stdio rpath proc exec", NULL) == -1)