From 945c8cf0755559ccc94a18953467d14a6d57f613 Mon Sep 17 00:00:00 2001 From: Ye ShanShan Date: Thu, 13 Mar 2025 19:37:14 +0800 Subject: [PATCH] fix: adapt to qt6 for PlatformWindowHelper Timer maybe miss killed. MouseEvent conversion is wrong in qt6, old way will be called recursively. requestActivateWindow is called recurisvely in qt6. pms: TASK-368399 --- xcb/dframewindow.cpp | 7 ++++++- xcb/dplatformwindowhelper.cpp | 30 ++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/xcb/dframewindow.cpp b/xcb/dframewindow.cpp index 72f2658c..802e61d4 100644 --- a/xcb/dframewindow.cpp +++ b/xcb/dframewindow.cpp @@ -924,8 +924,13 @@ void DFrameWindow::updateShadow() update(); // 阴影更新后尝试刷新内部窗口 - if (m_contentBackingStore) + if (m_contentBackingStore) { + // Timer maybe miss killed if updateShadow is called frequently. + if (m_paintShadowOnContentTimerId >= 0) { + killTimer(m_paintShadowOnContentTimerId); + } m_paintShadowOnContentTimerId = startTimer(300, Qt::PreciseTimer); + } } void DFrameWindow::updateShadowAsync(int delaye) diff --git a/xcb/dplatformwindowhelper.cpp b/xcb/dplatformwindowhelper.cpp index 7651d12f..307a3e47 100644 --- a/xcb/dplatformwindowhelper.cpp +++ b/xcb/dplatformwindowhelper.cpp @@ -479,7 +479,11 @@ void DPlatformWindowHelper::requestActivateWindow() } #endif + // ActivateWindow is called recursively in qt6.8 +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) helper->m_frameWindow->handle()->requestActivateWindow(); +#endif + #ifdef Q_OS_LINUX // 对于有parent的窗口,需要调用此接口让其获得输入焦点 xcb_set_input_focus(DPlatformIntegration::xcbConnection()->xcb_connection(), @@ -624,10 +628,15 @@ bool DPlatformWindowHelper::eventFilter(QObject *watched, QEvent *event) mevent->mutablePoint().setScenePosition(m_nativeWindow->window()->mapFromGlobal(e->globalPosition())); qApp->sendEvent(m_nativeWindow->window(), mevent.data()); #else - QScopedPointer mevent(QMutableSinglePointEvent::from(e->clone())); - QMutableEventPoint::setPosition(mevent->point(0), m_nativeWindow->window()->mapFromGlobal(e->globalPosition())); - QMutableEventPoint::setScenePosition(mevent->point(0), m_nativeWindow->window()->mapFromGlobal(e->globalPosition())); - qApp->sendEvent(m_nativeWindow->window(), mevent.data()); + if (!e->points().isEmpty()) { + QEventPoint &point = e->m_points[0]; + const auto pos = m_frameWindow->mapFromGlobal(e->globalPosition()); + QEventPoint targetPoint = QMutableEventPoint::withTimeStamp(point.timestamp(), point.id(), point.state(), + pos, pos, pos); + QMutableEventPoint::update(targetPoint, point); + m_frameWindow->mouseMoveEvent(e); + qApp->sendEvent(m_nativeWindow->window(), e); + } #endif return true; } @@ -719,10 +728,15 @@ bool DPlatformWindowHelper::eventFilter(QObject *watched, QEvent *event) mevent->mutablePoint().setScenePosition(m_frameWindow->mapFromGlobal(e->globalPosition())); qApp->sendEvent(m_frameWindow, mevent.data()); #else - QScopedPointer mevent(QMutableSinglePointEvent::from(e->clone())); - QMutableEventPoint::setPosition(mevent->point(0), m_frameWindow->mapFromGlobal(e->globalPosition())); - QMutableEventPoint::setScenePosition(mevent->point(0), m_frameWindow->mapFromGlobal(e->globalPosition())); - qApp->sendEvent(m_frameWindow, mevent.data()); + if (!e->points().isEmpty()) { + QEventPoint &point = e->m_points[0]; + const auto pos = m_frameWindow->mapFromGlobal(e->globalPosition()); + QEventPoint targetPoint = QMutableEventPoint::withTimeStamp(point.timestamp(), point.id(), point.state(), + pos, pos, pos); + QMutableEventPoint::update(targetPoint, point); + e->m_source = Qt::MouseEventSynthesizedByQt; + m_frameWindow->mouseMoveEvent(e); + } #endif return true; }