diff options
| author | Raghuram Subramani <raghus2247@gmail.com> | 2024-09-29 11:29:56 +0530 | 
|---|---|---|
| committer | Raghuram Subramani <raghus2247@gmail.com> | 2024-09-29 11:29:56 +0530 | 
| commit | c4a60d80d19faff202a68c6c3b0ad54762679257 (patch) | |
| tree | e6f5f38d5d9aac9979311405c32c2981427ae2f7 | |
| parent | c6e5f172a23a885c7ac3867d876026287b9cad64 (diff) | |
(patch): autostart.patch
| -rw-r--r-- | config.def.h | 14 | ||||
| -rw-r--r-- | dwl.c | 59 | ||||
| -rw-r--r-- | patches/autostart.patch | 154 | 
3 files changed, 222 insertions, 5 deletions
diff --git a/config.def.h b/config.def.h index 9baccc5..bf9f43e 100644 --- a/config.def.h +++ b/config.def.h @@ -20,6 +20,20 @@ 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", "/etc/nixos/dist/wallpaper.jpg", NULL, +        "/etc/nixos/dist/bar.sh", NULL, +        "way-displays", NULL, +        "dunst", NULL, +        "swayidle", "before-sleep", "swaylock", "lock", "swaylock", NULL, +        "nm-applet", NULL, +        "blueman-applet", NULL, +        "systemctl", "--user", "import-environment", "DISPLAY", "WAYLAND_DISPLAY", NULL, +        NULL +}; + +  /* 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 */ @@ -250,6 +250,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); @@ -430,6 +431,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) @@ -579,6 +583,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)  {  	/* This event is forwarded by the cursor when a pointer emits an axis event, @@ -674,11 +699,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); @@ -1497,18 +1532,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);  	} @@ -2205,6 +2253,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) 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 +  | 
