diff options
Diffstat (limited to 'patches/autostart.patch')
| -rw-r--r-- | patches/autostart.patch | 154 | 
1 files changed, 154 insertions, 0 deletions
| diff --git a/patches/autostart.patch b/patches/autostart.patch new file mode 100644 index 0000000..0350380 --- /dev/null +++ b/patches/autostart.patch @@ -0,0 +1,154 @@ +From d2829ed5c970c7e7692e39c451526b3860dabb2f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= + <leohdz172@proton.me> +Date: Sat, 8 Jul 2023 17:11:36 -0600 +Subject: [PATCH] port autostart patch from dwm +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://dwm.suckless.org/patches/cool_autostart/ +Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me> +--- + config.def.h |  7 +++++++ + dwl.c        | 59 +++++++++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 61 insertions(+), 5 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 22d2171..1d0f935 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -20,6 +20,13 @@ static const float fullscreen_bg[]         = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca + /* logging */ + static int log_level = WLR_ERROR; +  ++/* Autostart */ ++static const char *const autostart[] = { ++        "wbg", "/path/to/your/image", NULL, ++        NULL /* terminate */ ++}; ++ ++ + /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ + static const Rule rules[] = { + 	/* app_id             title       tags mask     isfloating   monitor */ +diff --git a/dwl.c b/dwl.c +index 00e9cc1e..5de32831 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -249,6 +249,7 @@ static void arrange(Monitor *m); + static void arrangelayer(Monitor *m, struct wl_list *list, + 		struct wlr_box *usable_area, int exclusive); + static void arrangelayers(Monitor *m); ++static void autostartexec(void); + static void axisnotify(struct wl_listener *listener, void *data); + static void buttonpress(struct wl_listener *listener, void *data); + static void chvt(const Arg *arg); +@@ -429,6 +430,9 @@ static xcb_atom_t netatom[NetLast]; + /* attempt to encapsulate suck into one file */ + #include "client.h" +  ++static pid_t *autostart_pids; ++static size_t autostart_len; ++ + /* function implementations */ + void + applybounds(Client *c, struct wlr_box *bbox) +@@ -577,6 +581,27 @@ arrangelayers(Monitor *m) + 	} + } +  ++void ++autostartexec(void) { ++	const char *const *p; ++	size_t i = 0; ++ ++	/* count entries */ ++	for (p = autostart; *p; autostart_len++, p++) ++		while (*++p); ++ ++	autostart_pids = calloc(autostart_len, sizeof(pid_t)); ++	for (p = autostart; *p; i++, p++) { ++		if ((autostart_pids[i] = fork()) == 0) { ++			setsid(); ++			execvp(*p, (char *const *)p); ++			die("dwl: execvp %s:", *p); ++		} ++		/* skip arguments */ ++		while (*++p); ++	} ++} ++ + void + axisnotify(struct wl_listener *listener, void *data) + { +@@ -672,11 +697,21 @@ checkidleinhibitor(struct wlr_surface *exclude) + void + cleanup(void) + { ++	size_t i; + #ifdef XWAYLAND + 	wlr_xwayland_destroy(xwayland); + 	xwayland = NULL; + #endif + 	wl_display_destroy_clients(dpy); ++ ++	/* kill child processes */ ++	for (i = 0; i < autostart_len; i++) { ++		if (0 < autostart_pids[i]) { ++			kill(autostart_pids[i], SIGTERM); ++			waitpid(autostart_pids[i], NULL, 0); ++		} ++	} ++ + 	if (child_pid > 0) { + 		kill(-child_pid, SIGTERM); + 		waitpid(child_pid, NULL, 0); +@@ -1438,18 +1473,31 @@ void + handlesig(int signo) + { + 	if (signo == SIGCHLD) { +-#ifdef XWAYLAND + 		siginfo_t in; + 		/* wlroots expects to reap the XWayland process itself, so we + 		 * use WNOWAIT to keep the child waitable until we know it's not + 		 * XWayland. + 		 */ + 		while (!waitid(P_ALL, 0, &in, WEXITED|WNOHANG|WNOWAIT) && in.si_pid +-				&& (!xwayland || in.si_pid != xwayland->server->pid)) +-			waitpid(in.si_pid, NULL, 0); +-#else +-		while (waitpid(-1, NULL, WNOHANG) > 0); ++#ifdef XWAYLAND ++			   && (!xwayland || in.si_pid != xwayland->server->pid) + #endif ++			   ) { ++			pid_t *p, *lim; ++			waitpid(in.si_pid, NULL, 0); ++			if (in.si_pid == child_pid) ++				child_pid = -1; ++			if (!(p = autostart_pids)) ++				continue; ++			lim = &p[autostart_len]; ++ ++			for (; p < lim; p++) { ++				if (*p == in.si_pid) { ++					*p = -1; ++					break; ++				} ++			} ++		} + 	} else if (signo == SIGINT || signo == SIGTERM) { + 		quit(NULL); + 	} +@@ -2169,6 +2217,7 @@ run(char *startup_cmd) + 		die("startup: backend_start"); +  + 	/* Now that the socket exists and the backend is started, run the startup command */ ++	autostartexec(); + 	if (startup_cmd) { + 		int piperw[2]; + 		if (pipe(piperw) < 0) +--  +2.45.2 + | 
