summaryrefslogtreecommitdiff
path: root/dwm/patch/cool_autostart.c
diff options
context:
space:
mode:
authorcoasteen <coasteen@proton.me>2026-07-09 10:42:28 +0330
committercoasteen <coasteen@proton.me>2026-07-09 10:42:28 +0330
commit8cbadb61604667b407b53ee1258433994fa4765a (patch)
tree97765fb29418fd6278fcb4cbb9760893afaf7a58 /dwm/patch/cool_autostart.c
Diffstat (limited to 'dwm/patch/cool_autostart.c')
-rwxr-xr-xdwm/patch/cool_autostart.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/dwm/patch/cool_autostart.c b/dwm/patch/cool_autostart.c
new file mode 100755
index 0000000..848f5ab
--- /dev/null
+++ b/dwm/patch/cool_autostart.c
@@ -0,0 +1,37 @@
+/* dwm will keep pid's of processes from autostart array and kill them at quit */
+static pid_t *autostart_pids;
+static size_t autostart_len;
+
+/* execute command from autostart array */
+static void
+autostart_exec()
+{
+ const char *const *p;
+ struct sigaction sa;
+ size_t i = 0;
+
+ /* count entries */
+ for (p = autostart; *p; autostart_len++, p++)
+ while (*++p);
+
+ autostart_pids = malloc(autostart_len * sizeof(pid_t));
+ for (p = autostart; *p; i++, p++) {
+ if ((autostart_pids[i] = fork()) == 0) {
+ setsid();
+
+ /* Restore SIGCHLD sighandler to default before spawning a program */
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = 0;
+ sa.sa_handler = SIG_DFL;
+ sigaction(SIGCHLD, &sa, NULL);
+
+ execvp(*p, (char *const *)p);
+ fprintf(stderr, "dwm: execvp %s\n", *p);
+ perror(" failed");
+ _exit(EXIT_FAILURE);
+ }
+ /* skip arguments */
+ while (*++p);
+ }
+}
+