Introduction
Introduction Statistics Contact Development Disclaimer Help
dwm-cool_autostart-6.5.diff - 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", "…
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 …
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) immediate…
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)
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.