From 2fa0da47ab73f1e4cdb52518c2df762fc7e57312 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Tue, 5 Mar 2024 19:03:55 +0000 Subject: [PATCH] core: restart on a critical signal or SIGHUP ref #76 --- src/core/hyprlock.cpp | 15 +++++++++++++++ src/core/hyprlock.hpp | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/core/hyprlock.cpp b/src/core/hyprlock.cpp index b3fbc36..afab72c 100644 --- a/src/core/hyprlock.cpp +++ b/src/core/hyprlock.cpp @@ -293,6 +293,11 @@ static void handleUnlockSignal(int sig) { } } +static void handleCriticalSignal(int sig) { + g_pHyprlock->attemptRestoreOnDeath(); + abort(); +} + void CHyprlock::run() { m_sWaylandState.registry = wl_display_get_registry(m_sWaylandState.display); @@ -332,6 +337,8 @@ void CHyprlock::run() { lockSession(); signal(SIGUSR1, handleUnlockSignal); + signal(SIGSEGV, handleCriticalSignal); + signal(SIGABRT, handleCriticalSignal); pollfd pollfds[] = { { @@ -346,6 +353,7 @@ void CHyprlock::run() { if (ret < 0) { Debug::log(CRIT, "[core] Polling fds failed with {}", errno); + attemptRestoreOnDeath(); m_bTerminate = true; exit(1); } @@ -353,6 +361,7 @@ void CHyprlock::run() { for (size_t i = 0; i < 1; ++i) { if (pollfds[i].revents & POLLHUP) { Debug::log(CRIT, "[core] Disconnected from pollfd id {}", i); + attemptRestoreOnDeath(); m_bTerminate = true; exit(1); } @@ -872,4 +881,10 @@ std::string CHyprlock::spawnSync(const std::string& cmd) { zwlr_screencopy_manager_v1* CHyprlock::getScreencopy() { return m_sWaylandState.screencopy; +} + +void CHyprlock::attemptRestoreOnDeath() { + // dirty hack + spawnSync("hyprctl keyword misc:allow_session_lock_restore true"); + spawnAsync("sleep 2 && hyprlock & disown"); } \ No newline at end of file diff --git a/src/core/hyprlock.hpp b/src/core/hyprlock.hpp index 64a659d..d21e381 100644 --- a/src/core/hyprlock.hpp +++ b/src/core/hyprlock.hpp @@ -43,6 +43,8 @@ class CHyprlock { void lockSession(); void unlockSession(); + void attemptRestoreOnDeath(); + void spawnAsync(const std::string& cmd); std::string spawnSync(const std::string& cmd);