~ruther/dwl

dd0b8e4c371841761818b1182fcea1e8bd495676 — Devin J. Pohly 3 years ago 7018ed9 + 0ddde0c
Merge pull request #212 from djpohly/xwaitland

make sure to leave XWayland process waitable
1 files changed, 24 insertions(+), 15 deletions(-)

M dwl.c
M dwl.c => dwl.c +24 -15
@@ 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;

Do not follow this link