X-Git-Url: https://ruderich.org/simon/gitweb/?p=wall-notify%2Fwall-notify.git;a=blobdiff_plain;f=src%2Fwall-notify.c;h=40cdfe587870bc46f6ae5cbfc6b8c0308a74d70e;hp=7fb3b33cbc0bdaaf2e7436abf77bd7ca4b8d4fa1;hb=1eb18876bb0eb8f55567dd8a92ab10091d045df7;hpb=d9e9fb8ccfa208052b89aee8cfd3fc6c38752b96 diff --git a/src/wall-notify.c b/src/wall-notify.c index 7fb3b33..40cdfe5 100644 --- a/src/wall-notify.c +++ b/src/wall-notify.c @@ -42,6 +42,10 @@ #ifdef USE_UTMPX # include #endif +#ifndef DONT_USE_X11 +# include +# include +#endif static void sig_handler(int signal) { @@ -290,6 +294,27 @@ static void handle_wall(int fd, char **argv) { pass_buffer_to_program(buffer, (size_t)r, argv); } } +#ifndef DONT_USE_X11 +static void *x11_event_loop_thread(void *unused) { + Display *display; + XEvent event; + + (void)unused; + + pthread_detach(pthread_self()); + + display = XOpenDisplay(NULL); + if (!display) { + fprintf(stderr, "failed to connect to X server\n"); + exit(EXIT_FAILURE); + } + + /* Do nothing. We just want to die if the X11 session is closed. */ + while (1) { + XNextEvent(display, &event); + } +} +#endif static void usage(const char *argv0) { fprintf(stderr, "usage: %s \n", argv0); @@ -333,6 +358,19 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } +#ifndef DONT_USE_X11 + /* Start a thread which connects to X11. This way we die if the user logs + * out of its X11 session. */ + { + pthread_t tid; + + if (pthread_create(&tid, NULL, x11_event_loop_thread, NULL) != 0) { + perror("pthread_create"); + exit(EXIT_FAILURE); + } + } +#endif + /* Cleanup on signals. Necessary before login(). */ setup_signals();