diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2025-12-20 22:16:13 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-20 22:16:13 +0000 |
| commit | b9bef6955487b75d13cfedd230bdc4adafedd115 (patch) | |
| tree | 21400bb6bbb37651ad8e2f3338d2fa5e317b4098 /src/desktop/history/WindowHistoryTracker.cpp | |
| parent | 70f54a1e1ba3478a56faf82431b2770bd727431d (diff) | |
Desktop/history: Move history to desktop (#12676)
Diffstat (limited to 'src/desktop/history/WindowHistoryTracker.cpp')
| -rw-r--r-- | src/desktop/history/WindowHistoryTracker.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/desktop/history/WindowHistoryTracker.cpp b/src/desktop/history/WindowHistoryTracker.cpp new file mode 100644 index 00000000..5dc0742f --- /dev/null +++ b/src/desktop/history/WindowHistoryTracker.cpp @@ -0,0 +1,55 @@ +#include "WindowHistoryTracker.hpp" + +#include "../../managers/HookSystemManager.hpp" +#include "../view/Window.hpp" + +using namespace Desktop; +using namespace Desktop::History; + +SP<CWindowHistoryTracker> History::windowTracker() { + static SP<CWindowHistoryTracker> tracker = makeShared<CWindowHistoryTracker>(); + return tracker; +} + +CWindowHistoryTracker::CWindowHistoryTracker() { + static auto P = g_pHookSystem->hookDynamic("openWindowEarly", [this](void* self, SCallbackInfo& info, std::any data) { + auto window = std::any_cast<PHLWINDOW>(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<PHLWINDOW>(data); + + track(window); + }); +} + +void CWindowHistoryTracker::track(PHLWINDOW w) { + std::erase(m_history, w); + m_history.emplace_back(w); +} + +const std::vector<PHLWINDOWREF>& CWindowHistoryTracker::fullHistory() { + gc(); + return m_history; +} + +std::vector<PHLWINDOWREF> CWindowHistoryTracker::historyForWorkspace(PHLWORKSPACE ws) { + gc(); + std::vector<PHLWINDOWREF> 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; }); +} |
