diff --git a/panels/dock/dockhelper.cpp b/panels/dock/dockhelper.cpp index 28eb9f07c..73b82e998 100644 --- a/panels/dock/dockhelper.cpp +++ b/panels/dock/dockhelper.cpp @@ -45,6 +45,13 @@ DockHelper::DockHelper(DockPanel *parent) m_showTimer->start(); } }); + connect(this, &DockHelper::currentActiveWindowFullscreenChanged, this, [this] (bool isFullscreen) { + if (isFullscreen) { + checkNeedHideOrNot(); + } else { + checkNeedShowOrNot(); + } + }); } bool DockHelper::eventFilter(QObject *watched, QEvent *event) @@ -154,8 +161,8 @@ void DockHelper::checkNeedHideOrNot() bool needHide; switch (parent()->hideMode()) { case KeepShowing: { - // KeepShow. current activeWindow is maximized. - needHide = currentActiveWindowMaximized(); + // KeepShow. current activeWindow is fullscreend. + needHide = currentActiveWindowFullscreened(); break; } case SmartHide: { @@ -184,8 +191,8 @@ void DockHelper::checkNeedShowOrNot() bool needShow; switch (parent()->hideMode()) { case KeepShowing: { - // KeepShow. currentWindow is not maximized. - needShow = !currentActiveWindowMaximized(); + // KeepShow. currentWindow is not fullscreened. + needShow = !currentActiveWindowFullscreened(); break; } case SmartHide: { diff --git a/panels/dock/dockhelper.h b/panels/dock/dockhelper.h index 123b5fc59..f1019de0b 100644 --- a/panels/dock/dockhelper.h +++ b/panels/dock/dockhelper.h @@ -24,14 +24,14 @@ class DockHelper : public QObject Q_SIGNALS: void isWindowOverlapChanged(bool overlap); - void currentActiveWindowMaximizedChanged(bool maximized); + void currentActiveWindowFullscreenChanged(bool fullscreen); protected: DockPanel *parent(); [[nodiscard]] virtual DockWakeUpArea *createArea(QScreen *screen) = 0; virtual void destroyArea(DockWakeUpArea *area) = 0; - virtual bool currentActiveWindowMaximized() = 0; + virtual bool currentActiveWindowFullscreened() = 0; virtual bool isWindowOverlap() = 0; private: diff --git a/panels/dock/taskmanager/abstractwindowmonitor.h b/panels/dock/taskmanager/abstractwindowmonitor.h index 527e93086..b87528ce0 100644 --- a/panels/dock/taskmanager/abstractwindowmonitor.h +++ b/panels/dock/taskmanager/abstractwindowmonitor.h @@ -40,6 +40,8 @@ class AbstractWindowMonitor : public QAbstractListModel Q_SIGNALS: void windowAdded(QPointer window); + // true -> At least one window is at fullscreen state. false -> none of the windows is at fullscreen state. + void windowFullscreenChanged(bool); void WindowMonitorShutdown(); private: diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index 799c7328d..fe8206c6b 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -40,6 +40,7 @@ namespace dock { TaskManager::TaskManager(QObject* parent) : DContainment(parent) + , m_windowFullscreen(false) { qRegisterMetaType(); qDBusRegisterMetaType(); @@ -110,6 +111,11 @@ bool TaskManager::init() if (m_windowMonitor) m_windowMonitor->start(); + + connect(m_windowMonitor.data(), &AbstractWindowMonitor::windowFullscreenChanged, this, [this] (bool isFullscreen) { + m_windowFullscreen = isFullscreen; + emit windowFullscreenChanged(isFullscreen); + }); return true; } @@ -299,6 +305,11 @@ bool TaskManager::windowSplit() return Settings->isWindowSplit(); } +bool TaskManager::windowFullscreen() +{ + return m_windowFullscreen; +} + D_APPLET_CLASS(TaskManager) } diff --git a/panels/dock/taskmanager/taskmanager.h b/panels/dock/taskmanager/taskmanager.h index 1e41ad7af..0eeb6240e 100644 --- a/panels/dock/taskmanager/taskmanager.h +++ b/panels/dock/taskmanager/taskmanager.h @@ -21,6 +21,7 @@ class TaskManager : public DS_NAMESPACE::DContainment Q_PROPERTY(ItemModel* dataModel READ dataModel NOTIFY dataModelChanged) Q_PROPERTY(bool windowSplit READ windowSplit NOTIFY windowSplitChanged) + Q_PROPERTY(bool windowFullscreen READ windowFullscreen NOTIFY windowFullscreenChanged) Q_PROPERTY(bool allowForceQuit READ allowForceQuit NOTIFY allowedForceQuitChanged) public: @@ -32,6 +33,7 @@ class TaskManager : public DS_NAMESPACE::DContainment virtual bool load() override; bool windowSplit(); + bool windowFullscreen(); bool allowForceQuit(); Q_INVOKABLE QString desktopIdToAppId(const QString& desktopId); @@ -49,6 +51,7 @@ class TaskManager : public DS_NAMESPACE::DContainment Q_SIGNALS: void dataModelChanged(); void windowSplitChanged(); + void windowFullscreenChanged(bool); void allowedForceQuitChanged(); private Q_SLOTS: @@ -60,6 +63,7 @@ private Q_SLOTS: private: QScopedPointer m_windowMonitor; RoleCombineModel *m_activeAppModel = nullptr; + bool m_windowFullscreen; }; } diff --git a/panels/dock/taskmanager/treelandwindow.cpp b/panels/dock/taskmanager/treelandwindow.cpp index e38cec87a..ff556f920 100644 --- a/panels/dock/taskmanager/treelandwindow.cpp +++ b/panels/dock/taskmanager/treelandwindow.cpp @@ -160,6 +160,11 @@ bool TreeLandWindow::isMinimized() return m_foreignToplevelHandle->state().contains(Minimized); } +bool TreeLandWindow::isFullscreen() +{ + return m_foreignToplevelHandle->state().contains(Fullscreen); +} + bool TreeLandWindow::allowClose() { return true; diff --git a/panels/dock/taskmanager/treelandwindow.h b/panels/dock/taskmanager/treelandwindow.h index e984306c1..4155b7ed2 100644 --- a/panels/dock/taskmanager/treelandwindow.h +++ b/panels/dock/taskmanager/treelandwindow.h @@ -81,6 +81,7 @@ class TreeLandWindow : public AbstractWindow bool isActive() override; bool shouldSkip() override; bool isMinimized() override; + bool isFullscreen(); bool allowClose() override; bool isAttention() override; diff --git a/panels/dock/taskmanager/treelandwindowmonitor.cpp b/panels/dock/taskmanager/treelandwindowmonitor.cpp index e972ac8b6..25f9142fe 100644 --- a/panels/dock/taskmanager/treelandwindowmonitor.cpp +++ b/panels/dock/taskmanager/treelandwindowmonitor.cpp @@ -79,6 +79,7 @@ void TreeLandDockPreviewContext::treeland_dock_preview_context_v1_leave() TreeLandWindowMonitor::TreeLandWindowMonitor(QObject* parent) :AbstractWindowMonitor(parent) + , m_fullscreenState(false) { } @@ -170,6 +171,20 @@ void TreeLandWindowMonitor::handleForeignToplevelHandleAdded() m_windows.insert(id, window); } + connect(window.data(), &AbstractWindow::stateChanged, this, [=] { + for (auto w: m_windows) { + if (w->isFullscreen() && !m_fullscreenState) { + m_fullscreenState = true; + emit windowFullscreenChanged(true); + return; + } + } + if (m_fullscreenState) { + m_fullscreenState = false; + emit windowFullscreenChanged(false); + } + }); + window->setForeignToplevelHandle(handle); if (window->isReady()) diff --git a/panels/dock/taskmanager/treelandwindowmonitor.h b/panels/dock/taskmanager/treelandwindowmonitor.h index 69370927c..5fce4e11c 100644 --- a/panels/dock/taskmanager/treelandwindowmonitor.h +++ b/panels/dock/taskmanager/treelandwindowmonitor.h @@ -84,5 +84,6 @@ private Q_SLOTS: QScopedPointer m_foreignToplevelManager; QScopedPointer m_dockPreview; + bool m_fullscreenState; }; } diff --git a/panels/dock/waylanddockhelper.cpp b/panels/dock/waylanddockhelper.cpp index 21a11b521..e7108ab33 100644 --- a/panels/dock/waylanddockhelper.cpp +++ b/panels/dock/waylanddockhelper.cpp @@ -3,6 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "waylanddockhelper.h" +#include "appletbridge.h" #include "constants.h" #include "dockhelper.h" #include "dockpanel.h" @@ -19,10 +20,14 @@ WaylandDockHelper::WaylandDockHelper(DockPanel *panel) : DockHelper(panel) , m_panel(panel) , m_isWindowOverlap(false) - , m_isCurrentActiveWindowMaximized(false) + , m_isCurrentActiveWindowFullscreened(false) { m_wallpaperColorManager.reset(new WallpaperColorManager(this)); m_ddeShellManager.reset(new TreeLandDDEShellManager()); + DS_NAMESPACE::DAppletBridge bridge("org.deepin.ds.dock.taskmanager"); + if (auto applet = bridge.applet()) { + connect(applet, SIGNAL(windowFullscreenChanged(bool)), this, SLOT(setCurrentActiveWindowFullscreened(bool))); + } connect(m_panel, &DockPanel::rootObjectChanged, this, [this]() { m_wallpaperColorManager->watchScreen(dockScreenName()); @@ -59,8 +64,6 @@ WaylandDockHelper::WaylandDockHelper(DockPanel *panel) if (m_panel->rootObject() != nullptr) { m_wallpaperColorManager->watchScreen(dockScreenName()); } - - // TODO: get taskmanager applet and use it to update m_isCurrentActiveWindowMaximized. } void WaylandDockHelper::updateOverlapCheckerPos() @@ -116,9 +119,15 @@ QString WaylandDockHelper::dockScreenName() return {}; } -bool WaylandDockHelper::currentActiveWindowMaximized() +bool WaylandDockHelper::currentActiveWindowFullscreened() +{ + return m_isCurrentActiveWindowFullscreened; +} + +void WaylandDockHelper::setCurrentActiveWindowFullscreened(bool isFullscreen) { - return m_isCurrentActiveWindowMaximized; + m_isCurrentActiveWindowFullscreened = isFullscreen; + emit currentActiveWindowFullscreenChanged(isFullscreen); } bool WaylandDockHelper::isWindowOverlap() diff --git a/panels/dock/waylanddockhelper.h b/panels/dock/waylanddockhelper.h index 7eb1690b8..163e85fac 100644 --- a/panels/dock/waylanddockhelper.h +++ b/panels/dock/waylanddockhelper.h @@ -32,18 +32,21 @@ class WaylandDockHelper : public DockHelper QString dockScreenName(); protected: - bool currentActiveWindowMaximized() override; + bool currentActiveWindowFullscreened() override; bool isWindowOverlap() override; [[nodiscard]] virtual DockWakeUpArea *createArea(QScreen *screen) override; void destroyArea(DockWakeUpArea *area) override; +protected Q_SLOTS: + void setCurrentActiveWindowFullscreened(bool); + private: void updateOverlapCheckerPos(); private: friend class TreeLandWindowOverlapChecker; bool m_isWindowOverlap; - bool m_isCurrentActiveWindowMaximized; + bool m_isCurrentActiveWindowFullscreened; DockPanel *m_panel; QScopedPointer m_wallpaperColorManager; QScopedPointer m_overlapChecker; diff --git a/panels/dock/x11dockhelper.cpp b/panels/dock/x11dockhelper.cpp index 643647190..e795986c4 100644 --- a/panels/dock/x11dockhelper.cpp +++ b/panels/dock/x11dockhelper.cpp @@ -493,7 +493,7 @@ void X11DockHelper::updateDockArea() } } -bool X11DockHelper::currentActiveWindowMaximized() +bool X11DockHelper::currentActiveWindowFullscreened() { return false; } diff --git a/panels/dock/x11dockhelper.h b/panels/dock/x11dockhelper.h index 633ba8958..53804d2e4 100644 --- a/panels/dock/x11dockhelper.h +++ b/panels/dock/x11dockhelper.h @@ -61,7 +61,7 @@ class X11DockHelper : public DockHelper X11DockHelper(DockPanel *panel); protected: - bool currentActiveWindowMaximized() override; + bool currentActiveWindowFullscreened() override; bool isWindowOverlap() override; [[nodiscard]] DockWakeUpArea *createArea(QScreen *screen) override;