diff --git a/frame/display/displaymanager.cpp b/frame/display/displaymanager.cpp index c71cc2c4f..6a1053b0f 100644 --- a/frame/display/displaymanager.cpp +++ b/frame/display/displaymanager.cpp @@ -116,6 +116,28 @@ bool DisplayManager::canDock(QScreen *s, Position pos) const return s ? m_screenPositionMap[s].value(pos) : false; } +/**判断屏幕是否为复制模式的依据,第一个屏幕的X和Y值是否和其他的屏幕的X和Y值相等 + * 对于复制模式,这两个值肯定是相等的,如果不是复制模式,这两个值肯定不等,目前支持双屏 + * @brief DisplayManager::isCopyMode + * @return + */ +bool DisplayManager::isCopyMode() +{ + QList screens = this->screens(); + if (screens.size() < 2) + return false; + + // 在多个屏幕的情况下,如果所有屏幕的位置的X和Y值都相等,则认为是复制模式 + QRect screenRect = screens[0]->availableGeometry(); + for (int i = 1; i < screens.size(); i++) { + QRect rect = screens[i]->availableGeometry(); + if (screenRect.x() != rect.x() || screenRect.y() != rect.y()) + return false; + } + + return true; +} + /** * @brief DisplayManager::updateScreenDockInfo * 更新屏幕停靠信息 diff --git a/frame/display/displaymanager.h b/frame/display/displaymanager.h index c8d030b70..cd9929484 100644 --- a/frame/display/displaymanager.h +++ b/frame/display/displaymanager.h @@ -49,6 +49,7 @@ public: int screenRawWidth() const; int screenRawHeight() const; bool canDock(QScreen *s, Position pos) const; + bool isCopyMode(); private: void updateScreenDockInfo(); diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index bfd7cf368..8d70f8651 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -21,6 +21,7 @@ #include "menuworker.h" #include "dockitemmanager.h" #include "utils.h" +#include "displaymanager.h" #include #include @@ -28,6 +29,8 @@ #include +#define DIS_INS DisplayManager::instance() + MenuWorker::MenuWorker(DBusDock *dockInter,QWidget *parent) : QObject (parent) , m_dockInter(dockInter) @@ -208,6 +211,39 @@ QMenu *MenuWorker::createMenu() settingsMenu->addAction(hideSubMenuAct); } + // 多屏显示设置 仅多屏扩展模式显示菜单 + if ((!menuSettings || !menuSettings->keys().contains("multiscreenVisible") || menuSettings->get("multiscreenVisible").toBool()) + && !DIS_INS->isCopyMode()) { + bool onlyShowPrimary = Utils::SettingValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", "onlyShowPrimary", false).toBool(); + + QMenu *displaySubMenu = new QMenu(settingsMenu); + displaySubMenu->setAccessibleName("displaysubmenu"); + + QAction *onlyPrimaryScreenModeAct = new QAction(tr("Only on main screen"), this); + QAction *followMouseModeAct = new QAction(tr("On screen where the cursor is"), this); + + onlyPrimaryScreenModeAct->setCheckable(true); + followMouseModeAct->setCheckable(true); + + onlyPrimaryScreenModeAct->setChecked(onlyShowPrimary); + followMouseModeAct->setChecked(!onlyShowPrimary); + + connect(onlyPrimaryScreenModeAct, &QAction::triggered, this, [ = ]{ + Utils::SettingSaveValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", "onlyShowPrimary", true); + }); + connect(followMouseModeAct, &QAction::triggered, this, [ = ]{ + Utils::SettingSaveValue("com.deepin.dde.dock.mainwindow", "/com/deepin/dde/dock/mainwindow/", "onlyShowPrimary", false); + }); + + displaySubMenu->addAction(onlyPrimaryScreenModeAct); + displaySubMenu->addAction(followMouseModeAct); + + QAction *act = new QAction(tr("Show the Dock"), this); + act->setMenu(displaySubMenu); + + settingsMenu->addAction(act); + } + delete menuSettings; menuSettings = nullptr; diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index 0464dd332..8f3ce2e8f 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -690,27 +690,6 @@ void MultiScreenWorker::onRequestUpdateFrontendGeometry() emit requestUpdateDockEntry(); } -/** - * @brief 判断屏幕是否为复制模式的依据,第一个屏幕的X和Y值是否和其他的屏幕的X和Y值相等 - * 对于复制模式,这两个值肯定是相等的,如果不是复制模式,这两个值肯定不等,目前支持双屏 - */ -static bool isCopyMode() -{ - QList screens = DIS_INS->screens(); - if (screens.size() < 2) - return false; - - // 在多个屏幕的情况下,如果所有屏幕的位置的X和Y值都相等,则认为是复制模式 - QRect rect0 = screens[0]->availableGeometry(); - for (int i = 1; i < screens.size(); i++) { - QRect rect = screens[i]->availableGeometry(); - if (rect0.x() != rect.x() || rect0.y() != rect.y()) - return false; - } - - return true; -} - /** * @brief 这里用到xcb去设置任务栏的高度,比较特殊,参考_NET_WM_STRUT_PARTIAL属性 * 在屏幕旋转后,所有参数以控制中心自定义设置里主屏显示的图示为准(旋转不用特殊处理) @@ -722,7 +701,7 @@ void MultiScreenWorker::onRequestNotifyWindowManager() static int lastScreenHeight = 0; /* 在非主屏或非一直显示状态时,清除任务栏区域,不挤占应用 */ - if ((!isCopyMode() && m_ds.current() != m_ds.primary()) || m_hideMode != HideMode::KeepShowing) { + if ((!DIS_INS->isCopyMode() && m_ds.current() != m_ds.primary()) || m_hideMode != HideMode::KeepShowing) { lastRect = QRect(); const auto display = QX11Info::display(); diff --git a/frame/util/utils.h b/frame/util/utils.h index c2b3c0e99..98f244a13 100644 --- a/frame/util/utils.h +++ b/frame/util/utils.h @@ -38,7 +38,8 @@ namespace Utils { * @param parent 创建指针的付对象 * @return */ -inline const QGSettings *SettingsPtr(const QString &schema_id, const QByteArray &path = QByteArray(), QObject *parent = nullptr) { +inline QGSettings *SettingsPtr(const QString &schema_id, const QByteArray &path = QByteArray(), QObject *parent = nullptr) +{ if (QGSettings::isSchemaInstalled(schema_id.toUtf8())) { QGSettings *settings = new QGSettings(schema_id.toUtf8(), path, parent); return settings; @@ -54,7 +55,8 @@ inline const QGSettings *SettingsPtr(const QString &schema_id, const QByteArray * @param parent 创建指针的付对象 * @return */ -inline const QGSettings *ModuleSettingsPtr(const QString &module, const QByteArray &path = QByteArray(), QObject *parent = nullptr) { +inline const QGSettings *ModuleSettingsPtr(const QString &module, const QByteArray &path = QByteArray(), QObject *parent = nullptr) +{ return SettingsPtr("com.deepin.dde.dock.module." + module, path, parent); } @@ -90,7 +92,8 @@ inline QString qtify_name(const char *name) * @param fallback 如果找不到信息,返回此默认值 * @return */ -inline const QVariant SettingValue(const QString &schema_id, const QByteArray &path = QByteArray(), const QString &key = QString(), const QVariant &fallback = QVariant()){ +inline const QVariant SettingValue(const QString &schema_id, const QByteArray &path = QByteArray(), const QString &key = QString(), const QVariant &fallback = QVariant()) +{ const QGSettings *settings = SettingsPtr(schema_id, path); if (settings && ((settings->keys().contains(key)) || settings->keys().contains(qtify_name(key.toUtf8().data())))) { @@ -101,11 +104,34 @@ inline const QVariant SettingValue(const QString &schema_id, const QByteArray &p qDebug() << "Cannot find gsettings, schema_id:" << schema_id << " path:" << path << " key:" << key << "Use fallback value:" << fallback; + // 如果settings->keys()不包含key则会存在内存泄露,所以需要释放 + if (settings) + delete settings; + return fallback; } } -inline QPixmap renderSVG(const QString &path, const QSize &size, const qreal devicePixelRatio) { +inline bool SettingSaveValue(const QString &schema_id, const QByteArray &path, const QString &key, const QVariant &value) +{ + QGSettings *settings = SettingsPtr(schema_id, path); + + if (settings && ((settings->keys().contains(key)) || settings->keys().contains(qtify_name(key.toUtf8().data())))) { + settings->set(key, value); + delete settings; + return true; + } else{ + qDebug() << "Cannot find gsettings, schema_id:" << schema_id + << " path:" << path << " key:" << key; + if (settings) + delete settings; + + return false; + } +} + +inline QPixmap renderSVG(const QString &path, const QSize &size, const qreal devicePixelRatio) +{ QImageReader reader; QPixmap pixmap; reader.setFileName(path); @@ -146,7 +172,8 @@ inline QScreen *screenAtByScaled(const QPoint &point) { return nullptr; } -inline bool isSettingConfigured(const QString& id, const QString& path, const QString& keyName) { +inline bool isSettingConfigured(const QString& id, const QString& path, const QString& keyName) +{ if (!QGSettings::isSchemaInstalled(id.toUtf8())) { return false; } @@ -164,7 +191,8 @@ inline bool isSettingConfigured(const QString& id, const QString& path, const QS * @param pluginApi2 第二个插件版本号 * @return 0:两个版本号相等,1:第一个版本号大,-1:第二个版本号大 */ -inline int comparePluginApi(const QString &pluginApi1, const QString &pluginApi2) { +inline int comparePluginApi(const QString &pluginApi1, const QString &pluginApi2) +{ // 版本号相同 if (pluginApi1 == pluginApi2) return 0; diff --git a/gschema/com.deepin.dde.dock.module.gschema.xml b/gschema/com.deepin.dde.dock.module.gschema.xml index 070336506..2fb89e0de 100644 --- a/gschema/com.deepin.dde.dock.module.gschema.xml +++ b/gschema/com.deepin.dde.dock.module.gschema.xml @@ -410,6 +410,13 @@ Control Module Visible + + true + Multiscreen Visible + + Control Multiscreen Visible + +