From bd9beca6effcc0ac22e1ba249b305ea9b2bb1772 Mon Sep 17 00:00:00 2001 From: donghualin Date: Wed, 30 Nov 2022 16:25:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dwayland=E4=B8=8B?= =?UTF-8?q?=E9=AB=98=E6=95=88=E6=A8=A1=E5=BC=8F=E8=AE=BE=E7=BD=AE=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A0=8Fstruct=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在wayland环境下,如果任务栏状态为智能隐藏或者一直隐藏,那么在高效模式下,任务栏距离边缘的距离如果为0,会导致在WindowManager类中设置窗管_d_dwayland_dockstrut属性失效,因此,此处将动画位置距离边缘设置为1,此时就不会出现_d_dwayland_dockstrut属性失效的情况 Log: 修复wayland下高效模式任务栏执行动画过程中窗体大小变化的问题 Influence: 进入wayland-任务栏设置为一直隐藏或智能隐藏,窗体最大化,让任务栏显示隐藏,观察任务栏窗体是否发生变化 Bug: https://pms.uniontech.com/bug-view-150637.html Change-Id: I4cb554f9ba0a1a4b8b481cdfa9fc6d4d1ccfbd75 --- frame/window/mainwindowbase.cpp | 41 +++++++++++++++++++++++++++++++-- frame/window/mainwindowbase.h | 1 + 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index d6e170bce..a6f361e19 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -173,6 +173,43 @@ int MainWindowBase::getBorderRadius() const return qMin(MAX_MIN_RADIUS_DIFFVALUE, qMax(size - MIN_RADIUS_WINDOWSIZE, 0)) + MIN_RADIUS; } +QRect MainWindowBase::getAnimationRect(const QRect &sourceRect, const Dock::Position &pos) const +{ + if (!Utils::IS_WAYLAND_DISPLAY + || m_multiScreenWorker->hideMode() == HideMode::KeepShowing + || m_multiScreenWorker->displayMode() == Dock::DisplayMode::Fashion) + return sourceRect; + + // 在wayland环境下,如果任务栏状态为智能隐藏或者一直隐藏,那么在高效模式下,任务栏距离边缘的距离如果为0 + // 会导致在WindowManager类中设置窗管的_d_dwayland_dockstrut属性失效,因此,此处将动画位置距离边缘设置为1 + // 此时就不会出现_d_dwayland_dockstrut属性失效的情况(1个像素并不影响动画效果) + // 在时尚模式下无需做这个设置,因为时尚模式下距离边缘的距离为10 + QRect animationRect = sourceRect; + switch (pos) { + case Dock::Position::Bottom: { + animationRect.setTop(animationRect.top() - 1); + animationRect.setHeight(sourceRect.height()); + break; + } + case Dock::Position::Left: { + animationRect.setLeft(1); + animationRect.setWidth(sourceRect.width()); + break; + } + case Dock::Position::Top: { + animationRect.setTop(1); + animationRect.setHeight(sourceRect.height()); + break; + } + case Dock::Position::Right: { + animationRect.setLeft(animationRect.left() - 1); + animationRect.setWidth(sourceRect.width()); + break; + } + } + return animationRect; +} + /** * @brief MainWindow::onMainWindowSizeChanged 任务栏拖拽过程中会不停调用此方法更新自身大小 * @param offset 拖拽时的坐标偏移量 @@ -462,8 +499,8 @@ QVariantAnimation *MainWindowBase::createAnimation(QScreen *screen, const Dock:: * 正常屏幕情况下是没有这个问题的 */ QRect mainwindowRect = geometry(); - const QRect dockShowRect = getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Show); - const QRect &dockHideRect = getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Hide); + const QRect dockShowRect = getAnimationRect(getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Show), pos); + const QRect &dockHideRect = getAnimationRect(getDockGeometry(screen, pos, m_multiScreenWorker->displayMode(), Dock::HideState::Hide), pos); if (act == Dock::AniAction::Show) { if (pos == Position::Top || pos == Position::Bottom) { if (qAbs(dockShowRect.height() - mainwindowRect.height()) <= 1 diff --git a/frame/window/mainwindowbase.h b/frame/window/mainwindowbase.h index ff528f49d..b12ef219f 100644 --- a/frame/window/mainwindowbase.h +++ b/frame/window/mainwindowbase.h @@ -92,6 +92,7 @@ private: void updateDragGeometry(); int getBorderRadius() const; + QRect getAnimationRect(const QRect &sourceRect, const Dock::Position &pos) const; private Q_SLOTS: void onMainWindowSizeChanged(QPoint offset);