diff --git a/app/dockconfigview.cpp b/app/dockconfigview.cpp index 285c3896d..e158eedd2 100644 --- a/app/dockconfigview.cpp +++ b/app/dockconfigview.cpp @@ -48,6 +48,8 @@ DockConfigView::DockConfigView(Plasma::Containment *containment, DockView *dockV setIcon(qGuiApp->windowIcon()); } + m_previousDockWinBehavior = m_dockView->dockWinBehavior(); + connections << connect(dockView, &QObject::destroyed, this, &QObject::deleteLater); m_screenSyncTimer.setSingleShot(true); m_screenSyncTimer.setInterval(100); @@ -220,9 +222,10 @@ void DockConfigView::hideEvent(QHideEvent *ev) QQuickWindow::hideEvent(ev); - if (m_dockView && m_dockView->visibility()->mode() != m_previousMode - && ((m_dockView->visibility()->mode() == Dock::AlwaysVisible) - || (m_previousMode == Dock::AlwaysVisible))) { + if ((m_dockView && m_dockView->visibility()->mode() != m_previousMode + && ((m_dockView->visibility()->mode() == Dock::AlwaysVisible) + || (m_previousMode == Dock::AlwaysVisible))) + || (m_previousDockWinBehavior != m_dockView->dockWinBehavior())) { auto *dockCorona = qobject_cast<DockCorona *>(m_dockView->corona()); diff --git a/app/dockconfigview.h b/app/dockconfigview.h index 8ab8b13a6..04effc910 100644 --- a/app/dockconfigview.h +++ b/app/dockconfigview.h @@ -76,6 +76,9 @@ signals: private: bool m_blockFocusLost; + //! it is used to check if we need to recreate the dock window + //! after the configuration window gets closed + bool m_previousDockWinBehavior; QPointer<DockView> m_dockView; QTimer m_screenSyncTimer; diff --git a/app/dockcorona.cpp b/app/dockcorona.cpp index 5193d725c..f5fa0b97a 100644 --- a/app/dockcorona.cpp +++ b/app/dockcorona.cpp @@ -800,13 +800,14 @@ void DockCorona::addDock(Plasma::Containment *containment) //! of the window... This of course is also used during //! recreations of the window between different visibility modes auto mode = static_cast<Dock::Visibility>(containment->config().readEntry("visibility", static_cast<int>(Dock::DodgeActive))); + bool dockWin = containment->config().readEntry("dockWindowBehavior", false); bool alwaysVisible{false}; if (mode == Latte::Dock::AlwaysVisible) { alwaysVisible = true; } - auto dockView = new DockView(this, nextScreen, alwaysVisible); + auto dockView = new DockView(this, nextScreen, alwaysVisible, dockWin); dockView->init(); dockView->setContainment(containment); diff --git a/app/dockview.cpp b/app/dockview.cpp index a8be72dad..71a04078a 100644 --- a/app/dockview.cpp +++ b/app/dockview.cpp @@ -47,7 +47,10 @@ namespace Latte { -DockView::DockView(Plasma::Corona *corona, QScreen *targetScreen, bool alwaysVisible) +//! both alwaysVisible and dockWinBehavior are passed through corona because +//! during the dock window creation containment hasnt been set, but these variables +//! are needed in order for window flags to be set correctly +DockView::DockView(Plasma::Corona *corona, QScreen *targetScreen, bool alwaysVisible, bool dockWindowBehavior) : PlasmaQuick::ContainmentView(corona), m_contextMenu(nullptr) { @@ -58,7 +61,7 @@ DockView::DockView(Plasma::Corona *corona, QScreen *targetScreen, bool alwaysVis setColor(QColor(Qt::transparent)); setClearBeforeRendering(true); - if (!alwaysVisible) { + if (!alwaysVisible && !dockWindowBehavior) { setFlags(Qt::BypassWindowManagerHint | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint @@ -159,6 +162,7 @@ void DockView::init() connect(this, &DockView::drawShadowsChanged, this, &DockView::syncGeometry); connect(this, &DockView::maxLengthChanged, this, &DockView::syncGeometry); connect(this, &DockView::alignmentChanged, this, &DockView::updateEnabledBorders); + connect(this, &DockView::dockWinBehaviorChanged, this, &DockView::saveConfig); connect(this, &DockView::onPrimaryChanged, this, &DockView::saveConfig); connect(this, &DockView::onPrimaryChanged, this, &DockView::reconsiderScreen); connect(this, &DockView::sessionChanged, this, &DockView::saveConfig); @@ -733,6 +737,21 @@ void DockView::updateFormFactor() } } +bool DockView::dockWinBehavior() const +{ + return m_dockWinBehavior; +} + +void DockView::setDockWinBehavior(bool dock) +{ + if (m_dockWinBehavior == dock) { + return; + } + + m_dockWinBehavior = dock; + emit dockWinBehaviorChanged(); +} + bool DockView::drawShadows() const { return m_drawShadows; @@ -1502,6 +1521,7 @@ void DockView::saveConfig() auto config = this->containment()->config(); config.writeEntry("onPrimary", m_onPrimary); config.writeEntry("session", (int)m_session); + config.writeEntry("dockWindowBehavior", m_dockWinBehavior); this->containment()->configNeedsSaving(); } @@ -1513,6 +1533,7 @@ void DockView::restoreConfig() auto config = this->containment()->config(); setOnPrimary(config.readEntry("onPrimary", true)); setSession((Dock::SessionType)config.readEntry("session", (int)Dock::DefaultSession)); + setDockWinBehavior(config.readEntry("dockWindowBehavior", false)); } //!END configuration functions diff --git a/app/dockview.h b/app/dockview.h index 7fc813dc2..d797cea6c 100644 --- a/app/dockview.h +++ b/app/dockview.h @@ -45,6 +45,7 @@ namespace Latte { class DockView : public PlasmaQuick::ContainmentView { Q_OBJECT + Q_PROPERTY(bool dockWinBehavior READ dockWinBehavior WRITE setDockWinBehavior NOTIFY dockWinBehaviorChanged) Q_PROPERTY(bool drawShadows READ drawShadows WRITE setDrawShadows NOTIFY drawShadowsChanged) Q_PROPERTY(bool drawEffects READ drawEffects WRITE setDrawEffects NOTIFY drawEffectsChanged) Q_PROPERTY(bool onPrimary READ onPrimary WRITE setOnPrimary NOTIFY onPrimaryChanged) @@ -76,7 +77,7 @@ class DockView : public PlasmaQuick::ContainmentView { Q_PROPERTY(Latte::Dock::SessionType session READ session WRITE setSession NOTIFY sessionChanged) public: - DockView(Plasma::Corona *corona, QScreen *targetScreen = nullptr, bool alwaysVisible = false); + DockView(Plasma::Corona *corona, QScreen *targetScreen = nullptr, bool alwaysVisible = false, bool dockWindowBehavior = false); virtual ~DockView(); void init(); @@ -93,6 +94,9 @@ public: int docksCount() const; + bool dockWinBehavior() const; + void setDockWinBehavior(bool dock); + bool drawShadows() const; void setDrawShadows(bool draw); @@ -172,6 +176,7 @@ signals: void currentScreenChanged(); void dockLocationChanged(); void docksCountChanged(); + void dockWinBehaviorChanged(); void drawShadowsChanged(); void drawEffectsChanged(); void effectsAreaChanged(); @@ -214,6 +219,7 @@ private: Plasma::Containment *containmentById(uint id); bool m_forceDrawCenteredBorders{false}; + bool m_dockWinBehavior{false}; bool m_drawShadows{false}; bool m_drawEffects{false}; bool m_onPrimary{true}; diff --git a/shell/contents/configuration/TweaksConfig.qml b/shell/contents/configuration/TweaksConfig.qml index 5344ff77d..5269f01e4 100644 --- a/shell/contents/configuration/TweaksConfig.qml +++ b/shell/contents/configuration/TweaksConfig.qml @@ -89,6 +89,17 @@ PlasmaComponents.Page { } } + PlasmaComponents.CheckBox { + Layout.leftMargin: units.smallSpacing * 2 + text: i18n("Behave as a normal dock window") + checked: dock.dockWinBehavior + tooltip: i18n("Removes the BypassWindowManagerHint flag from the window") + + onClicked: { + dock.dockWinBehavior = checked; + } + } + PlasmaComponents.CheckBox { Layout.leftMargin: units.smallSpacing * 2 text: i18n("Expose Alternative Session in the context menu")