Shutdown if the x11 connection shuts down

This commit is contained in:
dec05eba
2024-11-24 20:09:45 +01:00
parent a008d83514
commit 9b363d3c0d

View File

@@ -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);