#include "WindowHistoryTracker.hpp" #include "../../managers/HookSystemManager.hpp" #include "../view/Window.hpp" using namespace Desktop; using namespace Desktop::History; SP History::windowTracker() { static SP tracker = makeShared(); return tracker; } CWindowHistoryTracker::CWindowHistoryTracker() { static auto P = g_pHookSystem->hookDynamic("openWindowEarly", [this](void* self, SCallbackInfo& info, std::any data) { auto window = std::any_cast(data); // add a last track m_history.insert(m_history.begin(), window); }); static auto P1 = g_pHookSystem->hookDynamic("activeWindow", [this](void* self, SCallbackInfo& info, std::any data) { auto window = std::any_cast(data).window; track(window); }); } void CWindowHistoryTracker::track(PHLWINDOW w) { std::erase(m_history, w); m_history.emplace_back(w); } const std::vector& CWindowHistoryTracker::fullHistory() { gc(); return m_history; } std::vector CWindowHistoryTracker::historyForWorkspace(PHLWORKSPACE ws) { gc(); std::vector windows; for (const auto& w : m_history) { if (w->m_workspace != ws) continue; windows.emplace_back(w); } return windows; } void CWindowHistoryTracker::gc() { std::erase_if(m_history, [](const auto& e) { return !e; }); }