vcl/inc/qt5/QtFrame.hxx | 1 vcl/qt5/QtFrame.cxx | 51 +++++++++++++++++++++--------------------------- vcl/qt5/QtObject.cxx | 25 ++--------------------- 3 files changed, 27 insertions(+), 50 deletions(-)
New commits: commit 76611452da46aec18ba14954671beee4f6dacf49 Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Wed Nov 17 13:03:23 2021 +0100 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Wed Nov 17 16:51:14 2021 +0100 Qt refactor SystemEnvData setup Change-Id: I900d1079c9a832a9b5170e58ce4e7a8b81d7d01b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125393 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> Tested-by: Jenkins diff --git a/vcl/inc/qt5/QtFrame.hxx b/vcl/inc/qt5/QtFrame.hxx index a338b106eaeb..965ecbaba0e1 100644 --- a/vcl/inc/qt5/QtFrame.hxx +++ b/vcl/inc/qt5/QtFrame.hxx @@ -215,6 +215,7 @@ public: void setInputLanguage(LanguageType); inline bool isPopup() const; + static void FillSystemEnvData(SystemEnvData&, sal_IntPtr pWindow, QWidget* pWidget); }; inline bool QtFrame::CallCallback(SalEvent nEvent, const void* pEvent) const diff --git a/vcl/qt5/QtFrame.cxx b/vcl/qt5/QtFrame.cxx index db91e48a256c..ce504c10b8db 100644 --- a/vcl/qt5/QtFrame.cxx +++ b/vcl/qt5/QtFrame.cxx @@ -183,39 +183,34 @@ QtFrame::QtFrame(QtFrame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo) pChildWindow->setTransientParent(pParentWindow); } - // Calling 'QWidget::winId()' implicitly enables native windows to be used - // rather than "alien widgets" that are unknown to the windowing system, - // s. https://doc.qt.io/qt-5/qwidget.html#native-widgets-vs-alien-widgets - // Avoid this on Wayland due to problems with missing 'mouseMoveEvent's, - // s. tdf#122293/QTBUG-75766 - const bool bWayland = QGuiApplication::platformName() == "wayland"; - if (!bWayland) + FillSystemEnvData(m_aSystemData, reinterpret_cast<sal_IntPtr>(this), m_pQWidget); + if (m_aSystemData.platform != SystemEnvData::Platform::Wayland) m_aSystemData.SetWindowHandle(m_pQWidget->winId()); - else - { - // TODO implement as needed for Wayland, - // s.a. commit c0d4f3ad3307c which did this for gtk3 - // QPlatformNativeInterface* native = QGuiApplication::platformNativeInterface(); - // m_aSystemData.pDisplay = native->nativeResourceForWindow("display", nullptr); - // m_aSystemData.aWindow = reinterpret_cast<unsigned long>( - // native->nativeResourceForWindow("surface", m_pQWidget->windowHandle())); - } - - m_aSystemData.aShellWindow = reinterpret_cast<sal_IntPtr>(this); - //m_aSystemData.pSalFrame = this; - m_aSystemData.pWidget = m_pQWidget; - //m_aSystemData.nScreen = m_nXScreen.getXScreen(); - m_aSystemData.toolkit = SystemEnvData::Toolkit::Qt; - if (!bWayland) - m_aSystemData.platform = SystemEnvData::Platform::Xcb; - else - m_aSystemData.platform = SystemEnvData::Platform::Wayland; SetIcon(SV_ICON_ID_OFFICE); fixICCCMwindowGroup(); } +void QtFrame::FillSystemEnvData(SystemEnvData& rData, sal_IntPtr pWindow, QWidget* pWidget) +{ + if (QGuiApplication::platformName() == "wayland") + rData.platform = SystemEnvData::Platform::Wayland; + else if (QGuiApplication::platformName() == "xcb") + rData.platform = SystemEnvData::Platform::Xcb; + else + { + // maybe add a SystemEnvData::Platform::Unsupported to avoid special cases and not abort? + SAL_WARN("vcl.qt", + "Unsupported qt VCL platform: " << toOUString(QGuiApplication::platformName())); + std::abort(); + } + + rData.toolkit = SystemEnvData::Toolkit::Qt; + rData.aShellWindow = pWindow; + rData.pWidget = pWidget; +} + void QtFrame::fixICCCMwindowGroup() { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT5_USING_X11 && QT5_HAVE_XCB_ICCCM @@ -226,7 +221,7 @@ void QtFrame::fixICCCMwindowGroup() return; g_bNeedsWmHintsWindowGroup = false; - if (QGuiApplication::platformName() != "xcb") + if (m_aSystemData.platform != SystemEnvData::Platform::Xcb) return; if (QVersionNumber::fromString(qVersion()) >= QVersionNumber(5, 12)) return; @@ -1327,7 +1322,7 @@ void QtFrame::SetScreenNumber(unsigned int nScreen) void QtFrame::SetApplicationID(const OUString& rWMClass) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT5_USING_X11 - if (QGuiApplication::platformName() != "xcb" || !m_pTopLevel) + if (m_aSystemData.platform != SystemEnvData::Platform::Xcb || !m_pTopLevel) return; OString aResClass = OUStringToOString(rWMClass, RTL_TEXTENCODING_ASCII_US); diff --git a/vcl/qt5/QtObject.cxx b/vcl/qt5/QtObject.cxx index 155a78da8ce1..b8c30af2d340 100644 --- a/vcl/qt5/QtObject.cxx +++ b/vcl/qt5/QtObject.cxx @@ -41,28 +41,9 @@ QtObject::QtObject(QtFrame* pParent, bool bShow) if (bShow) m_pQWidget->show(); - m_aSystemData.aShellWindow = reinterpret_cast<sal_IntPtr>(this); - //m_aSystemData.pSalFrame = this; - m_aSystemData.pWidget = m_pQWidget; - //m_aSystemData.nScreen = m_nXScreen.getXScreen(); - m_aSystemData.toolkit = SystemEnvData::Toolkit::Qt; - m_aSystemData.platform = SystemEnvData::Platform::Xcb; - const bool bWayland = QGuiApplication::platformName() == "wayland"; - if (!bWayland) - { - m_aSystemData.platform = SystemEnvData::Platform::Xcb; - m_aSystemData.SetWindowHandle(m_pQWindow->winId()); // ID of the embedded window - } - else - { - m_aSystemData.platform = SystemEnvData::Platform::Wayland; - // TODO implement as needed for Wayland, - // s.a. commit c0d4f3ad3307c which did this for gtk3 - // QPlatformNativeInterface* native = QGuiApplication::platformNativeInterface(); - // m_aSystemData.pDisplay = native->nativeResourceForWindow("display", nullptr); - // m_aSystemData.aWindow = reinterpret_cast<unsigned long>( - // native->nativeResourceForWindow("surface", m_pQWidget->windowHandle())); - } + QtFrame::FillSystemEnvData(m_aSystemData, reinterpret_cast<sal_IntPtr>(this), m_pQWidget); + if (m_aSystemData.platform != SystemEnvData::Platform::Wayland) + m_aSystemData.SetWindowHandle(m_pQWidget->winId()); } QtObject::~QtObject()