diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index c71ff0b55..d3bdc0011 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -31,6 +31,9 @@ #include +const QString MonitorsSwitchTime = "monitorsSwitchTime"; +const QString OnlyShowPrimary = "onlyShowPrimary"; + // 保证以下数据更新顺序(大环节顺序不要变,内部还有一些小的调整,比如任务栏显示区域更新的时候,里面内容的布局方向可能也要更新...) // Monitor数据->屏幕是否可停靠更新->监视唤醒区域更新,任务栏显示区域更新->拖拽区域更新->通知后端接口,通知窗管 @@ -48,6 +51,7 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help , m_launcherInter(new DBusLuncher("com.deepin.dde.Launcher", "/com/deepin/dde/Launcher", QDBusConnection::sessionBus())) , m_monitorUpdateTimer(new QTimer(this)) , m_delayTimer(new QTimer(this)) + , m_monitorSetting(nullptr) , m_showAni(new QVariantAnimation(this)) , m_hideAni(new QVariantAnimation(this)) , m_ds(m_displayInter->primary()) @@ -58,6 +62,7 @@ MultiScreenWorker::MultiScreenWorker(QWidget *parent, DWindowManagerHelper *help { qDebug() << "init dock screen: " << m_ds.current(); initMembers(); + initGSettingConfig(); initDBus(); initConnection(); initDisplayData(); @@ -339,6 +344,7 @@ void MultiScreenWorker::primaryScreenChanged() { // 先更新主屏信息 m_ds.updatePrimary(m_displayInter->primary()); + m_mtrInfo.setPrimary(m_displayInter->primary()); const int screenRawHeight = m_displayInter->screenHeight(); const int screenRawWidth = m_displayInter->screenWidth(); @@ -914,6 +920,26 @@ void MultiScreenWorker::initMembers() checkXEventMonitorService(); } +void MultiScreenWorker::initGSettingConfig() +{ + if (QGSettings::isSchemaInstalled("com.deepin.dde.dock.mainwidow")) { + m_monitorSetting = new QGSettings("com.deepin.dde.dock.mainwidow", "/com/deepin/dde/dock/mainwidow/", this); + if (m_monitorSetting->keys().contains(MonitorsSwitchTime)) { + m_delayTimer->setInterval(m_monitorSetting->get(MonitorsSwitchTime).toInt()); + } else { + qDebug() << "can not find key:" << MonitorsSwitchTime; + } + + if (m_monitorSetting->keys().contains(OnlyShowPrimary)) { + m_mtrInfo.setShowInPrimary(m_monitorSetting->get(OnlyShowPrimary).toBool()); + } else { + qDebug() << "can not find key:" << OnlyShowPrimary; + } + } else { + qDebug() << "com.deepin.dde.dock is uninstalled."; + } +} + void MultiScreenWorker::initConnection() { connect(m_showAni, &QVariantAnimation::valueChanged, this, static_cast(&MultiScreenWorker::updateParentGeometry)); @@ -990,6 +1016,8 @@ void MultiScreenWorker::initConnection() // 通知窗管 emit requestNotifyWindowManager(); }); + + connect(m_monitorSetting, &QGSettings::changed, this, &MultiScreenWorker::onConfigChange); } void MultiScreenWorker::initUI() @@ -1029,6 +1057,7 @@ void MultiScreenWorker::initDBus() m_screenRawHeight = m_displayInter->screenHeight(); m_screenRawWidth = m_displayInter->screenWidth(); m_ds = DockScreen(m_displayInter->primary()); + m_mtrInfo.setPrimary(m_displayInter->primary()); } } @@ -1759,10 +1788,10 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY) // 任务栏显示状态,但需要切换屏幕 if (toScreen != m_ds.current()) { - m_delayScreen = toScreen; - - if (!m_delayTimer->isActive()) + if (!m_delayTimer->isActive()) { + m_delayScreen = toScreen; m_delayTimer->start(); + } } else { // 任务栏隐藏状态,但需要显示 if (hideMode() == HideMode::KeepShowing) { @@ -1790,3 +1819,14 @@ void MultiScreenWorker::hideAni(const QString &screen) { return hideAni(screen, m_position, m_displayMode); } + +void MultiScreenWorker::onConfigChange(const QString &changeKey) +{ + if (changeKey == MonitorsSwitchTime) { + m_delayTimer->setInterval(m_monitorSetting->get(MonitorsSwitchTime).toInt()); + } else if (changeKey == OnlyShowPrimary) { + m_mtrInfo.setShowInPrimary(m_monitorSetting->get(OnlyShowPrimary).toBool()); + // 每次切换都更新一下屏幕显示的信息 + emit requestUpdateMonitorInfo(); + } +} diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index efa9c8dd1..59d7432d7 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -41,9 +41,9 @@ #define WINDOWMARGIN ((m_displayMode == Dock::Efficient) ? 0 : 10) #define ANIMATIONTIME 300 #define FREE_POINT(p) if (p) {\ -delete p;\ -p = nullptr;\ -}\ + delete p;\ + p = nullptr;\ + }\ DGUI_USE_NAMESPACE /** @@ -62,6 +62,7 @@ class QVariantAnimation; class QWidget; class QTimer; class MainWindow; +class QGSettings; /** * @brief The MonitorInfo class @@ -77,7 +78,7 @@ public: * @brief data * @return 所有的显示器信息 */ - inline const QMap data() {return m_monitorInfo;} + inline QMap data() {return m_monitorInfo;} /** * @brief validMonitor @@ -89,12 +90,14 @@ public: QMapIteratorit(m_monitorInfo); while (it.hasNext()) { it.next(); - if (it.key()->enable()) + // 仅显示在主屏的情况下,可用屏幕信息只提供主屏幕 + if ((!m_showInPrimary && it.key()->enable()) + || (m_showInPrimary && it.key()->name() == m_primary)) { list << it.key(); + } } return list; } - /** * @brief insert 插入新的屏幕信息 * @param mon 插入的屏幕信息 @@ -106,7 +109,6 @@ public: Q_EMIT monitorChanged(); } - /** * @brief remove 删除显示其信息 * @param mon 待删除的数据 @@ -119,6 +121,24 @@ public: Q_EMIT monitorChanged(); } + /** + * @brief setShowInPrimary 设置仅显示在主屏 + * @param showIn + */ + void setShowInPrimary(const bool &showIn) + { + if (m_showInPrimary != showIn) + m_showInPrimary = showIn; + } + /** + * @brief setPrimary 记录一下主屏信息 + * @param primary + */ + void setPrimary(const QString &primary) + { + if (m_primary != primary) + m_primary = primary; + } signals: /** @@ -128,6 +148,8 @@ signals: private: QMap m_monitorInfo; + QString m_primary; + bool m_showInPrimary = false; }; /** @@ -316,9 +338,13 @@ private slots: void onTouchPress(int type, int x, int y, const QString &key); void onTouchRelease(int type, int x, int y, const QString &key); + // gsetting配置改变响应槽 + void onConfigChange(const QString &changeKey); + private: // 初始化数据信息 void initMembers(); + void initGSettingConfig(); void initDBus(); void initConnection(); void initUI(); @@ -431,7 +457,9 @@ private: // update monitor info QTimer *m_monitorUpdateTimer; - QTimer *m_delayTimer; // sp3需求,切换屏幕显示延时2秒唤起任务栏 + QTimer *m_delayTimer; // sp3需求,切换屏幕显示延时,默认2秒唤起任务栏 + + QGSettings *m_monitorSetting; // 多屏配置控制 // animation QVariantAnimation *m_showAni; diff --git a/gschema/com.deepin.dde.dock.module.gschema.xml b/gschema/com.deepin.dde.dock.module.gschema.xml index 73a90abc5..5f7acc912 100644 --- a/gschema/com.deepin.dde.dock.module.gschema.xml +++ b/gschema/com.deepin.dde.dock.module.gschema.xml @@ -291,4 +291,16 @@ + + + 2000 + Unit: ms + Control duration of dock switch in monitors + + + false + + Determine to show dock only in primary monitor + +