Introduction
Introduction Statistics Contact Development Disclaimer Help
dwm-cool-autostart-20240312-9f88553.diff - sites - public wiki contents of suck…
git clone git://git.suckless.org/sites
Log
Files
Refs
---
dwm-cool-autostart-20240312-9f88553.diff (3329B)
---
1 From feeaa839d2c6c1d0e66649cb64c4added563d4e4 Mon Sep 17 00:00:00 2001
2 From: Son Phan Trung <[email protected]>
3 Date: Tue, 12 Mar 2024 18:37:32 +0700
4 Subject: [PATCH] patches/cool-autostart: Update patch
5
6 Updated for the removal of the sigchld() function.
7 ---
8 config.def.h | 5 +++++
9 dwm.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++-
10 2 files changed, 61 insertions(+), 1 deletion(-)
11
12 diff --git a/config.def.h b/config.def.h
13 index 9efa774..aba210d 100644
14 --- a/config.def.h
15 +++ b/config.def.h
16 @@ -18,6 +18,11 @@ static const char *colors[][3] = {
17 [SchemeSel] = { col_gray4, col_cyan, col_cyan },
18 };
19
20 +static const char *const autostart[] = {
21 + "st", NULL,
22 + NULL /* terminate */
23 +};
24 +
25 /* tagging */
26 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "…
27
28 diff --git a/dwm.c b/dwm.c
29 index f1d86b2..c2eb07d 100644
30 --- a/dwm.c
31 +++ b/dwm.c
32 @@ -233,6 +233,7 @@ static int xerror(Display *dpy, XErrorEvent *ee);
33 static int xerrordummy(Display *dpy, XErrorEvent *ee);
34 static int xerrorstart(Display *dpy, XErrorEvent *ee);
35 static void zoom(const Arg *arg);
36 +static void autostart_exec(void);
37
38 /* variables */
39 static const char broken[] = "broken";
40 @@ -274,6 +275,34 @@ static Window root, wmcheckwin;
41 /* compile-time check if all tags fit into an unsigned int bit array. */
42 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
43
44 +/* dwm will keep pid's of processes from autostart array and kill them …
45 +static pid_t *autostart_pids;
46 +static size_t autostart_len;
47 +
48 +/* execute command from autostart array */
49 +static void
50 +autostart_exec() {
51 + const char *const *p;
52 + size_t i = 0;
53 +
54 + /* count entries */
55 + for (p = autostart; *p; autostart_len++, p++)
56 + while (*++p);
57 +
58 + autostart_pids = malloc(autostart_len * sizeof(pid_t));
59 + for (p = autostart; *p; i++, p++) {
60 + if ((autostart_pids[i] = fork()) == 0) {
61 + setsid();
62 + execvp(*p, (char *const *)p);
63 + fprintf(stderr, "dwm: execvp %s\n", *p);
64 + perror(" failed");
65 + _exit(EXIT_FAILURE);
66 + }
67 + /* skip arguments */
68 + while (*++p);
69 + }
70 +}
71 +
72 /* function implementations */
73 void
74 applyrules(Client *c)
75 @@ -1258,6 +1287,16 @@ propertynotify(XEvent *e)
76 void
77 quit(const Arg *arg)
78 {
79 + size_t i;
80 +
81 + /* kill child processes */
82 + for (i = 0; i < autostart_len; i++) {
83 + if (0 < autostart_pids[i]) {
84 + kill(autostart_pids[i], SIGTERM);
85 + waitpid(autostart_pids[i], NULL, 0);
86 + }
87 + }
88 +
89 running = 0;
90 }
91
92 @@ -1540,6 +1579,7 @@ void
93 setup(void)
94 {
95 int i;
96 + pid_t pid;
97 XSetWindowAttributes wa;
98 Atom utf8string;
99 struct sigaction sa;
100 @@ -1551,7 +1591,21 @@ setup(void)
101 sigaction(SIGCHLD, &sa, NULL);
102
103 /* clean up any zombies (inherited from .xinitrc etc) immediate…
104 - while (waitpid(-1, NULL, WNOHANG) > 0);
105 + while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
106 + pid_t *p, *lim;
107 +
108 + if (!(p = autostart_pids))
109 + continue;
110 + lim = &p[autostart_len];
111 +
112 + for (; p < lim; p++) {
113 + if (*p == pid) {
114 + *p = -1;
115 + break;
116 + }
117 + }
118 +
119 + }
120
121 /* init screen */
122 screen = DefaultScreen(dpy);
123 @@ -2152,6 +2206,7 @@ main(int argc, char *argv[])
124 if (!(dpy = XOpenDisplay(NULL)))
125 die("dwm: cannot open display");
126 checkotherwm();
127 + autostart_exec();
128 setup();
129 #ifdef __OpenBSD__
130 if (pledge("stdio rpath proc exec", NULL) == -1)
131 --
132 2.44.0
133
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.