aboutsummaryrefslogtreecommitdiff
path: root/dwl.c
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2022-03-29 16:22:44 -0500
committerGitHub <noreply@github.com>2022-03-29 16:22:44 -0500
commitdd0b8e4c371841761818b1182fcea1e8bd495676 (patch)
treec7f5d3d40b1ac405b7d1b8efbb87ddd5eb4f94e3 /dwl.c
parent7018ed9218b05e15d191adcae04167f9d6fc8bce (diff)
parent0ddde0c85a46370759e85f3437e3475b569d5c41 (diff)
Merge pull request #212 from djpohly/xwaitland
make sure to leave XWayland process waitable
Diffstat (limited to 'dwl.c')
-rw-r--r--dwl.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/dwl.c b/dwl.c
index 3f66be4..ae5ed93 100644
--- a/dwl.c
+++ b/dwl.c
@@ -258,7 +258,6 @@ static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setmon(Client *c, Monitor *m, unsigned int newtags);
static void setup(void);
-static void sigchld(int unused);
static void spawn(const Arg *arg);
static void startdrag(struct wl_listener *listener, void *data);
static void tag(const Arg *arg);
@@ -341,6 +340,7 @@ static void activatex11(struct wl_listener *listener, void *data);
static void configurex11(struct wl_listener *listener, void *data);
static void createnotifyx11(struct wl_listener *listener, void *data);
static Atom getatom(xcb_connection_t *xc, const char *name);
+static void sigchld(int unused);
static void xwaylandready(struct wl_listener *listener, void *data);
static struct wl_listener new_xwayland_surface = {.notify = createnotifyx11};
static struct wl_listener xwayland_ready = {.notify = xwaylandready};
@@ -1762,7 +1762,11 @@ setup(void)
dpy = wl_display_create();
/* Set up signal handlers */
+#ifdef XWAYLAND
sigchld(0);
+#else
+ signal(SIGCHLD, SIG_IGN);
+#endif
signal(SIGINT, quitsignal);
signal(SIGTERM, quitsignal);
@@ -1923,20 +1927,6 @@ setup(void)
}
void
-sigchld(int unused)
-{
- /* We should be able to remove this function in favor of a simple
- * signal(SIGCHLD, SIG_IGN);
- * but the Xwayland implementation in wlroots currently prevents us from
- * setting our own disposition for SIGCHLD.
- */
- if (signal(SIGCHLD, sigchld) == SIG_ERR)
- EBARF("can't install SIGCHLD handler");
- while (0 < waitpid(-1, NULL, WNOHANG))
- ;
-}
-
-void
spawn(const Arg *arg)
{
if (fork() == 0) {
@@ -2313,6 +2303,25 @@ getatom(xcb_connection_t *xc, const char *name)
}
void
+sigchld(int unused)
+{
+ siginfo_t in;
+ /* We should be able to remove this function in favor of a simple
+ * signal(SIGCHLD, SIG_IGN);
+ * but the Xwayland implementation in wlroots currently prevents us from
+ * setting our own disposition for SIGCHLD.
+ */
+ if (signal(SIGCHLD, sigchld) == SIG_ERR)
+ EBARF("can't install SIGCHLD handler");
+ /* WNOWAIT leaves the child in a waitable state, in case this is the
+ * XWayland process
+ */
+ while (!waitid(P_ALL, 0, &in, WEXITED|WNOHANG|WNOWAIT) && in.si_pid
+ && in.si_pid != xwayland->server->pid)
+ waitpid(in.si_pid, NULL, 0);
+}
+
+void
xwaylandready(struct wl_listener *listener, void *data)
{
struct wlr_xcursor *xcursor;