123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- From 787f7252d63945996f009828aff3c44afd0f7781 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..8dc6502 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 5bf995e..e8b8727 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);
- @@ -432,6 +433,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)
- @@ -580,6 +584,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)
- {
- @@ -676,11 +701,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);
- }
- @@ -2224,6 +2272,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
|