summaryrefslogtreecommitdiff
path: root/src/desktop/history/WindowHistoryTracker.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-12-20 22:16:13 +0000
committerGitHub <noreply@github.com>2025-12-20 22:16:13 +0000
commitb9bef6955487b75d13cfedd230bdc4adafedd115 (patch)
tree21400bb6bbb37651ad8e2f3338d2fa5e317b4098 /src/desktop/history/WindowHistoryTracker.cpp
parent70f54a1e1ba3478a56faf82431b2770bd727431d (diff)
Desktop/history: Move history to desktop (#12676)
Diffstat (limited to 'src/desktop/history/WindowHistoryTracker.cpp')
-rw-r--r--src/desktop/history/WindowHistoryTracker.cpp55
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; });
+}