chore: 整理项目代码,方便维护

整理代码
对QScreen相关的操作合并到DisplayManager中,便于维护

Log: 整理项目代码,方便维护
Influence: 无
Task: https://pms.uniontech.com/task-view-112769.html
Change-Id: I3efbc2bf45fc1f210fd2e1b9908fc76b317eed71
This commit is contained in:
范朋程 2022-07-25 11:08:47 +08:00 committed by wubw
parent 044f13a219
commit ebd7ef9c18
6 changed files with 63 additions and 46 deletions

View File

@ -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<QScreen *> 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);
}
// 屏幕数量发生变化,应该刷新一下任务栏的显示

View File

@ -35,6 +35,14 @@ using namespace Dock;
class QScreen;
class QTimer;
class QGSettings;
/**
* @brief The DisplayManager class
* @note 1QScreen信息的获取和监听进行了封装
* @note 2Qt库进行DBus服务
* @note
* @note DBus服务的稳定性较低
* @note DBus服务(Display相关)qt适配开展较慢DBus服务的存在qt已足够稳定使Display服务
*/
class DisplayManager: public QObject, public Singleton<DisplayManager>
{
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<QScreen *> m_screens;

View File

@ -24,6 +24,8 @@
#include "utils.h"
#include "displaymanager.h"
#include <DWindowManagerHelper>
#include <QWidget>
#include <QScreen>
#include <QEvent>
@ -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<QVariant> 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<QVariant> 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);
}
});
}

View File

@ -31,8 +31,6 @@
#include <com_deepin_api_xeventmonitor.h>
#include <com_deepin_dde_launcher.h>
#include <DWindowManagerHelper>
#include <QObject>
#include <QFlag>
#include <QDebug>
@ -130,7 +128,7 @@ public:
typedef QFlags<RunState> 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;
};

View File

@ -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); });

View File

@ -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<DisplayMode>(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<Position>(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();