#pragma once #include "../helpers/memory/Memory.hpp" #include "../desktop/DesktopTypes.hpp" #include #include #include #include #include "./eventLoop/EventLoopTimer.hpp" #include "../helpers/signal/Signal.hpp" #include #include class CXDGWMBase; class CANRManager { public: CANRManager(); void onResponse(SP wmBase); bool isNotResponding(SP wmBase); private: bool m_active = false; SP m_timer; void onTick(); struct SANRData { ~SANRData(); int missedResponses = 0; std::thread dialogThread; SP dialogProc; std::atomic dialogThreadExited = false; std::atomic dialogThreadSaidWait = false; void runDialog(const std::string& title, const std::string& appName, const std::string appClass, pid_t dialogWmPID); bool isThreadRunning(); void killDialog() const; }; std::map, SP> m_data; }; inline UP g_pANRManager;