do not use wl_event_loop for signal handling

ΔSLOC: -4

Fixes: https://github.com/djpohly/dwl/issues/456
Fixes: https://github.com/djpohly/dwl/issues/459
This commit is contained in:
Leonardo Hernández Hernández 2023-07-13 19:36:26 -06:00 committed by Leonardo Hernández
parent 76ba2cdab0
commit ca4a97b933

23
dwl.c
View file

@ -260,7 +260,7 @@ static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg); static void focusstack(const Arg *arg);
static Client *focustop(Monitor *m); static Client *focustop(Monitor *m);
static void fullscreennotify(struct wl_listener *listener, void *data); static void fullscreennotify(struct wl_listener *listener, void *data);
static int handlesig(int signo, void *data); static void handlesig(int signo);
static void incnmaster(const Arg *arg); static void incnmaster(const Arg *arg);
static void inputdevice(struct wl_listener *listener, void *data); static void inputdevice(struct wl_listener *listener, void *data);
static int keybinding(uint32_t mods, xkb_keysym_t sym); static int keybinding(uint32_t mods, xkb_keysym_t sym);
@ -326,8 +326,6 @@ static pid_t child_pid = -1;
static int locked; static int locked;
static void *exclusive_focus; static void *exclusive_focus;
static struct wl_display *dpy; static struct wl_display *dpy;
static struct wl_event_loop *eventloop;
static struct wl_event_source *sighandler[4];
static struct wlr_backend *backend; static struct wlr_backend *backend;
static struct wlr_scene *scene; static struct wlr_scene *scene;
static struct wlr_scene_tree *layers[NUM_LAYERS]; static struct wlr_scene_tree *layers[NUM_LAYERS];
@ -654,7 +652,6 @@ checkidleinhibitor(struct wlr_surface *exclude)
void void
cleanup(void) cleanup(void)
{ {
int i;
#ifdef XWAYLAND #ifdef XWAYLAND
wlr_xwayland_destroy(xwayland); wlr_xwayland_destroy(xwayland);
#endif #endif
@ -671,8 +668,6 @@ cleanup(void)
wlr_cursor_destroy(cursor); wlr_cursor_destroy(cursor);
wlr_output_layout_destroy(output_layout); wlr_output_layout_destroy(output_layout);
wlr_seat_destroy(seat); wlr_seat_destroy(seat);
for (i = 0; i < LENGTH(sighandler); i++)
wl_event_source_remove(sighandler[i]);
wl_display_destroy(dpy); wl_display_destroy(dpy);
} }
@ -826,7 +821,8 @@ createkeyboard(struct wlr_keyboard *keyboard)
wlr_seat_set_keyboard(seat, keyboard); wlr_seat_set_keyboard(seat, keyboard);
kb->key_repeat_source = wl_event_loop_add_timer(eventloop, keyrepeat, kb); kb->key_repeat_source = wl_event_loop_add_timer(
wl_display_get_event_loop(dpy), keyrepeat, kb);
/* And add the keyboard to our list of keyboards */ /* And add the keyboard to our list of keyboards */
wl_list_insert(&keyboards, &kb->link); wl_list_insert(&keyboards, &kb->link);
@ -1338,8 +1334,8 @@ fullscreennotify(struct wl_listener *listener, void *data)
setfullscreen(c, client_wants_fullscreen(c)); setfullscreen(c, client_wants_fullscreen(c));
} }
int void
handlesig(int signo, void *data) handlesig(int signo)
{ {
if (signo == SIGCHLD) { if (signo == SIGCHLD) {
#ifdef XWAYLAND #ifdef XWAYLAND
@ -1357,7 +1353,6 @@ handlesig(int signo, void *data)
} else if (signo == SIGINT || signo == SIGTERM) { } else if (signo == SIGINT || signo == SIGTERM) {
quit(NULL); quit(NULL);
} }
return 0;
} }
void void
@ -2143,13 +2138,15 @@ void
setup(void) setup(void)
{ {
int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE}; int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE};
struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig};
sigemptyset(&sa.sa_mask);
for (i = 0; i < LENGTH(sig); i++)
sigaction(sig[i], &sa, NULL);
/* The Wayland display is managed by libwayland. It handles accepting /* The Wayland display is managed by libwayland. It handles accepting
* clients from the Unix socket, manging Wayland globals, and so on. */ * clients from the Unix socket, manging Wayland globals, and so on. */
dpy = wl_display_create(); dpy = wl_display_create();
eventloop = wl_display_get_event_loop(dpy);
for (i = 0; i < LENGTH(sighandler); i++)
sighandler[i] = wl_event_loop_add_signal(eventloop, sig[i], handlesig, NULL);
/* The backend is a wlroots feature which abstracts the underlying input and /* The backend is a wlroots feature which abstracts the underlying input and
* output hardware. The autocreate option will choose the most suitable * output hardware. The autocreate option will choose the most suitable