mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +00:00
feat: 任务栏增加多屏配置处理逻辑
多屏位置切换时间配置+固定屏幕显示配置 Log: 任务栏增加多屏配置处理逻辑 Task: https://pms.uniontech.com/zentao/task-view-37417.html Change-Id: I9c272b95866addaeb49c78fa64e5f889074f8f4d Reviewed-on: http://gerrit.uniontech.com/c/dde-dock/+/4724 Reviewed-by: <mailman@uniontech.com> Reviewed-by: fanpengcheng <fanpengcheng@uniontech.com> Tested-by: <mailman@uniontech.com>
This commit is contained in:
parent
c5b030348a
commit
5a586988fa
@ -31,6 +31,9 @@
|
||||
|
||||
#include <QDBusConnection>
|
||||
|
||||
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<void (MultiScreenWorker::*)(const QVariant &value)>(&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();
|
||||
}
|
||||
}
|
||||
|
@ -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<Monitor *, MonitorInter *> data() {return m_monitorInfo;}
|
||||
inline QMap<Monitor *, MonitorInter *> data() {return m_monitorInfo;}
|
||||
|
||||
/**
|
||||
* @brief validMonitor
|
||||
@ -89,12 +90,14 @@ public:
|
||||
QMapIterator<Monitor *, MonitorInter *>it(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<Monitor *, MonitorInter *> 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;
|
||||
|
@ -291,4 +291,16 @@
|
||||
</description>
|
||||
</key>
|
||||
</schema>
|
||||
<schema path="/com/deepin/dde/dock/mainwidow/" id="com.deepin.dde.dock.mainwidow" gettext-domain="DDE">
|
||||
<key type="u" name="monitors-switch-time">
|
||||
<default>2000</default>
|
||||
<summary>Unit: ms</summary>
|
||||
<description>Control duration of dock switch in monitors</description>
|
||||
</key>
|
||||
<key type="b" name="only-show-primary">
|
||||
<default>false</default>
|
||||
<summary></summary>
|
||||
<description>Determine to show dock only in primary monitor</description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
|
Loading…
x
Reference in New Issue
Block a user