diff options
author | Devin J. Pohly <djpohly@gmail.com> | 2022-03-29 16:22:44 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-29 16:22:44 -0500 |
commit | dd0b8e4c371841761818b1182fcea1e8bd495676 (patch) | |
tree | c7f5d3d40b1ac405b7d1b8efbb87ddd5eb4f94e3 | |
parent | 7018ed9218b05e15d191adcae04167f9d6fc8bce (diff) | |
parent | 0ddde0c85a46370759e85f3437e3475b569d5c41 (diff) |
Merge pull request #212 from djpohly/xwaitland
make sure to leave XWayland process waitable
-rw-r--r-- | dwl.c | 39 |
1 files changed, 24 insertions, 15 deletions
@@ -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; |