diff --git a/app/layout/genericlayout.cpp b/app/layout/genericlayout.cpp index 75c15a21b..e2af5ba3a 100644 --- a/app/layout/genericlayout.cpp +++ b/app/layout/genericlayout.cpp @@ -758,7 +758,7 @@ void GenericLayout::containmentDestroyed(QObject *cont) if (view) { view->disconnectSensitiveSignals(); - view->positioner()->hideOnExit(); + view->positioner()->hideOnExit(containment->location()); view->deleteLater(); emit viewEdgeChanged(); diff --git a/app/view/positioner.cpp b/app/view/positioner.cpp index 8306b9430..3865586d2 100644 --- a/app/view/positioner.cpp +++ b/app/view/positioner.cpp @@ -294,11 +294,15 @@ QString Positioner::currentScreenName() const return m_screenNameToFollow; } -void Positioner::hideOnExit() +void Positioner::hideOnExit(Plasma::Types::Location location) { auto slideLocation = WindowSystem::AbstractWindowInterface::Slide::None; - switch (m_view->containment()->location()) { + if (location == Plasma::Types::Floating && m_view->containment()) { + location = m_view->containment()->location(); + } + + switch (location) { case Plasma::Types::TopEdge: slideLocation = WindowSystem::AbstractWindowInterface::Slide::Top; break; @@ -324,6 +328,12 @@ void Positioner::hideOnExit() m_view->setVisible(false); } +void Positioner::showInStartup() +{ + hideOnExit(); + m_view->setVisible(true); +} + void Positioner::onCurrentLayoutIsSwitching(const QString &layoutName) { if (!m_view || !m_view->layout() || m_view->layout()->name() != layoutName || !m_view->isVisible()) { diff --git a/app/view/positioner.h b/app/view/positioner.h index 1b99bb951..182ba862c 100644 --- a/app/view/positioner.h +++ b/app/view/positioner.h @@ -108,7 +108,8 @@ public slots: //! that might prevent them. It must be called with care. void immediateSyncGeometry(); - void hideOnExit(); + void showInStartup(); + void hideOnExit(Plasma::Types::Location location = Plasma::Types::Floating); void initDelayedSignals(); void updateWaylandId(); diff --git a/app/view/view.cpp b/app/view/view.cpp index 84aec779e..c801ee69d 100644 --- a/app/view/view.cpp +++ b/app/view/view.cpp @@ -83,7 +83,9 @@ View::View(Plasma::Corona *corona, QScreen *targetScreen, bool byPassWM) m_interface(new ViewPart::ContainmentInterface(this)), m_parabolic(new ViewPart::Parabolic(this)), m_sink(new ViewPart::EventsSink(this)) -{ +{ + setVisible(false); + //! needs to be created after Effects because it catches some of its signals //! and avoid a crash from View::winId() at the same time m_positioner = new ViewPart::Positioner(this); @@ -177,6 +179,10 @@ View::View(Plasma::Corona *corona, QScreen *targetScreen, bool byPassWM) if (m_positioner) { //! immediateSyncGeometry helps avoiding binding loops from containment qml side m_positioner->immediateSyncGeometry(); + if (m_inStartup) { + m_inStartup = false; + m_positioner->showInStartup(); + } } connect(this->containment(), SIGNAL(statusChanged(Plasma::Types::ItemStatus)), SLOT(statusChanged(Plasma::Types::ItemStatus))); diff --git a/app/view/view.h b/app/view/view.h index e32d1e473..b04ceee7a 100644 --- a/app/view/view.h +++ b/app/view/view.h @@ -401,6 +401,7 @@ private: bool m_containsDrag{false}; bool m_containsMouse{false}; bool m_inDelete{false}; + bool m_inStartup{true}; bool m_isPreferredForShortcuts{false}; bool m_onPrimary{true}; bool m_screenEdgeMarginEnabled{false};