fix: 修复任务栏写入后端接口数据错误,导致启动器显示位置异常问题

写入后端接口的数据是计算了缩放的,但启动器又计算了一遍,导致计算位置错误

Log: 修复启动器显示位置异常的问题
Change-Id: Ib1ff62f100cc1145bf0d39cfa03730ad08715cfc
Reviewed-on: http://gerrit.uniontech.com/c/dde-dock/+/1461
Reviewed-by: fanpengcheng <fanpengcheng@uniontech.com>
Tested-by: fanpengcheng <fanpengcheng@uniontech.com>
This commit is contained in:
Fan PengCheng 2020-08-07 23:07:35 +08:00 committed by fanpengcheng
parent 913e60a8cd
commit 1170afd823
3 changed files with 191 additions and 89 deletions

View File

@ -112,6 +112,14 @@ QRect MultiScreenWorker::dockRect(const QString &screenName)
return dockRect(screenName, m_position, m_hideMode, m_displayMode); return dockRect(screenName, m_position, m_hideMode, m_displayMode);
} }
QRect MultiScreenWorker::realDockRect(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode)
{
if (hideMode == HideMode::KeepShowing)
return getDockShowGeometry(screenName, pos, displayMode, true);
else
return getDockHideGeometry(screenName, pos, displayMode, true);
}
void MultiScreenWorker::handleLeaveEvent(QEvent *event) void MultiScreenWorker::handleLeaveEvent(QEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);
@ -403,7 +411,7 @@ void MultiScreenWorker::showAniFinished()
parent()->panel()->setFixedSize(rect.size()); parent()->panel()->setFixedSize(rect.size());
parent()->panel()->move(0, 0); parent()->panel()->move(0, 0);
emit requestUpdateFrontendGeometry(rect); emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager(); emit requestNotifyWindowManager();
emit requestUpdateDragArea(); emit requestUpdateDragArea();
} }
@ -418,9 +426,7 @@ void MultiScreenWorker::hideAniFinished()
parent()->panel()->setFixedSize(rect.size()); parent()->panel()->setFixedSize(rect.size());
parent()->panel()->move(0, 0); parent()->panel()->move(0, 0);
const QRect frontedRect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); emit requestUpdateFrontendGeometry();
emit requestUpdateFrontendGeometry(frontedRect);
emit requestNotifyWindowManager(); emit requestNotifyWindowManager();
} }
@ -492,7 +498,7 @@ void MultiScreenWorker::onDisplayModeChanged()
emit displayModeChanegd(); emit displayModeChanegd();
emit requestUpdateRegionMonitor(); emit requestUpdateRegionMonitor();
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode)); emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager(); emit requestNotifyWindowManager();
} }
@ -507,8 +513,7 @@ void MultiScreenWorker::onHideModeChanged()
m_hideMode = hideMode; m_hideMode = hideMode;
const QRect frontedRect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); emit requestUpdateFrontendGeometry();
emit requestUpdateFrontendGeometry(frontedRect);
emit requestNotifyWindowManager(); emit requestNotifyWindowManager();
} }
@ -609,17 +614,19 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor()
m_registerKey = m_eventInter->RegisterAreas(m_monitorRectList, flags); m_registerKey = m_eventInter->RegisterAreas(m_monitorRectList, flags);
} }
void MultiScreenWorker::onRequestUpdateFrontendGeometry(const QRect &rect) void MultiScreenWorker::onRequestUpdateFrontendGeometry()
{ {
const QRect rect = realDockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode);
//!!! 向com.deepin.dde.daemon.Dock的SetFrontendWindowRect接口设置区域时,此区域的高度或宽度不能为0,否则会导致其HideState属性循环切换,造成任务栏循环显示或隐藏 //!!! 向com.deepin.dde.daemon.Dock的SetFrontendWindowRect接口设置区域时,此区域的高度或宽度不能为0,否则会导致其HideState属性循环切换,造成任务栏循环显示或隐藏
if (rect.width() == 0 || rect.height() == 0) if (rect.width() == 0 || rect.height() == 0)
return; return;
const qreal scale = scaleByName(m_ds.current());
#ifdef QT_DEBUG #ifdef QT_DEBUG
qDebug() << rect; qDebug() << rect;
#endif #endif
m_dockInter->SetFrontendWindowRect(int(rect.x() / scale), int(rect.y() / scale), uint(rect.width() / scale), uint(rect.height() / scale));
m_dockInter->SetFrontendWindowRect(int(rect.x()), int(rect.y()), uint(rect.width()), uint(rect.height()));
} }
void MultiScreenWorker::onRequestNotifyWindowManager() void MultiScreenWorker::onRequestNotifyWindowManager()
@ -883,8 +890,7 @@ void MultiScreenWorker::initConnection()
connect(m_dockInter, &DBusDock::ServiceRestarted, this, [ = ] { connect(m_dockInter, &DBusDock::ServiceRestarted, this, [ = ] {
autosetDockScreen(); autosetDockScreen();
const QRect frontedRect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode); emit requestUpdateFrontendGeometry();
emit requestUpdateFrontendGeometry(frontedRect);
}); });
connect(m_dockInter, &DBusDock::OpacityChanged, this, &MultiScreenWorker::onOpacityChanged); connect(m_dockInter, &DBusDock::OpacityChanged, this, &MultiScreenWorker::onOpacityChanged);
connect(m_dockInter, &DBusDock::WindowSizeEfficientChanged, this, &MultiScreenWorker::onWindowSizeChanged); connect(m_dockInter, &DBusDock::WindowSizeEfficientChanged, this, &MultiScreenWorker::onWindowSizeChanged);
@ -928,7 +934,7 @@ void MultiScreenWorker::initConnection()
parent()->panel()->setFixedSize(dockRect(m_ds.current()).size()); parent()->panel()->setFixedSize(dockRect(m_ds.current()).size());
parent()->panel()->move(0, 0); parent()->panel()->move(0, 0);
// 通知后端 // 通知后端
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode)); emit requestUpdateFrontendGeometry();
// 拖拽区域 // 拖拽区域
emit requestUpdateDragArea(); emit requestUpdateDragArea();
// 监控区域 // 监控区域
@ -962,8 +968,7 @@ void MultiScreenWorker::showAni(const QString &screen)
{ {
if (m_showAni->state() == QVariantAnimation::Running || m_aniStart) if (m_showAni->state() == QVariantAnimation::Running || m_aniStart)
return; return;
emit requestUpdateFrontendGeometry();
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode));
/************************************************************************ /************************************************************************
* *
@ -1131,7 +1136,7 @@ void MultiScreenWorker::changeDockPosition(QString fromScreen, QString toScreen,
// 结束之后需要根据确定需要再隐藏 // 结束之后需要根据确定需要再隐藏
emit showAniFinished(); emit showAniFinished();
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode)); emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager(); emit requestNotifyWindowManager();
}); });
@ -1240,45 +1245,86 @@ MainWindow *MultiScreenWorker::parent()
return static_cast<MainWindow *>(m_parent); return static_cast<MainWindow *>(m_parent);
} }
QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode) QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool real)
{ {
//!!! 注意,目前双屏情况下缩放保持一致,不会出现两个屏幕的缩放不一致的情况,如果后面出现了,那么这里可能会有问题 //!!! 注意,目前双屏情况下缩放保持一致,不会出现两个屏幕的缩放不一致的情况,如果后面出现了,那么这里可能会有问题
const qreal scale = screenByName(screenName)->devicePixelRatio(); const qreal scale = screenByName(screenName)->devicePixelRatio();
QRect rect; QRect rect;
foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
if (inter->name() == screenName) {
const int dockSize = int(displaymode == DisplayMode::Fashion ? m_dockInter->windowSizeFashion() : m_dockInter->windowSizeEfficient());
switch (static_cast<Position>(pos)) { if (real) {
case Top: { foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
rect.setX(inter->x() + WINDOWMARGIN); if (inter->name() == screenName) {
rect.setY(inter->y() + WINDOWMARGIN); const int dockSize = int(displaymode == DisplayMode::Fashion ? m_dockInter->windowSizeFashion() : m_dockInter->windowSizeEfficient());
rect.setWidth(inter->w() / scale - 2 * WINDOWMARGIN);
rect.setHeight(dockSize); switch (static_cast<Position>(pos)) {
case Top: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(inter->w() - 2 * WINDOWMARGIN);
rect.setHeight(dockSize);
}
break;
case Bottom: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + inter->h() - WINDOWMARGIN - dockSize);
rect.setWidth(inter->w() - 2 * WINDOWMARGIN);
rect.setHeight(dockSize);
}
break;
case Left: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(dockSize);
rect.setHeight(inter->h() - 2 * WINDOWMARGIN);
}
break;
case Right: {
rect.setX(inter->x() + inter->w() - WINDOWMARGIN - dockSize);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(dockSize);
rect.setHeight(inter->h() - 2 * WINDOWMARGIN);
}
}
break;
} }
break; }
case Bottom: { }
rect.setX(inter->x() + WINDOWMARGIN); else {
rect.setY(inter->y() + inter->h() / scale - WINDOWMARGIN - dockSize); foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
rect.setWidth(inter->w() / scale - 2 * WINDOWMARGIN); if (inter->name() == screenName) {
rect.setHeight(dockSize); const int dockSize = int(displaymode == DisplayMode::Fashion ? m_dockInter->windowSizeFashion() : m_dockInter->windowSizeEfficient());
switch (static_cast<Position>(pos)) {
case Top: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(inter->w() / scale - 2 * WINDOWMARGIN);
rect.setHeight(dockSize);
}
break;
case Bottom: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + inter->h() / scale - WINDOWMARGIN - dockSize);
rect.setWidth(inter->w() / scale - 2 * WINDOWMARGIN);
rect.setHeight(dockSize);
}
break;
case Left: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(dockSize);
rect.setHeight(inter->h() / scale - 2 * WINDOWMARGIN);
}
break;
case Right: {
rect.setX(inter->x() + inter->w() / scale - WINDOWMARGIN - dockSize);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(dockSize);
rect.setHeight(inter->h() / scale - 2 * WINDOWMARGIN);
}
}
break;
} }
break;
case Left: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(dockSize);
rect.setHeight(inter->h() / scale - 2 * WINDOWMARGIN);
}
break;
case Right: {
rect.setX(inter->x() + inter->w() / scale - WINDOWMARGIN - dockSize);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(dockSize);
rect.setHeight(inter->h() / scale - 2 * WINDOWMARGIN);
}
}
break;
} }
} }
@ -1289,44 +1335,86 @@ QRect MultiScreenWorker::getDockShowGeometry(const QString &screenName, const Po
return rect; return rect;
} }
QRect MultiScreenWorker::getDockHideGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode) QRect MultiScreenWorker::getDockHideGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool real)
{ {
//!!! 注意,目前双屏情况下缩放保持一致,不会出现两个屏幕的缩放不一致的情况,如果后面出现了,那么这里可能会有问题 //!!! 注意,目前双屏情况下缩放保持一致,不会出现两个屏幕的缩放不一致的情况,如果后面出现了,那么这里可能会有问题
const qreal scale = screenByName(screenName)->devicePixelRatio(); const qreal scale = screenByName(screenName)->devicePixelRatio();
QRect rect; QRect rect;
foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
if (inter->name() == screenName) {
const int margin = (displaymode == DisplayMode::Fashion ? WINDOWMARGIN : 0);
switch (static_cast<Position>(pos)) { if (real) {
case Top: { foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
rect.setX(inter->x() + margin); if (inter->name() == screenName) {
rect.setY(inter->y()); const int margin = (displaymode == DisplayMode::Fashion ? WINDOWMARGIN : 0);
rect.setWidth(inter->w() / scale - 2 * margin);
rect.setHeight(0); switch (static_cast<Position>(pos)) {
case Top: {
rect.setX(inter->x() + margin);
rect.setY(inter->y());
rect.setWidth(inter->w() - 2 * margin);
rect.setHeight(0);
}
break;
case Bottom: {
rect.setX(inter->x() + margin);
rect.setY(inter->y() + inter->h());
rect.setWidth(inter->w() - 2 * margin);
rect.setHeight(0);
}
break;
case Left: {
rect.setX(inter->x());
rect.setY(inter->y() + margin);
rect.setWidth(0);
rect.setHeight(inter->h() - 2 * margin);
}
break;
case Right: {
rect.setX(inter->x() + inter->w());
rect.setY(inter->y() + margin);
rect.setWidth(0);
rect.setHeight(inter->h() - 2 * margin);
}
break;
}
} }
break; }
case Bottom: {
rect.setX(inter->x() + margin); }
rect.setY(inter->y() + inter->h() / scale); else {
rect.setWidth(inter->w() / scale - 2 * margin); foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
rect.setHeight(0); if (inter->name() == screenName) {
} const int margin = (displaymode == DisplayMode::Fashion ? WINDOWMARGIN : 0);
break;
case Left: { switch (static_cast<Position>(pos)) {
rect.setX(inter->x()); case Top: {
rect.setY(inter->y() + margin); rect.setX(inter->x() + margin);
rect.setWidth(0); rect.setY(inter->y());
rect.setHeight(inter->h() / scale - 2 * margin); rect.setWidth(inter->w() / scale - 2 * margin);
} rect.setHeight(0);
break; }
case Right: { break;
rect.setX(inter->x() + inter->w() / scale); case Bottom: {
rect.setY(inter->y() + margin); rect.setX(inter->x() + margin);
rect.setWidth(0); rect.setY(inter->y() + inter->h() / scale);
rect.setHeight(inter->h() / scale - 2 * margin); rect.setWidth(inter->w() / scale - 2 * margin);
} rect.setHeight(0);
break; }
break;
case Left: {
rect.setX(inter->x());
rect.setY(inter->y() + margin);
rect.setWidth(0);
rect.setHeight(inter->h() / scale - 2 * margin);
}
break;
case Right: {
rect.setX(inter->x() + inter->w() / scale);
rect.setY(inter->y() + margin);
rect.setWidth(0);
rect.setHeight(inter->h() / scale - 2 * margin);
}
break;
}
} }
} }
} }

View File

@ -162,6 +162,16 @@ public:
*/ */
QRect dockRect(const QString &screenName); QRect dockRect(const QString &screenName);
/**
* @brief realDockRect ()
* @param screenName
* @param pos
* @param hideMode
* @param displayMode
* @return
*/
QRect realDockRect(const QString &screenName, const Position &pos, const HideMode &hideMode, const DisplayMode &displayMode);
/** /**
* @brief handleLeaveEvent , * @brief handleLeaveEvent ,
* @param event * @param event
@ -174,7 +184,7 @@ signals:
// 更新监视区域 // 更新监视区域
void requestUpdateRegionMonitor(); void requestUpdateRegionMonitor();
void requestUpdateFrontendGeometry(const QRect &rect); //!!! 给后端的区域不能为是或宽度为0的区域,否则会带来HideState死循环切换的bug void requestUpdateFrontendGeometry(); //!!! 给后端的区域不能为是或宽度为0的区域,否则会带来HideState死循环切换的bug
void requestNotifyWindowManager(); void requestNotifyWindowManager();
void requestUpdatePosition(const Position &fromPos, const Position &toPos); void requestUpdatePosition(const Position &fromPos, const Position &toPos);
void requestUpdateLayout(const QString &screenName); // 界面需要根据任务栏更新布局的方向 void requestUpdateLayout(const QString &screenName); // 界面需要根据任务栏更新布局的方向
@ -220,7 +230,7 @@ private slots:
void onRequestUpdateRegionMonitor(); void onRequestUpdateRegionMonitor();
// 通知后端任务栏所在位置 // 通知后端任务栏所在位置
void onRequestUpdateFrontendGeometry(const QRect &rect); void onRequestUpdateFrontendGeometry();
void onRequestNotifyWindowManager(); void onRequestNotifyWindowManager();
void onRequestUpdatePosition(const Position &fromPos, const Position &toPos); void onRequestUpdatePosition(const Position &fromPos, const Position &toPos);
@ -270,9 +280,16 @@ private:
void checkDaemonDockService(); void checkDaemonDockService();
MainWindow *parent(); MainWindow *parent();
/**
QRect getDockShowGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode); * @brief getDockShowGeometry
QRect getDockHideGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode); * @param screenName
* @param pos
* @param displaymode
* @param real ,false为计算,true为不计算(.,)
* @return
*/
QRect getDockShowGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool real = false);
QRect getDockHideGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode, bool real = false);
Monitor *monitorByName(const QList<Monitor *> &list, const QString &screenName); Monitor *monitorByName(const QList<Monitor *> &list, const QString &screenName);
QScreen *screenByName(const QString &screenName); QScreen *screenByName(const QString &screenName);

View File

@ -362,10 +362,7 @@ void MainWindow::resetDragWindow()
// 通知窗管和后端更新数据 // 通知窗管和后端更新数据
m_multiScreenWorker->updateDaemonDockSize(m_dockSize); // 1.先更新任务栏高度 m_multiScreenWorker->updateDaemonDockSize(m_dockSize); // 1.先更新任务栏高度
m_multiScreenWorker->requestUpdateFrontendGeometry(); // 2.再更新任务栏位置,保证先1再2
const QRect rect = m_multiScreenWorker->dockRect(m_multiScreenWorker->deskScreen(),m_multiScreenWorker->position(),HideMode::KeepShowing,m_multiScreenWorker->displayMode());
m_multiScreenWorker->requestUpdateFrontendGeometry(rect); // 2.再更新任务栏位置,保证先1再2
m_multiScreenWorker->requestNotifyWindowManager(); m_multiScreenWorker->requestNotifyWindowManager();
if ((Top == m_multiScreenWorker->position()) || (Bottom == m_multiScreenWorker->position())) { if ((Top == m_multiScreenWorker->position()) || (Bottom == m_multiScreenWorker->position())) {