From 79ae6a6de491ab48a7b47b5c852f2a3b0fa5a6f7 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Fri, 7 Jun 2019 18:07:19 +0300 Subject: [PATCH] initial support History for LastActiveWindow --- app/wm/tracker/lastactivewindow.cpp | 36 ++++++++++++++++++++++++++- app/wm/tracker/lastactivewindow.h | 8 ++++++ app/wm/tracker/trackedgeneralinfo.cpp | 10 -------- app/wm/tracker/trackedgeneralinfo.h | 3 --- app/wm/tracker/trackerwindows.cpp | 2 ++ app/wm/tracker/trackerwindows.h | 1 + 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/app/wm/tracker/lastactivewindow.cpp b/app/wm/tracker/lastactivewindow.cpp index c63982e7c..c3eae6956 100644 --- a/app/wm/tracker/lastactivewindow.cpp +++ b/app/wm/tracker/lastactivewindow.cpp @@ -43,6 +43,9 @@ LastActiveWindow::LastActiveWindow(TrackedGeneralInfo *trackedInfo) m_windowsTracker(trackedInfo->wm()->windowsTracker()), m_wm(trackedInfo->wm()) { + connect(m_windowsTracker, &Windows::activeWindowChanged, this, &LastActiveWindow::windowChanged); + connect(m_windowsTracker, &Windows::windowChanged, this, &LastActiveWindow::windowChanged); + connect(m_windowsTracker, &Windows::windowRemoved, this, &LastActiveWindow::windowRemoved); } LastActiveWindow::~LastActiveWindow() @@ -236,6 +239,14 @@ void LastActiveWindow::setWinId(QVariant winId) return; } + if (!m_history.contains(winId)) { + m_history.prepend(winId); + } else { + int p = m_history.indexOf(winId); + //! move to start + m_history.move(p, 0); + } + m_winId = winId; emit winIdChanged(); } @@ -268,9 +279,32 @@ void LastActiveWindow::setInformation(const WindowInfoWrap &info) } -//! FUNCTIONALITY +//! PRIVATE SLOTS +void LastActiveWindow::windowChanged(const WindowId &wid) +{ + if (m_winId == wid && !wid.isNull()) { + setInformation(m_windowsTracker->infoFor(wid)); + } +} +void LastActiveWindow::windowRemoved(const WindowId &wid) +{ + bool wasFirst{false}; + if (m_history.contains(wid)) { + if (m_history[0] == wid) { + wasFirst = true; + } + + m_history.removeAll(wid); + } + + if (wasFirst && !m_history.isEmpty()) { + setInformation(m_windowsTracker->infoFor(m_history[0])); + } +} + +//! FUNCTIONALITY void LastActiveWindow::requestActivate() { m_wm->requestActivate(m_winId); diff --git a/app/wm/tracker/lastactivewindow.h b/app/wm/tracker/lastactivewindow.h index adb026b92..b105f439a 100644 --- a/app/wm/tracker/lastactivewindow.h +++ b/app/wm/tracker/lastactivewindow.h @@ -96,6 +96,12 @@ public slots: Q_INVOKABLE bool canBeDragged(); + +private slots: + void windowChanged(const WindowId &wid); + void windowRemoved(const WindowId &wid); + + signals: void draggingStarted(); @@ -151,6 +157,8 @@ private: QVariant m_winId; + QList m_history; + TrackedGeneralInfo *m_trackedInfo{nullptr}; AbstractWindowInterface *m_wm{nullptr}; Tracker::Windows *m_windowsTracker{nullptr}; diff --git a/app/wm/tracker/trackedgeneralinfo.cpp b/app/wm/tracker/trackedgeneralinfo.cpp index 21fa81b80..55101185d 100644 --- a/app/wm/tracker/trackedgeneralinfo.cpp +++ b/app/wm/tracker/trackedgeneralinfo.cpp @@ -37,9 +37,6 @@ TrackedGeneralInfo::TrackedGeneralInfo(Tracker::Windows *tracker, Latte::View *v { m_lastActiveWindow = new LastActiveWindow(this); - connect(tracker, &Windows::windowChanged, this, &TrackedGeneralInfo::windowChanged); - connect(tracker, &Windows::activeWindowChanged, this, &TrackedGeneralInfo::windowChanged); - emit lastActiveWindowChanged(); } @@ -145,13 +142,6 @@ void TrackedGeneralInfo::setActiveWindow(const WindowId &wid) m_lastActiveWindow->setInformation(m_tracker->infoFor(wid)); } -void TrackedGeneralInfo::windowChanged(const WindowId &wid) -{ - if (m_lastActiveWindow->winId() == wid && !wid.isNull()) { - m_lastActiveWindow->setInformation(m_tracker->infoFor(wid)); - } -} - } } } diff --git a/app/wm/tracker/trackedgeneralinfo.h b/app/wm/tracker/trackedgeneralinfo.h index 6dfc0d525..61e0fad7c 100644 --- a/app/wm/tracker/trackedgeneralinfo.h +++ b/app/wm/tracker/trackedgeneralinfo.h @@ -79,9 +79,6 @@ public: signals: void lastActiveWindowChanged(); -private slots: - void windowChanged(const WindowId &wid); - private: bool m_enabled; bool m_activeWindowMaximized; diff --git a/app/wm/tracker/trackerwindows.cpp b/app/wm/tracker/trackerwindows.cpp index 4ad5c16da..b120c5221 100644 --- a/app/wm/tracker/trackerwindows.cpp +++ b/app/wm/tracker/trackerwindows.cpp @@ -68,6 +68,8 @@ void Windows::init() connect(m_wm, &AbstractWindowInterface::windowRemoved, this, [&](WindowId wid) { m_windows.remove(wid); updateViewsHints(); + + emit windowRemoved(wid); }); connect(m_wm, &AbstractWindowInterface::windowAdded, this, [&](WindowId wid) { diff --git a/app/wm/tracker/trackerwindows.h b/app/wm/tracker/trackerwindows.h index 9fa7050b8..fee91790c 100644 --- a/app/wm/tracker/trackerwindows.h +++ b/app/wm/tracker/trackerwindows.h @@ -90,6 +90,7 @@ signals: //! inform consumers for window changes void activeWindowChanged(const WindowId &wid); void windowChanged(const WindowId &wid); + void windowRemoved(const WindowId &wid); private slots: void updateAvailableScreenGeometries();