#pragma once #include "../helpers/memory/Memory.hpp" #include "../desktop/DesktopTypes.hpp" #include #include #include #include "./eventLoop/EventLoopTimer.hpp" #include "../helpers/signal/Signal.hpp" #include #include #include class CXDGWMBase; class CXWaylandSurface; class CANRManager { public: CANRManager(); void onResponse(SP wmBase); void onResponse(SP xwaylandSurface); bool isNotResponding(PHLWINDOW pWindow); private: bool m_active = false; SP m_timer; void onTick(); struct SANRData { SANRData(PHLWINDOW pWindow); ~SANRData(); WP xwaylandSurface; WP xdgBase; 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; bool isDefunct() const; bool fitsWindow(PHLWINDOW pWindow) const; pid_t getPid() const; void ping(); }; void onResponse(SP data); bool isNotResponding(SP data); SP dataFor(PHLWINDOW pWindow); SP dataFor(SP wmBase); SP dataFor(SP pXwaylandSurface); std::vector> m_data; }; inline UP g_pANRManager;