From b264854a982bf6d21a33919876d143425da5d726 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sun, 17 May 2020 11:42:09 +0300 Subject: [PATCH] Dodge visibility mode now ignores edge touches --The new implementation for snapping needed to remove the touching view edge from touching algorithm. The windows trakers now provide two separate values for each touching. ----First value is for regular window touches for which their window geometry intersects with view published absoluteGeometry ----Second value is for windows that are touching view edge without intersecting with view geometry --- .../windowstracker/currentscreentracker.cpp | 24 +++++++ .../windowstracker/currentscreentracker.h | 6 ++ app/wm/tracker/trackedviewinfo.cpp | 28 ++++++++ app/wm/tracker/trackedviewinfo.h | 8 +++ app/wm/tracker/windowstracker.cpp | 66 ++++++++++++++++++- app/wm/tracker/windowstracker.h | 6 ++ .../package/contents/ui/colorizer/Manager.qml | 4 +- containment/package/contents/ui/main.qml | 10 ++- 8 files changed, 145 insertions(+), 7 deletions(-) diff --git a/app/view/windowstracker/currentscreentracker.cpp b/app/view/windowstracker/currentscreentracker.cpp index 7e8fe79bf..872f3a98e 100644 --- a/app/view/windowstracker/currentscreentracker.cpp +++ b/app/view/windowstracker/currentscreentracker.cpp @@ -72,6 +72,12 @@ void CurrentScreenTracker::init() } }); + connect(m_wm->windowsTracker(), &WindowSystem::Tracker::Windows::activeWindowTouchingEdgeChanged, this, [&](const Latte::View *view) { + if (m_latteView == view) { + emit activeWindowTouchingEdgeChanged(); + } + }); + connect(m_wm->windowsTracker(), &WindowSystem::Tracker::Windows::existsWindowActiveChanged, this, [&](const Latte::View *view) { if (m_latteView == view) { emit existsWindowActiveChanged(); @@ -90,6 +96,12 @@ void CurrentScreenTracker::init() } }); + connect(m_wm->windowsTracker(), &WindowSystem::Tracker::Windows::existsWindowTouchingEdgeChanged, this, [&](const Latte::View *view) { + if (m_latteView == view) { + emit existsWindowTouchingEdgeChanged(); + } + }); + connect(m_wm->windowsTracker(), &WindowSystem::Tracker::Windows::isTouchingBusyVerticalViewChanged, this, [&](const Latte::View *view) { if (m_latteView == view) { emit isTouchingBusyVerticalViewChanged(); @@ -114,9 +126,11 @@ void CurrentScreenTracker::initSignalsForInformation() emit lastActiveWindowChanged(); emit activeWindowMaximizedChanged(); emit activeWindowTouchingChanged(); + emit activeWindowTouchingEdgeChanged(); emit existsWindowActiveChanged(); emit existsWindowMaximizedChanged(); emit existsWindowTouchingChanged(); + emit existsWindowTouchingEdgeChanged(); emit activeWindowSchemeChanged(); emit touchingWindowSchemeChanged(); } @@ -131,6 +145,11 @@ bool CurrentScreenTracker::activeWindowTouching() const return m_wm->windowsTracker()->activeWindowTouching(m_latteView); } +bool CurrentScreenTracker::activeWindowTouchingEdge() const +{ + return m_wm->windowsTracker()->activeWindowTouchingEdge(m_latteView); +} + bool CurrentScreenTracker::existsWindowActive() const { return m_wm->windowsTracker()->existsWindowActive(m_latteView); @@ -146,6 +165,11 @@ bool CurrentScreenTracker::existsWindowTouching() const return m_wm->windowsTracker()->existsWindowTouching(m_latteView); } +bool CurrentScreenTracker::existsWindowTouchingEdge() const +{ + return m_wm->windowsTracker()->existsWindowTouchingEdge(m_latteView); +} + bool CurrentScreenTracker::isTouchingBusyVerticalView() const { return m_wm->windowsTracker()->isTouchingBusyVerticalView(m_latteView); diff --git a/app/view/windowstracker/currentscreentracker.h b/app/view/windowstracker/currentscreentracker.h index bc2050736..afd6e01a8 100644 --- a/app/view/windowstracker/currentscreentracker.h +++ b/app/view/windowstracker/currentscreentracker.h @@ -50,9 +50,11 @@ class CurrentScreenTracker : public QObject { Q_OBJECT Q_PROPERTY(bool activeWindowMaximized READ activeWindowMaximized NOTIFY activeWindowMaximizedChanged) Q_PROPERTY(bool activeWindowTouching READ activeWindowTouching NOTIFY activeWindowTouchingChanged) + Q_PROPERTY(bool activeWindowTouchingEdge READ activeWindowTouchingEdge NOTIFY activeWindowTouchingEdgeChanged) Q_PROPERTY(bool existsWindowActive READ existsWindowActive NOTIFY existsWindowActiveChanged) Q_PROPERTY(bool existsWindowMaximized READ existsWindowMaximized NOTIFY existsWindowMaximizedChanged) Q_PROPERTY(bool existsWindowTouching READ existsWindowTouching NOTIFY existsWindowTouchingChanged) + Q_PROPERTY(bool existsWindowTouchingEdge READ existsWindowTouchingEdge NOTIFY existsWindowTouchingEdgeChanged) Q_PROPERTY(bool isTouchingBusyVerticalView READ isTouchingBusyVerticalView NOTIFY isTouchingBusyVerticalViewChanged) Q_PROPERTY(Latte::WindowSystem::SchemeColors *activeWindowScheme READ activeWindowScheme NOTIFY activeWindowSchemeChanged) Q_PROPERTY(Latte::WindowSystem::SchemeColors *touchingWindowScheme READ touchingWindowScheme NOTIFY touchingWindowSchemeChanged) @@ -65,9 +67,11 @@ public: bool activeWindowMaximized() const; bool activeWindowTouching() const; + bool activeWindowTouchingEdge() const; bool existsWindowActive() const; bool existsWindowMaximized() const; bool existsWindowTouching() const; + bool existsWindowTouchingEdge() const; bool isTouchingBusyVerticalView() const; @@ -82,9 +86,11 @@ public slots: signals: void activeWindowMaximizedChanged(); void activeWindowTouchingChanged(); + void activeWindowTouchingEdgeChanged(); void existsWindowActiveChanged(); void existsWindowMaximizedChanged(); void existsWindowTouchingChanged(); + void existsWindowTouchingEdgeChanged(); void isTouchingBusyVerticalViewChanged(); void activeWindowSchemeChanged(); diff --git a/app/wm/tracker/trackedviewinfo.cpp b/app/wm/tracker/trackedviewinfo.cpp index 693a66fd6..290db7e48 100644 --- a/app/wm/tracker/trackedviewinfo.cpp +++ b/app/wm/tracker/trackedviewinfo.cpp @@ -74,6 +74,34 @@ void TrackedViewInfo::setExistsWindowTouching(bool touching) m_existsWindowTouching = touching; } +bool TrackedViewInfo::activeWindowTouchingEdge() const +{ + return m_activeWindowTouchingEdge; +} + +void TrackedViewInfo::setActiveWindowTouchingEdge(bool touching) +{ + if (m_activeWindowTouchingEdge == touching) { + return; + } + + m_activeWindowTouchingEdge = touching; +} + +bool TrackedViewInfo::existsWindowTouchingEdge() const +{ + return m_existsWindowTouchingEdge; +} + +void TrackedViewInfo::setExistsWindowTouchingEdge(bool touching) +{ + if (m_existsWindowTouchingEdge == touching) { + return; + } + + m_existsWindowTouchingEdge = touching; +} + bool TrackedViewInfo::isTouchingBusyVerticalView() const { return m_isTouchingBusyVerticalView; diff --git a/app/wm/tracker/trackedviewinfo.h b/app/wm/tracker/trackedviewinfo.h index 6ddaa6ab9..0dde781f8 100644 --- a/app/wm/tracker/trackedviewinfo.h +++ b/app/wm/tracker/trackedviewinfo.h @@ -56,6 +56,12 @@ public: bool existsWindowTouching() const; void setExistsWindowTouching(bool touching); + bool activeWindowTouchingEdge() const; + void setActiveWindowTouchingEdge(bool touching); + + bool existsWindowTouchingEdge() const; + void setExistsWindowTouchingEdge(bool touching); + bool isTouchingBusyVerticalView() const; void setIsTouchingBusyVerticalView(bool touching); @@ -72,6 +78,8 @@ public: private: bool m_activeWindowTouching{false}; bool m_existsWindowTouching{false}; + bool m_activeWindowTouchingEdge{false}; + bool m_existsWindowTouchingEdge{false}; bool m_isTouchingBusyVerticalView{false}; QRect m_availableScreenGeometry; diff --git a/app/wm/tracker/windowstracker.cpp b/app/wm/tracker/windowstracker.cpp index 52f13df13..0dbec586a 100644 --- a/app/wm/tracker/windowstracker.cpp +++ b/app/wm/tracker/windowstracker.cpp @@ -155,8 +155,10 @@ void Windows::initViewHints(Latte::View *view) setActiveWindowMaximized(view, false); setActiveWindowTouching(view, false); + setActiveWindowTouchingEdge(view, false); setExistsWindowActive(view, false); setExistsWindowTouching(view, false); + setExistsWindowTouchingEdge(view, false); setExistsWindowMaximized(view, false); setIsTouchingBusyVerticalView(view, false); setActiveWindowScheme(view, nullptr); @@ -342,6 +344,25 @@ void Windows::setActiveWindowTouching(Latte::View *view, bool activeTouching) emit activeWindowTouchingChanged(view); } +bool Windows::activeWindowTouchingEdge(Latte::View *view) const +{ + if (!m_views.contains(view)) { + return false; + } + + return m_views[view]->activeWindowTouchingEdge(); +} + +void Windows::setActiveWindowTouchingEdge(Latte::View *view, bool activeTouchingEdge) +{ + if (!m_views.contains(view) || m_views[view]->activeWindowTouchingEdge() == activeTouchingEdge) { + return; + } + + m_views[view]->setActiveWindowTouchingEdge(activeTouchingEdge); + emit activeWindowTouchingEdgeChanged(view); +} + bool Windows::existsWindowActive(Latte::View *view) const { if (!m_views.contains(view)) { @@ -399,6 +420,26 @@ void Windows::setExistsWindowTouching(Latte::View *view, bool windowTouching) emit existsWindowTouchingChanged(view); } +bool Windows::existsWindowTouchingEdge(Latte::View *view) const +{ + if (!m_views.contains(view)) { + return false; + } + + return m_views[view]->existsWindowTouchingEdge(); +} + +void Windows::setExistsWindowTouchingEdge(Latte::View *view, bool windowTouchingEdge) +{ + if (!m_views.contains(view) || m_views[view]->existsWindowTouchingEdge() == windowTouchingEdge) { + return; + } + + m_views[view]->setExistsWindowTouchingEdge(windowTouchingEdge); + emit existsWindowTouchingEdgeChanged(view); +} + + bool Windows::isTouchingBusyVerticalView(Latte::View *view) const { if (!m_views.contains(view)) { @@ -823,7 +864,9 @@ void Windows::updateHints(Latte::View *view) bool foundActive{false}; bool foundActiveInCurScreen{false}; bool foundActiveTouchInCurScreen{false}; + bool foundActiveEdgeTouchInCurScreen{false}; bool foundTouchInCurScreen{false}; + bool foundTouchEdgeInCurScreen{false}; bool foundMaximizedInCurScreen{false}; bool foundActiveGroupTouchInCurScreen{false}; @@ -835,7 +878,9 @@ void Windows::updateHints(Latte::View *view) WindowId maxWinId; WindowId activeWinId; WindowId touchWinId; + WindowId touchEdgeWinId; WindowId activeTouchWinId; + WindowId activeTouchEdgeWinId; //qDebug() << " -- TRACKING REPORT (SCREEN)--"; @@ -875,7 +920,7 @@ void Windows::updateHints(Latte::View *view) bool touchingViewEdge = isTouchingViewEdge(view, winfo); bool touchingView = isTouchingView(view, winfo); - if (touchingViewEdge || touchingView) { + if (touchingView) { if (winfo.isActive()) { foundActiveTouchInCurScreen = true; activeTouchWinId = winfo.wid(); @@ -885,6 +930,16 @@ void Windows::updateHints(Latte::View *view) } } + if (touchingViewEdge) { + if (winfo.isActive()) { + foundActiveEdgeTouchInCurScreen = true; + activeTouchEdgeWinId = winfo.wid(); + } else { + foundTouchEdgeInCurScreen = true; + touchEdgeWinId = winfo.wid(); + } + } + //qDebug() << "TRACKING | ACTIVE:"<< foundActive << " ACT_CUR_SCR:" << foundTouchInCurScreen << " MAXIM:"<0 && (maxWinId == activeTouchWinId))); setExistsWindowMaximized(view, foundMaximizedInCurScreen); setExistsWindowTouching(view, (foundTouchInCurScreen || foundActiveTouchInCurScreen || foundActiveGroupTouchInCurScreen)); + setExistsWindowTouchingEdge(view, (foundActiveEdgeTouchInCurScreen || foundTouchEdgeInCurScreen)); //! update color schemes for active and touching windows setActiveWindowScheme(view, (foundActiveInCurScreen ? m_wm->schemesTracker()->schemeForWindow(activeWinId) : nullptr)); if (foundActiveTouchInCurScreen) { setTouchingWindowScheme(view, m_wm->schemesTracker()->schemeForWindow(activeTouchWinId)); + } else if (foundActiveEdgeTouchInCurScreen) { + setTouchingWindowScheme(view, m_wm->schemesTracker()->schemeForWindow(activeTouchEdgeWinId)); } else if (foundMaximizedInCurScreen) { setTouchingWindowScheme(view, m_wm->schemesTracker()->schemeForWindow(maxWinId)); } else if (foundTouchInCurScreen) { setTouchingWindowScheme(view, m_wm->schemesTracker()->schemeForWindow(touchWinId)); + } else if (foundTouchEdgeInCurScreen) { + setTouchingWindowScheme(view, m_wm->schemesTracker()->schemeForWindow(touchEdgeWinId)); } else { setTouchingWindowScheme(view, nullptr); } @@ -970,6 +1031,7 @@ void Windows::updateHints(Latte::View *view) //qDebug() << "TRACKING | activeWindowTouching: " << foundActiveTouchInCurScreen << " ,activeWindowMaximized: " << activeWindowMaximized(view); //qDebug() << "TRACKING | existsWindowActive: " << foundActiveInCurScreen << " , existsWindowMaximized:" << existsWindowMaximized(view) // << " , existsWindowTouching:"<