From 2309270752383be30857d9c15cd3e259c4e6ed58 Mon Sep 17 00:00:00 2001 From: nyx Date: Mon, 31 Mar 2025 12:06:17 -0400 Subject: [PATCH] anr: add config for ping number before popup shows up (#9782) * anr: make pings configurable makes the pings of the dialog popup configurable --- src/config/ConfigDescriptions.hpp | 6 ++++++ src/config/ConfigManager.cpp | 1 + src/managers/ANRManager.cpp | 13 ++++++++----- src/managers/ANRManager.hpp | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 3e9563ee..234c3743 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1223,6 +1223,12 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_BOOL, .data = SConfigOptionDescription::SBoolData{true}, }, + SConfigOptionDescription{ + .value = "misc:anr_missed_pings", + .description = "number of missed pings before showing the ANR dialog", + .type = CONFIG_OPTION_INT, + .data = SConfigOptionDescription::SRangeData{1, 1, 10}, + }, /* * binds: diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 276e6db0..9fae42e1 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -460,6 +460,7 @@ CConfigManager::CConfigManager() { registerConfigVar("misc:disable_hyprland_qtutils_check", Hyprlang::INT{0}); registerConfigVar("misc:lockdead_screen_delay", Hyprlang::INT{1000}); registerConfigVar("misc:enable_anr_dialog", Hyprlang::INT{1}); + registerConfigVar("misc:anr_missed_pings", Hyprlang::INT{1}); registerConfigVar("group:insert_after_current", Hyprlang::INT{1}); registerConfigVar("group:focus_removed_window", Hyprlang::INT{1}); diff --git a/src/managers/ANRManager.cpp b/src/managers/ANRManager.cpp index ebf02001..3debcda8 100644 --- a/src/managers/ANRManager.cpp +++ b/src/managers/ANRManager.cpp @@ -41,7 +41,8 @@ CANRManager::CANRManager() { void CANRManager::onTick() { std::erase_if(m_data, [](const auto& e) { return e->isDefunct(); }); - static auto PENABLEANR = CConfigValue("misc:enable_anr_dialog"); + static auto PENABLEANR = CConfigValue("misc:enable_anr_dialog"); + static auto PANRTHRESHOLD = CConfigValue("misc:anr_missed_pings"); if (!*PENABLEANR) { m_timer->updateTimeout(TIMER_TIMEOUT * 10); @@ -66,7 +67,7 @@ void CANRManager::onTick() { if (count == 0) continue; - if (data->missedResponses > 0) { + if (data->missedResponses >= *PANRTHRESHOLD) { if (!data->isThreadRunning() && !data->dialogThreadSaidWait) { data->runDialog("Application Not Responding", firstWindow->m_szTitle, firstWindow->m_szClass, data->getPid()); @@ -128,7 +129,8 @@ bool CANRManager::isNotResponding(PHLWINDOW pWindow) { } bool CANRManager::isNotResponding(SP data) { - return data->missedResponses > 1; + static auto PANRTHRESHOLD = CConfigValue("misc:anr_missed_pings"); + return data->missedResponses > *PANRTHRESHOLD; } SP CANRManager::dataFor(PHLWINDOW pWindow) { @@ -203,12 +205,13 @@ bool CANRManager::SANRData::isThreadRunning() { return pthread_kill(dialogThread.native_handle(), 0) != ESRCH; } -void CANRManager::SANRData::killDialog() const { +void CANRManager::SANRData::killDialog() { if (!dialogProc) return; if (!dialogProc->pid()) { - Debug::log(ERR, "ANR: cannot kill dialogProc, as it doesn't have a pid. If you have hyprutils <= 0.6.0, you will crash soon. Otherwise, dialog failed to spawn??"); + Debug::log(ERR, "ANR: cannot kill dialogProc, as it doesn't have a pid."); + dialogProc = nullptr; return; } diff --git a/src/managers/ANRManager.hpp b/src/managers/ANRManager.hpp index 26319776..4d838f57 100644 --- a/src/managers/ANRManager.hpp +++ b/src/managers/ANRManager.hpp @@ -43,7 +43,7 @@ class CANRManager { void runDialog(const std::string& title, const std::string& appName, const std::string appClass, pid_t dialogWmPID); bool isThreadRunning(); - void killDialog() const; + void killDialog(); bool isDefunct() const; bool fitsWindow(PHLWINDOW pWindow) const; pid_t getPid() const;