move intersect function to WindowsTracker

pull/5/head
Michail Vourlakos 6 years ago
parent dab796e253
commit 417f992831

@ -99,7 +99,7 @@ void Positioner::init()
connect(m_view, &Latte::View::maxLengthChanged, this, &Positioner::syncGeometry); connect(m_view, &Latte::View::maxLengthChanged, this, &Positioner::syncGeometry);
connect(m_view, &Latte::View::offsetChanged, this, &Positioner::syncGeometry); connect(m_view, &Latte::View::offsetChanged, this, &Positioner::syncGeometry);
connect(m_view, &Latte::View::absGeometryChanged, this, [&]() { connect(m_view, &Latte::View::absoluteGeometryChanged, this, [&]() {
if (m_view->behaveAsPlasmaPanel()) { if (m_view->behaveAsPlasmaPanel()) {
syncGeometry(); syncGeometry();
} }
@ -219,7 +219,7 @@ void Positioner::setScreenToFollow(QScreen *scr, bool updateScreenId)
connect(scr, &QScreen::geometryChanged, this, &Positioner::screenGeometryChanged); connect(scr, &QScreen::geometryChanged, this, &Positioner::screenGeometryChanged);
syncGeometry(); syncGeometry();
m_view->updateAbsDockGeometry(true); m_view->updateAbsoluteGeometry(true);
qDebug() << "setScreenToFollow() ended..."; qDebug() << "setScreenToFollow() ended...";
emit screenGeometryChanged(); emit screenGeometryChanged();
@ -298,7 +298,7 @@ void Positioner::screenChanged(QScreen *scr)
//! and even though the geometry has been set correctly the offsets //! and even though the geometry has been set correctly the offsets
//! of the screen must be updated to the new ones //! of the screen must be updated to the new ones
if (m_view->visibility() && m_view->visibility()->mode() == Latte::Types::AlwaysVisible) { if (m_view->visibility() && m_view->visibility()->mode() == Latte::Types::AlwaysVisible) {
m_view->updateAbsDockGeometry(true); m_view->updateAbsoluteGeometry(true);
} }
} }

@ -72,7 +72,7 @@ ScreenEdgeGhostWindow::ScreenEdgeGhostWindow(Latte::View *view) :
connect(this, &QQuickView::widthChanged, this, &ScreenEdgeGhostWindow::startGeometryTimer); connect(this, &QQuickView::widthChanged, this, &ScreenEdgeGhostWindow::startGeometryTimer);
connect(this, &QQuickView::heightChanged, this, &ScreenEdgeGhostWindow::startGeometryTimer); connect(this, &QQuickView::heightChanged, this, &ScreenEdgeGhostWindow::startGeometryTimer);
connect(m_latteView, &Latte::View::absGeometryChanged, this, &ScreenEdgeGhostWindow::updateGeometry); connect(m_latteView, &Latte::View::absoluteGeometryChanged, this, &ScreenEdgeGhostWindow::updateGeometry);
connect(m_latteView, &Latte::View::screenGeometryChanged, this, &ScreenEdgeGhostWindow::updateGeometry); connect(m_latteView, &Latte::View::screenGeometryChanged, this, &ScreenEdgeGhostWindow::updateGeometry);
connect(m_latteView, &Latte::View::locationChanged, this, &ScreenEdgeGhostWindow::updateGeometry); connect(m_latteView, &Latte::View::locationChanged, this, &ScreenEdgeGhostWindow::updateGeometry);
connect(m_latteView, &QQuickView::screenChanged, this, [this]() { connect(m_latteView, &QQuickView::screenChanged, this, [this]() {
@ -150,25 +150,25 @@ void ScreenEdgeGhostWindow::updateGeometry()
int thickness{KWindowSystem::compositingActive() ? 4 : 2}; int thickness{KWindowSystem::compositingActive() ? 4 : 2};
if (m_latteView->location() == Plasma::Types::BottomEdge) { if (m_latteView->location() == Plasma::Types::BottomEdge) {
newGeometry.setX(m_latteView->absGeometry().left()); newGeometry.setX(m_latteView->absoluteGeometry().left());
newGeometry.setY(m_latteView->screenGeometry().bottom() - thickness); newGeometry.setY(m_latteView->screenGeometry().bottom() - thickness);
} else if (m_latteView->location() == Plasma::Types::TopEdge) { } else if (m_latteView->location() == Plasma::Types::TopEdge) {
newGeometry.setX(m_latteView->absGeometry().left()); newGeometry.setX(m_latteView->absoluteGeometry().left());
newGeometry.setY(m_latteView->screenGeometry().top()); newGeometry.setY(m_latteView->screenGeometry().top());
} else if (m_latteView->location() == Plasma::Types::LeftEdge) { } else if (m_latteView->location() == Plasma::Types::LeftEdge) {
newGeometry.setX(m_latteView->screenGeometry().left()); newGeometry.setX(m_latteView->screenGeometry().left());
newGeometry.setY(m_latteView->absGeometry().top()); newGeometry.setY(m_latteView->absoluteGeometry().top());
} else if (m_latteView->location() == Plasma::Types::RightEdge) { } else if (m_latteView->location() == Plasma::Types::RightEdge) {
newGeometry.setX(m_latteView->screenGeometry().right() - thickness); newGeometry.setX(m_latteView->screenGeometry().right() - thickness);
newGeometry.setY(m_latteView->absGeometry().top()); newGeometry.setY(m_latteView->absoluteGeometry().top());
} }
if (m_latteView->formFactor() == Plasma::Types::Horizontal) { if (m_latteView->formFactor() == Plasma::Types::Horizontal) {
newGeometry.setWidth(qMin(m_latteView->absGeometry().width(), m_latteView->screenGeometry().width() - 1)); newGeometry.setWidth(qMin(m_latteView->absoluteGeometry().width(), m_latteView->screenGeometry().width() - 1));
newGeometry.setHeight(thickness + 1); newGeometry.setHeight(thickness + 1);
} else { } else {
newGeometry.setWidth(thickness + 1); newGeometry.setWidth(thickness + 1);
newGeometry.setHeight(qMin(m_latteView->absGeometry().height(), m_latteView->screenGeometry().height() - 1)); newGeometry.setHeight(qMin(m_latteView->absoluteGeometry().height(), m_latteView->screenGeometry().height() - 1));
} }
m_calculatedGeometry = newGeometry; m_calculatedGeometry = newGeometry;

@ -203,13 +203,13 @@ View::~View()
void View::init() void View::init()
{ {
connect(this, &QQuickWindow::xChanged, this, &View::xChanged); connect(this, &QQuickWindow::xChanged, this, &View::xChanged);
connect(this, &QQuickWindow::xChanged, this, &View::updateAbsDockGeometry); connect(this, &QQuickWindow::xChanged, this, &View::updateAbsoluteGeometry);
connect(this, &QQuickWindow::yChanged, this, &View::yChanged); connect(this, &QQuickWindow::yChanged, this, &View::yChanged);
connect(this, &QQuickWindow::yChanged, this, &View::updateAbsDockGeometry); connect(this, &QQuickWindow::yChanged, this, &View::updateAbsoluteGeometry);
connect(this, &QQuickWindow::widthChanged, this, &View::widthChanged); connect(this, &QQuickWindow::widthChanged, this, &View::widthChanged);
connect(this, &QQuickWindow::widthChanged, this, &View::updateAbsDockGeometry); connect(this, &QQuickWindow::widthChanged, this, &View::updateAbsoluteGeometry);
connect(this, &QQuickWindow::heightChanged, this, &View::heightChanged); connect(this, &QQuickWindow::heightChanged, this, &View::heightChanged);
connect(this, &QQuickWindow::heightChanged, this, &View::updateAbsDockGeometry); connect(this, &QQuickWindow::heightChanged, this, &View::updateAbsoluteGeometry);
connect(m_corona, &Latte::Corona::availableScreenRectChangedFrom, this, &View::availableScreenRectChangedFrom); connect(m_corona, &Latte::Corona::availableScreenRectChangedFrom, this, &View::availableScreenRectChangedFrom);
@ -428,10 +428,10 @@ void View::setLocalGeometry(const QRect &geometry)
m_localGeometry = geometry; m_localGeometry = geometry;
emit localGeometryChanged(); emit localGeometryChanged();
updateAbsDockGeometry(); updateAbsoluteGeometry();
} }
void View::updateAbsDockGeometry(bool bypassChecks) void View::updateAbsoluteGeometry(bool bypassChecks)
{ {
//! there was a -1 in height and width here. The reason of this //! there was a -1 in height and width here. The reason of this
//! if I remember correctly was related to multi-screen but I cant //! if I remember correctly was related to multi-screen but I cant
@ -443,14 +443,18 @@ void View::updateAbsDockGeometry(bool bypassChecks)
QRect absGeometry {x() + m_localGeometry.x(), y() + m_localGeometry.y() QRect absGeometry {x() + m_localGeometry.x(), y() + m_localGeometry.y()
, m_localGeometry.width(), m_localGeometry.height()}; , m_localGeometry.width(), m_localGeometry.height()};
if (m_absGeometry == absGeometry && !bypassChecks) if (m_absoluteGeometry == absGeometry && !bypassChecks) {
return; return;
}
m_absGeometry = absGeometry; if (m_absoluteGeometry != absGeometry) {
emit absGeometryChanged(m_absGeometry); m_absoluteGeometry = absGeometry;
emit absoluteGeometryChanged(m_absoluteGeometry);
}
//! this is needed in order to update correctly the screenGeometries //! this is needed in order to update correctly the screenGeometries
if (visibility() && corona() && visibility()->mode() == Types::AlwaysVisible) { if (visibility() && corona() && visibility()->mode() == Types::AlwaysVisible) {
//! main use of BYPASSCKECKS is from Positioner when the view changes screens
emit m_corona->availableScreenRectChangedFrom(this); emit m_corona->availableScreenRectChangedFrom(this);
emit m_corona->availableScreenRegionChangedFrom(this); emit m_corona->availableScreenRegionChangedFrom(this);
} }
@ -704,9 +708,9 @@ void View::setAlignment(int alignment)
emit alignmentChanged(); emit alignmentChanged();
} }
QRect View::absGeometry() const QRect View::absoluteGeometry() const
{ {
return m_absGeometry; return m_absoluteGeometry;
} }
QRect View::screenGeometry() const QRect View::screenGeometry() const

@ -105,7 +105,7 @@ class View : public PlasmaQuick::ContainmentView
Q_PROPERTY(Latte::ViewPart::VisibilityManager *visibility READ visibility NOTIFY visibilityChanged) Q_PROPERTY(Latte::ViewPart::VisibilityManager *visibility READ visibility NOTIFY visibilityChanged)
Q_PROPERTY(Latte::ViewPart::WindowsTracker *windowsTracker READ windowsTracker NOTIFY windowsTrackerChanged) Q_PROPERTY(Latte::ViewPart::WindowsTracker *windowsTracker READ windowsTracker NOTIFY windowsTrackerChanged)
Q_PROPERTY(QRect absoluteGeometry READ absGeometry NOTIFY absGeometryChanged) Q_PROPERTY(QRect absoluteGeometry READ absoluteGeometry NOTIFY absoluteGeometryChanged)
Q_PROPERTY(QRect localGeometry READ localGeometry WRITE setLocalGeometry NOTIFY localGeometryChanged) Q_PROPERTY(QRect localGeometry READ localGeometry WRITE setLocalGeometry NOTIFY localGeometryChanged)
Q_PROPERTY(QRect screenGeometry READ screenGeometry NOTIFY screenGeometryChanged) Q_PROPERTY(QRect screenGeometry READ screenGeometry NOTIFY screenGeometryChanged)
@ -168,7 +168,7 @@ public:
int alignment() const; int alignment() const;
void setAlignment(int alignment); void setAlignment(int alignment);
QRect absGeometry() const; QRect absoluteGeometry() const;
QRect screenGeometry() const; QRect screenGeometry() const;
QRect localGeometry() const; QRect localGeometry() const;
@ -211,7 +211,7 @@ public slots:
Q_INVOKABLE bool mimeContainsPlasmoid(QMimeData *mimeData, QString name); Q_INVOKABLE bool mimeContainsPlasmoid(QMimeData *mimeData, QString name);
Q_INVOKABLE bool tasksPresent(); Q_INVOKABLE bool tasksPresent();
void updateAbsDockGeometry(bool bypassChecks = false); void updateAbsoluteGeometry(bool bypassChecks = false);
Q_INVOKABLE void disableGrabItemBehavior(); Q_INVOKABLE void disableGrabItemBehavior();
Q_INVOKABLE void restoreGrabItemBehavior(); Q_INVOKABLE void restoreGrabItemBehavior();
@ -262,7 +262,7 @@ signals:
void xChanged(); void xChanged();
void yChanged(); void yChanged();
void absGeometryChanged(const QRect &geometry); void absoluteGeometryChanged(const QRect &geometry);
private slots: private slots:
void availableScreenRectChangedFrom(View *origin); void availableScreenRectChangedFrom(View *origin);
@ -304,7 +304,7 @@ private:
Types::ViewType m_type{Types::DockView}; Types::ViewType m_type{Types::DockView};
QRect m_localGeometry; QRect m_localGeometry;
QRect m_absGeometry; QRect m_absoluteGeometry;
Layout::GenericLayout *m_managedLayout{nullptr}; Layout::GenericLayout *m_managedLayout{nullptr};
QPointer<PlasmaQuick::ConfigView> m_configView; QPointer<PlasmaQuick::ConfigView> m_configView;

@ -53,8 +53,16 @@ VisibilityManager::VisibilityManager(PlasmaQuick::ContainmentView *view)
wm = m_corona->wm(); wm = m_corona->wm();
if (m_latteView) { if (m_latteView) {
connect(m_latteView, &Latte::View::absGeometryChanged, this, &VisibilityManager::setViewGeometry);
connect(m_latteView, &Latte::View::eventTriggered, this, &VisibilityManager::viewEventManager); connect(m_latteView, &Latte::View::eventTriggered, this, &VisibilityManager::viewEventManager);
connect(m_latteView, &Latte::View::absoluteGeometryChanged, this, [&]() {
if (m_mode == Types::AlwaysVisible && m_latteView->screen()) {
updateStrutsBasedOnLayoutsAndActivities();
}
});
connect(m_latteView->windowsTracker(), &WindowsTracker::activeWindowDraggingStarted,
this, &VisibilityManager::activeWindowDraggingStarted);
} }
if (m_corona) { if (m_corona) {
@ -81,9 +89,6 @@ VisibilityManager::VisibilityManager(PlasmaQuick::ContainmentView *view)
} }
}); });
connect(m_latteView->windowsTracker(), &WindowsTracker::activeWindowDraggingStarted,
this, &VisibilityManager::activeWindowDraggingStarted);
wm->setViewExtraFlags(*m_latteView); wm->setViewExtraFlags(*m_latteView);
wm->addView(m_latteView->winId()); wm->addView(m_latteView->winId());
@ -233,7 +238,7 @@ void VisibilityManager::updateStrutsBasedOnLayoutsAndActivities()
&& m_latteView->managedLayout()->isCurrent()); && m_latteView->managedLayout()->isCurrent());
if (m_corona->layoutManager()->memoryUsage() == Types::SingleLayout || multipleLayoutsAndCurrent) { if (m_corona->layoutManager()->memoryUsage() == Types::SingleLayout || multipleLayoutsAndCurrent) {
wm->setViewStruts(*m_latteView, m_viewGeometry, m_latteView->location()); wm->setViewStruts(*m_latteView, m_latteView->absoluteGeometry(), m_latteView->location());
} else { } else {
wm->removeViewStruts(*m_latteView); wm->removeViewStruts(*m_latteView);
} }
@ -443,18 +448,6 @@ void VisibilityManager::updateHiddenState()
} }
} }
void VisibilityManager::setViewGeometry(const QRect &geometry)
{
if (!m_latteView->containment() || m_viewGeometry == geometry)
return;
m_viewGeometry = geometry;
if (m_mode == Types::AlwaysVisible && m_latteView->screen()) {
updateStrutsBasedOnLayoutsAndActivities();
}
}
void VisibilityManager::applyActivitiesToHiddenWindows(const QStringList &activities) void VisibilityManager::applyActivitiesToHiddenWindows(const QStringList &activities)
{ {
if (edgeGhostWindow) { if (edgeGhostWindow) {
@ -510,15 +503,6 @@ void VisibilityManager::dodgeAllWindows()
raiseView(!windowIntersects); raiseView(!windowIntersects);
} }
bool VisibilityManager::intersects(const WindowInfoWrap &winfo)
{
return (!winfo.isMinimized()
&& wm->isOnCurrentDesktop(winfo.wid())
&& wm->isOnCurrentActivity(winfo.wid())
&& winfo.geometry().intersects(m_viewGeometry)
&& !winfo.isShaded());
}
void VisibilityManager::saveConfig() void VisibilityManager::saveConfig()
{ {
if (!m_latteView->containment()) if (!m_latteView->containment())

@ -93,8 +93,6 @@ public:
int timerHide() const; int timerHide() const;
void setTimerHide(int msec); void setTimerHide(int msec);
bool intersects(const WindowInfoWrap &winfo);
//! KWin Edges Support functions //! KWin Edges Support functions
bool enableKWinEdges() const; bool enableKWinEdges() const;
void setEnableKWinEdges(bool enable); void setEnableKWinEdges(bool enable);
@ -143,8 +141,6 @@ private:
void updateKWinEdgesSupport(); void updateKWinEdgesSupport();
void updateGhostWindowState(); void updateGhostWindowState();
void setViewGeometry(const QRect &rect);
void windowAdded(WindowId id); void windowAdded(WindowId id);
void updateStrutsBasedOnLayoutsAndActivities(); void updateStrutsBasedOnLayoutsAndActivities();
void viewEventManager(QEvent *ev); void viewEventManager(QEvent *ev);
@ -162,7 +158,7 @@ private:
QTimer m_timerShow; QTimer m_timerShow;
QTimer m_timerHide; QTimer m_timerHide;
QTimer m_timerStartUp; QTimer m_timerStartUp;
QRect m_viewGeometry;
bool m_isHidden{false}; bool m_isHidden{false};
bool dragEnter{false}; bool dragEnter{false};
bool m_blockHiding{false}; bool m_blockHiding{false};

@ -346,6 +346,11 @@ bool WindowsTracker::inCurrentDesktopActivity(const WindowInfoWrap &winfo)
return (winfo.isValid() && m_wm->isOnCurrentDesktop(winfo.wid()) && m_wm->isOnCurrentActivity(winfo.wid())); return (winfo.isValid() && m_wm->isOnCurrentDesktop(winfo.wid()) && m_wm->isOnCurrentActivity(winfo.wid()));
} }
bool WindowsTracker::intersects(const WindowInfoWrap &winfo)
{
return (!winfo.isMinimized() && !winfo.isShaded() && winfo.geometry().intersects(m_latteView->absoluteGeometry()));
}
bool WindowsTracker::isActive(const WindowInfoWrap &winfo) bool WindowsTracker::isActive(const WindowInfoWrap &winfo)
{ {
return (winfo.isValid() && winfo.isActive() && !winfo.isMinimized()); return (winfo.isValid() && winfo.isActive() && !winfo.isMinimized());
@ -362,13 +367,13 @@ bool WindowsTracker::isMaximizedInCurrentScreen(const WindowInfoWrap &winfo)
auto viewIntersectsMaxVert = [&]() noexcept -> bool { auto viewIntersectsMaxVert = [&]() noexcept -> bool {
return ((winfo.isMaxVert() return ((winfo.isMaxVert()
|| (m_latteView->screen() && m_latteView->screen()->availableSize().height() <= winfo.geometry().height())) || (m_latteView->screen() && m_latteView->screen()->availableSize().height() <= winfo.geometry().height()))
&& m_latteView->visibility()->intersects(winfo)); && intersects(winfo));
}; };
auto viewIntersectsMaxHoriz = [&]() noexcept -> bool { auto viewIntersectsMaxHoriz = [&]() noexcept -> bool {
return ((winfo.isMaxHoriz() return ((winfo.isMaxHoriz()
|| (m_latteView->screen() && m_latteView->screen()->availableSize().width() <= winfo.geometry().width())) || (m_latteView->screen() && m_latteView->screen()->availableSize().width() <= winfo.geometry().width()))
&& m_latteView->visibility()->intersects(winfo)); && intersects(winfo));
}; };
//! updated implementation to identify the screen that the maximized window is present //! updated implementation to identify the screen that the maximized window is present
@ -380,7 +385,7 @@ bool WindowsTracker::isMaximizedInCurrentScreen(const WindowInfoWrap &winfo)
bool WindowsTracker::isTouchingView(const WindowInfoWrap &winfo) bool WindowsTracker::isTouchingView(const WindowInfoWrap &winfo)
{ {
return (winfo.isValid() && !winfo.isMinimized() && m_latteView->visibility()->intersects(winfo)); return (winfo.isValid() && intersects(winfo));
} }
bool WindowsTracker::isTouchingViewEdge(const WindowInfoWrap &winfo) bool WindowsTracker::isTouchingViewEdge(const WindowInfoWrap &winfo)

@ -97,6 +97,7 @@ private:
//! this is a garbage collector to collect such windows in order to not break the windows array validity. //! this is a garbage collector to collect such windows in order to not break the windows array validity.
void cleanupFaultyWindows(); void cleanupFaultyWindows();
bool intersects(const WindowInfoWrap &winfo);
bool inCurrentDesktopActivity(const WindowInfoWrap &winfo); bool inCurrentDesktopActivity(const WindowInfoWrap &winfo);
bool isActive(const WindowInfoWrap &winfo); bool isActive(const WindowInfoWrap &winfo);
bool isActiveInCurrentScreen(const WindowInfoWrap &winfo); bool isActiveInCurrentScreen(const WindowInfoWrap &winfo);

Loading…
Cancel
Save