From ebd7ef9c18363d33989f482f83773655917b22fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=9C=8B=E7=A8=8B?= Date: Mon, 25 Jul 2022 11:08:47 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=95=B4=E7=90=86=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 整理代码 对QScreen相关的操作合并到DisplayManager中,便于维护 Log: 整理项目代码,方便维护 Influence: 无 Task: https://pms.uniontech.com/task-view-112769.html Change-Id: I3efbc2bf45fc1f210fd2e1b9908fc76b317eed71 --- frame/display/displaymanager.cpp | 7 ++--- frame/display/displaymanager.h | 12 ++++++++- frame/util/multiscreenworker.cpp | 41 ++++++++++++++++------------- frame/util/multiscreenworker.h | 14 +++++----- frame/window/mainwindow.cpp | 4 +-- tests/util/ut_multiscreenworker.cpp | 31 +++++++++++----------- 6 files changed, 63 insertions(+), 46 deletions(-) diff --git a/frame/display/displaymanager.cpp b/frame/display/displaymanager.cpp index ca7eec38b..472db3c98 100644 --- a/frame/display/displaymanager.cpp +++ b/frame/display/displaymanager.cpp @@ -35,6 +35,7 @@ DisplayManager::DisplayManager(QObject *parent) { connect(qApp, &QApplication::primaryScreenChanged, this, &DisplayManager::primaryScreenChanged); if (Utils::IS_WAYLAND_DISPLAY) { + // TODO wayland下无主屏概念,此方案并不是最优解,窗管如果扩展了这部分协议,我们可以通过协议达成此目的 m_displayInter = new DisplayInter("com.deepin.daemon.Display", "/com/deepin/daemon/Display",QDBusConnection::sessionBus(), this); connect(m_displayInter, &__Display::PrimaryChanged, this, &DisplayManager::dockInfoChanged); connect(m_displayInter, &__Display::DisplayModeChanged, this, &DisplayManager::dockInfoChanged); @@ -152,8 +153,6 @@ bool DisplayManager::isCopyMode() */ void DisplayManager::updateScreenDockInfo() { - // TODO 目前仅仅支持双屏,如果超过双屏,会出现异常,这里可以考虑做成通用的处理规则 - // 先清除原先的数据,然后再更新 m_screenPositionMap.clear(); @@ -189,7 +188,7 @@ void DisplayManager::updateScreenDockInfo() return; } - // 适配多个屏幕的情况 + // 适配任意多个屏幕的情况 for(auto s : m_screens) { QList otherScreens = m_screens; otherScreens.removeAll(s); @@ -290,6 +289,7 @@ void DisplayManager::screenCountChanged() for (auto s : to_remove_list) { disconnect(s); m_screens.removeOne(s); + Q_EMIT screenRemoved(s); } // 创建关联 @@ -312,6 +312,7 @@ void DisplayManager::screenCountChanged() connect(s, &QScreen::refreshRateChanged, this, &DisplayManager::dockInfoChanged); m_screens.append(s); + Q_EMIT screenAdded(s); } // 屏幕数量发生变化,应该刷新一下任务栏的显示 diff --git a/frame/display/displaymanager.h b/frame/display/displaymanager.h index 7cf4d1d18..2a60edbc6 100644 --- a/frame/display/displaymanager.h +++ b/frame/display/displaymanager.h @@ -35,6 +35,14 @@ using namespace Dock; class QScreen; class QTimer; class QGSettings; +/** + * @brief The DisplayManager class + * @note 1、对QScreen信息的获取和监听进行了封装,不应该在此程序的其他处再出现类似的代码,而是从当前实例中进行提供 + * @note 2、对显示相关数据的读写尽可能通过Qt库进行,而不是通过一些DBus服务, + * @note 目的一是为了解耦 + * @note 二是DBus服务的稳定性较低,有部分问题存在 + * @note 三是DBus服务(特指Display相关)刚开始的目的是为了做一些架构和特殊机器的兼容适配工作,因为qt适配开展较慢,所以才有了DBus服务的存在,目前qt已足够稳定,我们不应该再大量使用后端提供的Display服务 + */ class DisplayManager: public QObject, public Singleton { Q_OBJECT @@ -60,8 +68,10 @@ private Q_SLOTS: void onGSettingsChanged(const QString &key); Q_SIGNALS: - void primaryScreenChanged(); + void primaryScreenChanged(QScreen *s); void screenInfoChanged(); // 屏幕信息发生变化,需要调整任务栏显示,只需要这一个信号,其他的都不要,简化流程 + void screenAdded(QScreen *s); + void screenRemoved(QScreen *s); private: QList m_screens; diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index f242000e6..959667b05 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -24,6 +24,8 @@ #include "utils.h" #include "displaymanager.h" +#include + #include #include #include @@ -45,10 +47,9 @@ const QString OnlyShowPrimary = "onlyShowPrimary"; // 保证以下数据更新顺序(大环节顺序不要变,内部还有一些小的调整,比如任务栏显示区域更新的时候,里面内容的布局方向可能也要更新...) // Monitor数据->屏幕是否可停靠更新->监视唤醒区域更新,任务栏显示区域更新->拖拽区域更新->通知后端接口,通知窗管 -MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *helper) +MultiScreenWorker::MultiScreenWorker(QWidget *parent) : QObject(parent) , m_parent(parent) - , m_wmHelper(helper) , m_eventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) , m_extralEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) , m_touchEventInter(new XEventMonitor("com.deepin.api.XEventMonitor", "/com/deepin/api/XEventMonitor", QDBusConnection::sessionBus(), this)) @@ -178,7 +179,7 @@ void MultiScreenWorker::updateDaemonDockSize(int dockSize) m_dockInter->setWindowSizeEfficient(uint(dockSize)); } -void MultiScreenWorker::handleDbusSignal(QDBusMessage msg) +void MultiScreenWorker::handleDBusSignal(QDBusMessage msg) { QList arguments = msg.arguments(); // 参数固定长度 @@ -299,10 +300,12 @@ void MultiScreenWorker::onWindowSizeChanged(uint value) m_monitorUpdateTimer->start(); } -void MultiScreenWorker::primaryScreenChanged() +void MultiScreenWorker::primaryScreenChanged(QScreen *screen) { + Q_ASSERT(screen); + // 先更新主屏信息 - m_ds.updatePrimary(DIS_INS->primary()); + m_ds.updatePrimary(screen->name()); // 无效值 if (DIS_INS->screenRawHeight() == 0 || DIS_INS->screenRawWidth() == 0) { @@ -723,6 +726,8 @@ void MultiScreenWorker::onRequestNotifyWindowManager() if ((!DIS_INS->isCopyMode() && m_ds.current() != m_ds.primary()) || m_hideMode != HideMode::KeepShowing) { lastRect = QRect(); + qInfo() << "clear wm struct"; + if (Utils::IS_WAYLAND_DISPLAY) { QList varList; varList.append(0);//dock位置 @@ -914,7 +919,6 @@ void MultiScreenWorker::initMembers() void MultiScreenWorker::initConnection() { - connect(qApp, &QApplication::primaryScreenChanged, this, &MultiScreenWorker::primaryScreenChanged); connect(DIS_INS, &DisplayManager::primaryScreenChanged, this, &MultiScreenWorker::primaryScreenChanged); connect(DIS_INS, &DisplayManager::screenInfoChanged, this, &MultiScreenWorker::requestUpdateMonitorInfo); @@ -939,7 +943,7 @@ void MultiScreenWorker::initConnection() "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", - this, SLOT(handleDbusSignal(QDBusMessage))); + this, SLOT(handleDBusSignal(QDBusMessage))); #endif connect(this, &MultiScreenWorker::requestUpdateFrontendGeometry, this, &MultiScreenWorker::onRequestUpdateFrontendGeometry); @@ -1068,7 +1072,7 @@ void MultiScreenWorker::displayAnimation(const QString &screen, const Position & ani->setEasingCurve(QEasingCurve::InOutCubic); #ifndef DISABLE_SHOW_ANIMATION - const bool composite = m_wmHelper->hasComposite(); // 判断是否开启特效模式 + const bool composite = DWindowManagerHelper::instance()->hasComposite(); // 判断是否开启特效模式 const int duration = composite ? ANIMATIONTIME : 0; #else const int duration = 0; @@ -1173,7 +1177,7 @@ void MultiScreenWorker::changeDockPosition(QString fromScreen, QString toScreen, ani1->setEasingCurve(QEasingCurve::InOutCubic); ani2->setEasingCurve(QEasingCurve::InOutCubic); - const bool composite = m_wmHelper->hasComposite(); + const bool composite = DWindowManagerHelper::instance()->hasComposite(); #ifndef DISABLE_SHOW_ANIMATION const int duration = composite ? ANIMATIONTIME : 0; #else @@ -1821,32 +1825,33 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY) ScreenChangeMonitor::ScreenChangeMonitor(DockScreen *ds, QObject *parent) : QObject (parent) { - connect(qApp, &QApplication::primaryScreenChanged, this, [ this, ds ](QScreen *primaryScreen) { - if (!primaryScreen) - return; + #define DATETOSTRING(date) date.toString("hh:mm:ss:zzz") + + connect(DIS_INS, &DisplayManager::primaryScreenChanged, this, [ this, ds ](QScreen *primaryScreen) { + Q_ASSERT(primaryScreen); // 在screenAdded之后,又会发送一次主屏幕的变更的信息 - qInfo() << "primary Screen Changed,primary Screen" << primaryScreen->name(); + qInfo() << "primary screen changed, primary Screen" << primaryScreen->name(); if (changedInSeconds()) return; m_lastScreenName = ds->current(); m_changePrimaryName = primaryScreen->name(); m_changeTime = QDateTime::currentDateTime(); - qInfo() << "primary Changed Info:lastScreen:" << m_lastScreenName << "changeTime:" << m_changeTime; + qInfo() << "primary changed from: " << m_lastScreenName << "to: " << DATETOSTRING(m_changeTime); }); - connect(qApp, &QApplication::screenAdded, this, [ this ](QScreen *newScreen) { + connect(DIS_INS, &DisplayManager::screenAdded, this, [ this ](QScreen *newScreen) { if (newScreen) { m_newScreenName = newScreen->name(); m_newTime = QDateTime::currentDateTime(); - qInfo() <<"screen added:" << m_newScreenName << ", added time:" << m_newTime; + qInfo() <<"screen added:" << m_newScreenName << ", time:" << DATETOSTRING(m_newTime); } }); - connect(qApp, &QApplication::screenRemoved, this, [ this ](QScreen *rmScreen) { + connect(DIS_INS, &DisplayManager::screenRemoved, this, [ this ](QScreen *rmScreen) { if (rmScreen) { m_removeScreenName = rmScreen->name(); m_removeTime = QDateTime::currentDateTime(); - qInfo() <<"screen removed:" << m_removeScreenName << ", removed time:" << m_removeTime; + qInfo() <<"screen removed:" << m_removeScreenName << ", time:" << DATETOSTRING(m_removeTime); } }); } diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index adf1c3d26..b9554ffb2 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -31,8 +31,6 @@ #include #include -#include - #include #include #include @@ -130,7 +128,7 @@ public: typedef QFlags RunStates; - MultiScreenWorker(QWidget *parent, DWindowManagerHelper *helper); + MultiScreenWorker(QWidget *parent); void initShow(); @@ -176,9 +174,10 @@ public slots: void onAutoHideChanged(bool autoHide); void updateDaemonDockSize(int dockSize); void onRequestUpdateRegionMonitor(); - void handleDbusSignal(QDBusMessage); private slots: + void handleDBusSignal(QDBusMessage); + // Region Monitor void onRegionMonitorChanged(int x, int y, const QString &key); void onExtralRegionMonitorChanged(int x, int y, const QString &key); @@ -190,7 +189,7 @@ private slots: void updateDisplay(); void onWindowSizeChanged(uint value); - void primaryScreenChanged(); + void primaryScreenChanged(QScreen *screen); void updateParentGeometry(const QVariant &value, const Position &pos); void updateParentGeometry(const QVariant &value); @@ -218,6 +217,7 @@ private slots: private: MainWindow *parent(); + // 初始化数据信息 void initMembers(); void initDBus(); @@ -251,7 +251,6 @@ private: private: QWidget *m_parent; - DWindowManagerHelper *m_wmHelper; // monitor screen XEventMonitor *m_eventInter; @@ -304,6 +303,7 @@ class ScreenChangeMonitor : public QObject public: ScreenChangeMonitor(DockScreen *ds, QObject *parent); ~ScreenChangeMonitor(); + bool needUsedLastScreen() const; const QString lastScreen(); @@ -315,8 +315,10 @@ private: QString m_changePrimaryName; QDateTime m_changeTime; + QString m_newScreenName; QDateTime m_newTime; + QString m_removeScreenName; QDateTime m_removeTime; }; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 5f8f9e507..1a92e56d8 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -82,7 +82,7 @@ MainWindow::MainWindow(QWidget *parent) , m_mainPanel(new MainPanelControl(this)) , m_platformWindowHandle(this) , m_wmHelper(DWindowManagerHelper::instance()) - , m_multiScreenWorker(new MultiScreenWorker(this, m_wmHelper)) + , m_multiScreenWorker(new MultiScreenWorker(this)) , m_menuWorker(new MenuWorker(m_multiScreenWorker->dockInter(), this)) , m_shadowMaskOptimizeTimer(new QTimer(this)) , m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()) @@ -353,7 +353,7 @@ void MainWindow::initConnections() // -拖拽任务栏改变高度或宽度------------------------------------------------------------------------------- connect(m_updateDragAreaTimer, &QTimer::timeout, this, &MainWindow::resetDragWindow); - //TODO 后端考虑删除这块,目前还不能删除,调整任务栏高度的时候,任务栏外部区域有变化 + //TODO 后面考虑删除这块,目前还不能删除,调整任务栏高度的时候,任务栏外部区域有变化 connect(m_updateDragAreaTimer, &QTimer::timeout, m_multiScreenWorker, &MultiScreenWorker::onRequestUpdateRegionMonitor); connect(m_dragWidget, &DragWidget::dragPointOffset, this, [ = ] { qApp->setProperty(DRAG_STATE_PROP, true); }); diff --git a/tests/util/ut_multiscreenworker.cpp b/tests/util/ut_multiscreenworker.cpp index d2aad1eb9..0cde12a00 100644 --- a/tests/util/ut_multiscreenworker.cpp +++ b/tests/util/ut_multiscreenworker.cpp @@ -36,7 +36,7 @@ class Test_MultiScreenWorker : public ::testing::Test TEST_F(Test_MultiScreenWorker, coverage_test) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); qDebug() << worker->dockRect("test screen"); @@ -47,7 +47,7 @@ TEST_F(Test_MultiScreenWorker, coverage_test) worker->updateDaemonDockSize(20); QDBusMessage msg; - worker->handleDbusSignal(msg); + worker->handleDBusSignal(msg); worker->onRegionMonitorChanged(0, 0, worker->m_registerKey); @@ -59,7 +59,6 @@ TEST_F(Test_MultiScreenWorker, coverage_test) worker->checkXEventMonitorService(); worker->showAniFinished(); worker->hideAniFinished(); - worker->primaryScreenChanged(); worker->onRequestUpdateFrontendGeometry(); worker->isCopyMode(); worker->onRequestUpdatePosition(Dock::Position::Top, Dock::Position::Bottom); @@ -74,7 +73,7 @@ TEST_F(Test_MultiScreenWorker, coverage_test) TEST_F(Test_MultiScreenWorker, onDisplayModeChanged) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->onDisplayModeChanged(static_cast(0)); worker->m_hideMode = HideMode::KeepShowing; @@ -99,7 +98,7 @@ TEST_F(Test_MultiScreenWorker, onDisplayModeChanged) TEST_F(Test_MultiScreenWorker, displayAnimation_onRequestUpdateRegionMonitor) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->m_position = Dock::Position::Left; worker->displayAnimation("primary", MultiScreenWorker::AniAction::Show); @@ -138,7 +137,7 @@ TEST_F(Test_MultiScreenWorker, displayAnimation_onRequestUpdateRegionMonitor) TEST_F(Test_MultiScreenWorker, onTouchPress_onTouchRelease) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); QPoint p(0, 0); worker->rawXPosition(p); @@ -174,7 +173,7 @@ TEST_F(Test_MultiScreenWorker, onTouchPress_onTouchRelease) TEST_F(Test_MultiScreenWorker, onDelayAutoHideChanged) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->m_hideMode = HideMode::SmartHide; worker->m_hideState = HideState::Show; @@ -195,7 +194,7 @@ TEST_F(Test_MultiScreenWorker, onDelayAutoHideChanged) TEST_F(Test_MultiScreenWorker, onPositionChanged) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->m_hideMode = HideMode::KeepHidden; worker->onPositionChanged(static_cast(0)); @@ -220,7 +219,7 @@ TEST_F(Test_MultiScreenWorker, onPositionChanged) TEST_F(Test_MultiScreenWorker, reInitDisplayData) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->reInitDisplayData(); @@ -231,7 +230,7 @@ TEST_F(Test_MultiScreenWorker, reInitDisplayData) TEST_F(Test_MultiScreenWorker, onRequestUpdateMonitorInfo) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->onRequestUpdateMonitorInfo(); @@ -242,7 +241,7 @@ TEST_F(Test_MultiScreenWorker, onRequestUpdateMonitorInfo) TEST_F(Test_MultiScreenWorker, updateParentGeometry) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->updateParentGeometry(QRect(0, 0, 10, 10), Position::Top); worker->updateParentGeometry(QRect(0, 0, 10, 10), Position::Bottom); @@ -256,7 +255,7 @@ TEST_F(Test_MultiScreenWorker, updateParentGeometry) TEST_F(Test_MultiScreenWorker, onWindowSizeChanged) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->onWindowSizeChanged(-1); @@ -267,7 +266,7 @@ TEST_F(Test_MultiScreenWorker, onWindowSizeChanged) TEST_F(Test_MultiScreenWorker, updateDisplay) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->updateDisplay(); @@ -278,7 +277,7 @@ TEST_F(Test_MultiScreenWorker, updateDisplay) TEST_F(Test_MultiScreenWorker, onExtralRegionMonitorChanged) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->onExtralRegionMonitorChanged(0, 0, "test"); @@ -300,7 +299,7 @@ TEST_F(Test_MultiScreenWorker, onExtralRegionMonitorChanged) TEST_F(Test_MultiScreenWorker, onRegionMonitorChanged) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->onRegionMonitorChanged(0, 0, "test"); @@ -325,7 +324,7 @@ TEST_F(Test_MultiScreenWorker, dockScreen) TEST_F(Test_MultiScreenWorker, screenworker_test3) { MainWindow window; - MultiScreenWorker *worker = new MultiScreenWorker(&window, DWindowManagerHelper::instance()); + MultiScreenWorker *worker = new MultiScreenWorker(&window); worker->resetDockScreen();