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);
}
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)
{
Q_UNUSED(event);
@ -403,7 +411,7 @@ void MultiScreenWorker::showAniFinished()
parent()->panel()->setFixedSize(rect.size());
parent()->panel()->move(0, 0);
emit requestUpdateFrontendGeometry(rect);
emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager();
emit requestUpdateDragArea();
}
@ -418,9 +426,7 @@ void MultiScreenWorker::hideAniFinished()
parent()->panel()->setFixedSize(rect.size());
parent()->panel()->move(0, 0);
const QRect frontedRect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode);
emit requestUpdateFrontendGeometry(frontedRect);
emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager();
}
@ -492,7 +498,7 @@ void MultiScreenWorker::onDisplayModeChanged()
emit displayModeChanegd();
emit requestUpdateRegionMonitor();
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode));
emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager();
}
@ -507,8 +513,7 @@ void MultiScreenWorker::onHideModeChanged()
m_hideMode = hideMode;
const QRect frontedRect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode);
emit requestUpdateFrontendGeometry(frontedRect);
emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager();
}
@ -609,17 +614,19 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor()
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属性循环切换,造成任务栏循环显示或隐藏
if (rect.width() == 0 || rect.height() == 0)
return;
const qreal scale = scaleByName(m_ds.current());
#ifdef QT_DEBUG
qDebug() << rect;
#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()
@ -883,8 +890,7 @@ void MultiScreenWorker::initConnection()
connect(m_dockInter, &DBusDock::ServiceRestarted, this, [ = ] {
autosetDockScreen();
const QRect frontedRect = dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode);
emit requestUpdateFrontendGeometry(frontedRect);
emit requestUpdateFrontendGeometry();
});
connect(m_dockInter, &DBusDock::OpacityChanged, this, &MultiScreenWorker::onOpacityChanged);
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()->move(0, 0);
// 通知后端
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode));
emit requestUpdateFrontendGeometry();
// 拖拽区域
emit requestUpdateDragArea();
// 监控区域
@ -962,8 +968,7 @@ void MultiScreenWorker::showAni(const QString &screen)
{
if (m_showAni->state() == QVariantAnimation::Running || m_aniStart)
return;
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode));
emit requestUpdateFrontendGeometry();
/************************************************************************
*
@ -1131,7 +1136,7 @@ void MultiScreenWorker::changeDockPosition(QString fromScreen, QString toScreen,
// 结束之后需要根据确定需要再隐藏
emit showAniFinished();
emit requestUpdateFrontendGeometry(dockRect(m_ds.current(), m_position, HideMode::KeepShowing, m_displayMode));
emit requestUpdateFrontendGeometry();
emit requestNotifyWindowManager();
});
@ -1240,45 +1245,86 @@ MainWindow *MultiScreenWorker::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();
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)) {
case Top: {
rect.setX(inter->x() + WINDOWMARGIN);
rect.setY(inter->y() + WINDOWMARGIN);
rect.setWidth(inter->w() / scale - 2 * WINDOWMARGIN);
rect.setHeight(dockSize);
if (real) {
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)) {
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);
rect.setY(inter->y() + inter->h() / scale - WINDOWMARGIN - dockSize);
rect.setWidth(inter->w() / scale - 2 * WINDOWMARGIN);
rect.setHeight(dockSize);
}
}
else {
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)) {
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;
}
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();
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)) {
case Top: {
rect.setX(inter->x() + margin);
rect.setY(inter->y());
rect.setWidth(inter->w() / scale - 2 * margin);
rect.setHeight(0);
if (real) {
foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
if (inter->name() == screenName) {
const int margin = (displaymode == DisplayMode::Fashion ? WINDOWMARGIN : 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);
rect.setWidth(inter->w() / scale - 2 * margin);
rect.setHeight(0);
}
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;
}
}
else {
foreach (Monitor *inter, validMonitorList(m_monitorInfo)) {
if (inter->name() == screenName) {
const int margin = (displaymode == DisplayMode::Fashion ? WINDOWMARGIN : 0);
switch (static_cast<Position>(pos)) {
case Top: {
rect.setX(inter->x() + margin);
rect.setY(inter->y());
rect.setWidth(inter->w() / scale - 2 * margin);
rect.setHeight(0);
}
break;
case Bottom: {
rect.setX(inter->x() + margin);
rect.setY(inter->y() + inter->h() / scale);
rect.setWidth(inter->w() / scale - 2 * margin);
rect.setHeight(0);
}
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);
/**
* @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 ,
* @param event
@ -174,7 +184,7 @@ signals:
// 更新监视区域
void requestUpdateRegionMonitor();
void requestUpdateFrontendGeometry(const QRect &rect); //!!! 给后端的区域不能为是或宽度为0的区域,否则会带来HideState死循环切换的bug
void requestUpdateFrontendGeometry(); //!!! 给后端的区域不能为是或宽度为0的区域,否则会带来HideState死循环切换的bug
void requestNotifyWindowManager();
void requestUpdatePosition(const Position &fromPos, const Position &toPos);
void requestUpdateLayout(const QString &screenName); // 界面需要根据任务栏更新布局的方向
@ -220,7 +230,7 @@ private slots:
void onRequestUpdateRegionMonitor();
// 通知后端任务栏所在位置
void onRequestUpdateFrontendGeometry(const QRect &rect);
void onRequestUpdateFrontendGeometry();
void onRequestNotifyWindowManager();
void onRequestUpdatePosition(const Position &fromPos, const Position &toPos);
@ -270,9 +280,16 @@ private:
void checkDaemonDockService();
MainWindow *parent();
QRect getDockShowGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode);
QRect getDockHideGeometry(const QString &screenName, const Position &pos, const DisplayMode &displaymode);
/**
* @brief getDockShowGeometry
* @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);
QScreen *screenByName(const QString &screenName);

View File

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