From 73cf1b91165b5fcb06a93997af95f6f0cabddc2f Mon Sep 17 00:00:00 2001 From: okan Date: Wed, 27 Dec 2017 17:04:35 +0000 Subject: Use poll and XNextEvent to replace XNextEvent blocking inside the x11 event handler. --- calmwm.c | 14 ++++++++++++-- xevents.c | 14 ++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/calmwm.c b/calmwm.c index df9cbc8..20e3346 100644 --- a/calmwm.c +++ b/calmwm.c @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: calmwm.c,v 1.103 2017/12/22 21:30:01 okan Exp $ + * $OpenBSD: calmwm.c,v 1.104 2017/12/27 17:04:35 okan Exp $ */ #include @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -56,6 +57,7 @@ main(int argc, char **argv) const char *conf_file = NULL; char *conf_path, *display_name = NULL; int ch, xfd; + struct pollfd pfd[1]; struct passwd *pw; if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) @@ -114,8 +116,16 @@ main(int argc, char **argv) if (pledge("stdio rpath proc exec", NULL) == -1) err(1, "pledge"); - while (cwm_status == CWM_RUNNING) + memset(&pfd, 0, sizeof(pfd)); + pfd[0].fd = xfd; + pfd[0].events = POLLIN; + while (cwm_status == CWM_RUNNING) { xev_process(); + if (poll(pfd, 1, INFTIM) == -1) { + if (errno != EINTR) + warn("poll"); + } + } x_teardown(); if (cwm_status == CWM_EXEC_WM) u_exec(Conf.wm_argv); diff --git a/xevents.c b/xevents.c index f2430aa..71411f8 100644 --- a/xevents.c +++ b/xevents.c @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: xevents.c,v 1.128 2017/05/09 18:43:40 okan Exp $ + * $OpenBSD: xevents.c,v 1.129 2017/12/27 17:04:35 okan Exp $ */ /* @@ -436,9 +436,11 @@ xev_process(void) { XEvent e; - XNextEvent(X_Dpy, &e); - if (e.type - Conf.xrandr_event_base == RRScreenChangeNotify) - xev_handle_randr(&e); - else if (e.type < LASTEvent && xev_handlers[e.type] != NULL) - (*xev_handlers[e.type])(&e); + while (XPending(X_Dpy)) { + XNextEvent(X_Dpy, &e); + if (e.type - Conf.xrandr_event_base == RRScreenChangeNotify) + xev_handle_randr(&e); + else if (e.type < LASTEvent && xev_handlers[e.type] != NULL) + (*xev_handlers[e.type])(&e); + } } -- cgit v1.2.3-2-gb3c3