diff options
-rw-r--r-- | src/main.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp index cded01c..0b3035d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,7 @@ #include <unistd.h> #include <signal.h> +#include <sys/socket.h> #include <thread> #include <X11/keysym.h> @@ -38,6 +39,13 @@ static void disable_prime_run() { unsetenv("__VK_LAYER_NV_optimus"); } +static bool is_socket_disconnected(int socket) { + char buf = '\0'; + errno = 0; + const ssize_t bytes_read = recv(socket, &buf, 1, MSG_PEEK | MSG_DONTWAIT); + return bytes_read == 0 || (bytes_read == -1 && (errno == EBADF || errno == ENOTCONN)); +} + int main(void) { setlocale(LC_ALL, "C"); // Sigh... stupid C @@ -122,12 +130,12 @@ int main(void) { // overlay->toggle_stream(); // }); - // const bool replay_hotkey_registered = global_hotkeys.bind_key_press({ XK_F10, ShiftMask | Mod1Mask }, "replay start", [&](const std::string &id) { + // const bool replay_hotkey_registered = global_hotkeys.bind_key_press({ XK_F10, ShiftMask | Mod1Mask }, "replay_start", [&](const std::string &id) { // fprintf(stderr, "pressed %s\n", id.c_str()); // overlay->toggle_replay(); // }); - // const bool replay_save_hotkey_registered = global_hotkeys.bind_key_press({ XK_F10, Mod1Mask }, "replay save", [&](const std::string &id) { + // const bool replay_save_hotkey_registered = global_hotkeys.bind_key_press({ XK_F10, Mod1Mask }, "replay_save", [&](const std::string &id) { // fprintf(stderr, "pressed %s\n", id.c_str()); // overlay->save_replay(); // }); @@ -184,8 +192,15 @@ int main(void) { if(!replay_save_hotkey_registered) fprintf(stderr, "error: failed to register hotkey alt+f10 for saving replay because the hotkey is registered by another program\n"); + const int x11_socket = XConnectionNumber((Display*)context->connection); + mgl::Clock frame_delta_clock; while(running) { + if(is_socket_disconnected(x11_socket)) { + fprintf(stderr, "info: the X11 server has shutdown\n"); + break; + } + const double frame_delta_seconds = frame_delta_clock.get_elapsed_time_seconds(); frame_delta_clock.restart(); gsr::set_frame_delta_seconds(frame_delta_seconds); |