vcl/qt5/QtInstance.cxx | 10 ++ vcl/qt5/QtInstanceButton.cxx | 17 ++++ vcl/qt5/QtInstanceDialog.cxx | 41 +++++++++- vcl/qt5/QtInstanceMessageDialog.cxx | 112 +++++++++++++++++++++++++++ vcl/qt5/QtInstanceWidget.cxx | 145 ++++++++++++++++++++++++++++++++++++ vcl/qt5/QtInstanceWindow.cxx | 22 +++++ 6 files changed, 342 insertions(+), 5 deletions(-)
New commits: commit 5e4c1638eaf16908add86fbf6d9d83204178f100 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Fri Aug 30 10:12:21 2024 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Fri Aug 30 13:24:38 2024 +0200 tdf#162696 qt weld: Do GUI things in main thread Creating or modifying native Qt UI elements needs to happen in the main thread. This commit takes care of the obvious cases where such interaction happens. Otherwise, the tdf#162696 scenario triggers asserts like the following with a Qt debug build: ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp, line 958 terminate called after throwing an instance of 'com::sun::star::uno::RuntimeException' Fatal exception: Signal 6 Stack: #0 sal::backtrace_get(unsigned int) at /home/michi/development/git/libreoffice/sal/osl/unx/backtraceapi.cxx:42 #1 (anonymous namespace)::printStack(int) at /home/michi/development/git/libreoffice/sal/osl/unx/signal.cxx:289 #2 (anonymous namespace)::callSystemHandler(int, siginfo_t*, void*) at /home/michi/development/git/libreoffice/sal/osl/unx/signal.cxx:330 #3 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*) at /home/michi/development/git/libreoffice/sal/osl/unx/signal.cxx:427 #4 /lib/x86_64-linux-gnu/libc.so.6(+0x3f590) [0x7fdb05455590] #5 __pthread_kill_implementation at ./nptl/pthread_kill.c:44 (discriminator 1) #6 raise at ./signal/../sysdeps/posix/raise.c:27 #7 abort at ./stdlib/abort.c:81 #8 /lib/x86_64-linux-gnu/libstdc++.so.6(+0xa1a3d) [0x7fdb050a1a3d] #9 /lib/x86_64-linux-gnu/libstdc++.so.6(+0xb306a) [0x7fdb050b306a] #10 std::unexpected() in /lib/x86_64-linux-gnu/libstdc++.so.6 #11 /home/michi/development/git/qt5/qtbase/lib/libQt6Core.so.6(+0xed562) [0x7fdaf0eed562] #12 QMessageLogger::fatal() const at /home/michi/development/git/qt5/qtbase/src/corelib/global/qlogging.cpp:901 #13 qt_assert_x(char const*, char const*, char const*, int) at /home/michi/development/git/qt5/qtbase/src/corelib/global/qassert.cpp:0 #14 QWidgetPrivate::init(QWidget*, QFlags<Qt::WindowType>) at /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:959 #15 QWidget::QWidget(QWidgetPrivate&, QWidget*, QFlags<Qt::WindowType>) at /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:878 #16 QDialog::QDialog(QDialogPrivate&, QWidget*, QFlags<Qt::WindowType>) at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:377 #17 QMessageBox::QMessageBox(QWidget*) at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qmessagebox.cpp:838 #18 QtInstance::CreateMessageDialog(weld::Widget*, VclMessageType, VclButtonsType, rtl::OUString const&) at /home/michi/development/git/libreoffice/vcl/qt6/../qt5/QtInstance.cxx:825 #19 Application::CreateMessageDialog(weld::Widget*, VclMessageType, VclButtonsType, rtl::OUString const&, vcl::ILibreOfficeKitNotifier const*) at /home/michi/development/git/libreoffice/vcl/source/window/builder.cxx:224 #20 dp_gui::DialogHelper::installExtensionWarn(std::basic_string_view<char16_t, std::char_traits<char16_t>>) at /home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_dialog2.cxx:371 #21 dp_gui::(anonymous namespace)::ProgressCmdEnv::handle(com::sun::star::uno::Reference<com::sun::star::task::XInteractionRequest> const&) at /home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx:477 #22 dp_misc::interactContinuation(com::sun::star::uno::Any const&, com::sun::star::uno::Type const&, com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> const&, bool*, bool*) at /home/michi/development/git/libreoffice/desktop/source/deployment/misc/dp_interact.cxx:114 #23 dp_manager::ExtensionManager::checkInstall(rtl::OUString const&, com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> const&) at /home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:1315 #24 dp_manager::ExtensionManager::doChecksForAddExtension(com::sun::star::uno::Reference<com::sun::star::deployment::XPackageManager> const&, com::sun::star::uno::Sequence<com::sun::star::beans::NamedValue> const&, com::sun::star::uno::Reference<com::sun::star::deployment::XPackage> const&, com::sun::star::uno::Reference<com::sun::star::task::XAbortChannel> const&, com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> const&, com::sun::star::uno::Reference<com::sun::star::deployment::XPackage>&) at /home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:565 #25 dp_manager::ExtensionManager::addExtension(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::NamedValue> const&, rtl::OUString const&, com::sun::star::uno::Reference<com::sun::star::task::XAbortChannel> const&, com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> const&) at /home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:655 #26 non-virtual thunk to dp_manager::ExtensionManager::addExtension(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::NamedValue> const&, rtl::OUString const&, com::sun::star::uno::Reference<com::sun::star::task::XAbortChannel> const&, com::sun::star::uno::Reference<com::sun::star::ucb::XCommandEnvironment> const&) at /home/michi/development/git/libreoffice/desktop/source/deployment/manager/dp_extensionmanager.cxx:0 #27 dp_gui::ExtensionCmdQueue::Thread::_addExtension(rtl::Reference<dp_gui::(anonymous namespace)::ProgressCmdEnv> const&, rtl::OUString const&, rtl::OUString const&, bool) at /home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx:864 #28 dp_gui::ExtensionCmdQueue::Thread::execute() at /home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx:738 #29 salhelper::Thread::run() at /home/michi/development/git/libreoffice/salhelper/source/thread.cxx:39 #30 threadFunc at /home/michi/development/git/libreoffice/include/osl/thread.hxx:190 #31 osl_thread_start_Impl(void*) at /home/michi/development/git/libreoffice/sal/osl/unx/thread.cxx:245 #32 start_thread at ./nptl/pthread_create.c:447 #33 clone3 at ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80 Change-Id: Ifa84a038fc56f34958cd732caeb9c436b48b3c75 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172642 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/vcl/qt5/QtInstance.cxx b/vcl/qt5/QtInstance.cxx index 089ec9dc7488..4587ef6c7933 100644 --- a/vcl/qt5/QtInstance.cxx +++ b/vcl/qt5/QtInstance.cxx @@ -801,6 +801,16 @@ weld::MessageDialog* QtInstance::CreateMessageDialog(weld::Widget* pParent, VclButtonsType eButtonsType, const OUString& rPrimaryMessage) { + SolarMutexGuard g; + if (!IsMainThread()) + { + weld::MessageDialog* pDialog; + RunInMainThread([&] { + pDialog = CreateMessageDialog(pParent, eMessageType, eButtonsType, rPrimaryMessage); + }); + return pDialog; + } + if (QtData::noWeldedWidgets()) { return SalInstance::CreateMessageDialog(pParent, eMessageType, eButtonsType, diff --git a/vcl/qt5/QtInstanceButton.cxx b/vcl/qt5/QtInstanceButton.cxx index a3a08c729adf..0bc79fd2478f 100644 --- a/vcl/qt5/QtInstanceButton.cxx +++ b/vcl/qt5/QtInstanceButton.cxx @@ -20,6 +20,14 @@ QtInstanceButton::QtInstanceButton(QPushButton* pButton) void QtInstanceButton::set_label(const OUString& rText) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_label(rText); }); + return; + } + assert(m_pButton); m_pButton->setText(toQString(rText)); } @@ -41,6 +49,15 @@ void QtInstanceButton::set_from_icon_name(const OUString& /*rIconName*/) OUString QtInstanceButton::get_label() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + OUString sLabel; + pQtInstance->RunInMainThread([&] { sLabel = get_label(); }); + return sLabel; + } + assert(m_pButton); return toOUString(m_pButton->text()); } diff --git a/vcl/qt5/QtInstanceDialog.cxx b/vcl/qt5/QtInstanceDialog.cxx index cdd75cd9675f..14a4774c8671 100644 --- a/vcl/qt5/QtInstanceDialog.cxx +++ b/vcl/qt5/QtInstanceDialog.cxx @@ -35,15 +35,50 @@ void QtInstanceDialog::SetInstallLOKNotifierHdl(const Link<void*, vcl::ILibreOff { } -int QtInstanceDialog::run() { return qtResponseTypeToVclResponseType(m_pDialog->exec()); } +int QtInstanceDialog::run() +{ + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + int nResult = 0; + pQtInstance->RunInMainThread([&] { nResult = run(); }); + return nResult; + } + + return qtResponseTypeToVclResponseType(m_pDialog->exec()); +} void QtInstanceDialog::response(int) {} void QtInstanceDialog::add_button(const OUString&, int, const OUString&) {} -void QtInstanceDialog::set_modal(bool bModal) { m_pDialog->setModal(bModal); } +void QtInstanceDialog::set_modal(bool bModal) +{ + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_modal(bModal); }); + return; + } + + m_pDialog->setModal(bModal); +} -bool QtInstanceDialog::get_modal() const { return m_pDialog->isModal(); } +bool QtInstanceDialog::get_modal() const +{ + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bModal = false; + pQtInstance->RunInMainThread([&] { bModal = get_modal(); }); + return bModal; + } + + return m_pDialog->isModal(); +} weld::Button* QtInstanceDialog::weld_widget_for_response(int) { return nullptr; } diff --git a/vcl/qt5/QtInstanceMessageDialog.cxx b/vcl/qt5/QtInstanceMessageDialog.cxx index b9e458c502ac..76903fc5c63c 100644 --- a/vcl/qt5/QtInstanceMessageDialog.cxx +++ b/vcl/qt5/QtInstanceMessageDialog.cxx @@ -28,11 +28,27 @@ QtInstanceMessageDialog::QtInstanceMessageDialog(QMessageBox* pMessageDialog) void QtInstanceMessageDialog::set_primary_text(const rtl::OUString& rText) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_primary_text(rText); }); + return; + } + m_pMessageDialog->setText(toQString(rText)); } void QtInstanceMessageDialog::set_secondary_text(const rtl::OUString& rText) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_secondary_text(rText); }); + return; + } + m_pMessageDialog->setInformativeText(toQString(rText)); } @@ -40,18 +56,44 @@ weld::Container* QtInstanceMessageDialog::weld_message_area() { return nullptr; OUString QtInstanceMessageDialog::get_primary_text() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + OUString sText; + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { sText = get_primary_text(); }); + return sText; + } + assert(m_pMessageDialog); return toOUString(m_pMessageDialog->text()); } OUString QtInstanceMessageDialog::get_secondary_text() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + OUString sText; + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { sText = get_secondary_text(); }); + return sText; + } + assert(m_pMessageDialog); return toOUString(m_pMessageDialog->informativeText()); } void QtInstanceMessageDialog::add_button(const OUString& rText, int nResponse, const OUString&) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { add_button(rText, nResponse); }); + return; + } + assert(m_pMessageDialog); QPushButton* pButton = m_pMessageDialog->addButton(vclToQtStringWithAccelerator(rText), QMessageBox::ButtonRole::ActionRole); @@ -60,6 +102,14 @@ void QtInstanceMessageDialog::add_button(const OUString& rText, int nResponse, c void QtInstanceMessageDialog::set_default_response(int nResponse) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_default_response(nResponse); }); + return; + } + assert(m_pMessageDialog); QPushButton* pButton = buttonForResponseCode(nResponse); @@ -69,6 +119,15 @@ void QtInstanceMessageDialog::set_default_response(int nResponse) QtInstanceButton* QtInstanceMessageDialog::weld_widget_for_response(int nResponse) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + QtInstanceButton* pButton; + pQtInstance->RunInMainThread([&] { pButton = weld_widget_for_response(nResponse); }); + return pButton; + } + if (QPushButton* pButton = buttonForResponseCode(nResponse)) return new QtInstanceButton(pButton); @@ -77,6 +136,15 @@ QtInstanceButton* QtInstanceMessageDialog::weld_widget_for_response(int nRespons int QtInstanceMessageDialog::run() { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + int nRet = 0; + pQtInstance->RunInMainThread([&] { nRet = run(); }); + return nRet; + } + m_pMessageDialog->exec(); QAbstractButton* pClickedButton = m_pMessageDialog->clickedButton(); if (!pClickedButton) @@ -87,6 +155,15 @@ int QtInstanceMessageDialog::run() bool QtInstanceMessageDialog::runAsync(const std::shared_ptr<weld::DialogController>& rxOwner, const std::function<void(sal_Int32)>& func) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bRet = false; + pQtInstance->RunInMainThread([&] { bRet = runAsync(rxOwner, func); }); + return bRet; + } + assert(m_pMessageDialog); m_xRunAsyncDialogController = rxOwner; @@ -100,6 +177,15 @@ bool QtInstanceMessageDialog::runAsync(const std::shared_ptr<weld::DialogControl bool QtInstanceMessageDialog::runAsync(std::shared_ptr<Dialog> const& rxSelf, const std::function<void(sal_Int32)>& func) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bRet; + pQtInstance->RunInMainThread([&] { bRet = runAsync(rxSelf, func); }); + return bRet; + } + assert(m_pMessageDialog); assert(rxSelf.get() == this); @@ -113,12 +199,28 @@ bool QtInstanceMessageDialog::runAsync(std::shared_ptr<Dialog> const& rxSelf, void QtInstanceMessageDialog::response(int nResponse) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { response(nResponse); }); + return; + } + assert(m_pMessageDialog); m_pMessageDialog->done(nResponse); } void QtInstanceMessageDialog::dialogFinished(int nResult) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { dialogFinished(nResult); }); + return; + } + assert(m_aRunAsyncFunc); disconnect(m_pMessageDialog, &QDialog::finished, this, @@ -137,7 +239,6 @@ void QtInstanceMessageDialog::dialogFinished(int nResult) if (QAbstractButton* pClickedButton = m_pMessageDialog->clickedButton()) nRet = pClickedButton->property(PROPERTY_VCL_RESPONSE_CODE).toInt(); - SolarMutexGuard g; aFunc(nRet); xRunAsyncDialogController.reset(); @@ -146,6 +247,15 @@ void QtInstanceMessageDialog::dialogFinished(int nResult) QPushButton* QtInstanceMessageDialog::buttonForResponseCode(int nResponse) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + QPushButton* pButton; + pQtInstance->RunInMainThread([&] { pButton = buttonForResponseCode(nResponse); }); + return pButton; + } + assert(m_pMessageDialog); const QList<QAbstractButton*> aButtons = m_pMessageDialog->buttons(); diff --git a/vcl/qt5/QtInstanceWidget.cxx b/vcl/qt5/QtInstanceWidget.cxx index 3d377df18202..2f74e2eff829 100644 --- a/vcl/qt5/QtInstanceWidget.cxx +++ b/vcl/qt5/QtInstanceWidget.cxx @@ -19,24 +19,59 @@ QtInstanceWidget::QtInstanceWidget(QWidget* pWidget) void QtInstanceWidget::set_sensitive(bool bSensitive) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_sensitive(bSensitive); }); + return; + } + assert(m_pWidget); m_pWidget->setEnabled(bSensitive); } bool QtInstanceWidget::get_sensitive() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bSensitive = false; + pQtInstance->RunInMainThread([&] { bSensitive = get_sensitive(); }); + return bSensitive; + } + assert(m_pWidget); return m_pWidget->isEnabled(); } bool QtInstanceWidget::get_visible() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bVisible = false; + pQtInstance->RunInMainThread([&] { bVisible = get_visible(); }); + return bVisible; + } + assert(m_pWidget); return m_pWidget->isVisible(); } bool QtInstanceWidget::is_visible() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bVisible = false; + pQtInstance->RunInMainThread([&] { bVisible = is_visible(); }); + return bVisible; + } + assert(m_pWidget); QWidget* pTopLevel = m_pWidget->topLevelWidget(); @@ -46,6 +81,14 @@ bool QtInstanceWidget::is_visible() const void QtInstanceWidget::set_can_focus(bool bCanFocus) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_can_focus(bCanFocus); }); + return; + } + assert(m_pWidget); if (bCanFocus) m_pWidget->setFocusPolicy(Qt::FocusPolicy::StrongFocus); @@ -55,12 +98,29 @@ void QtInstanceWidget::set_can_focus(bool bCanFocus) void QtInstanceWidget::grab_focus() { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { grab_focus(); }); + return; + } + assert(m_pWidget); m_pWidget->setFocus(); } bool QtInstanceWidget::has_focus() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bFocus = false; + pQtInstance->RunInMainThread([&] { bFocus = has_focus(); }); + return bFocus; + } + assert(m_pWidget); return m_pWidget->hasFocus(); } @@ -69,6 +129,15 @@ bool QtInstanceWidget::is_active() const { return has_focus(); } bool QtInstanceWidget::has_child_focus() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + bool bChildFocus = false; + pQtInstance->RunInMainThread([&] { bChildFocus = has_child_focus(); }); + return bChildFocus; + } + QWidget* pFocusWidget = QApplication::focusWidget(); if (!pFocusWidget) return false; @@ -84,12 +153,28 @@ bool QtInstanceWidget::has_child_focus() const void QtInstanceWidget::show() { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { show(); }); + return; + } + assert(m_pWidget); m_pWidget->show(); } void QtInstanceWidget::hide() { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { hide(); }); + return; + } + assert(m_pWidget); m_pWidget->hide(); } @@ -152,30 +237,73 @@ int QtInstanceWidget::get_margin_end() const { return 1; } void QtInstanceWidget::set_accessible_name(const OUString& rName) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_accessible_name(rName); }); + return; + } + assert(m_pWidget); m_pWidget->setAccessibleName(toQString(rName)); } void QtInstanceWidget::set_accessible_description(const OUString& rDescription) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_accessible_description(rDescription); }); + return; + } + assert(m_pWidget); m_pWidget->setAccessibleDescription(toQString(rDescription)); } OUString QtInstanceWidget::get_accessible_name() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + OUString sName; + pQtInstance->RunInMainThread([&] { sName = get_accessible_name(); }); + return sName; + } + assert(m_pWidget); return toOUString(m_pWidget->accessibleName()); } OUString QtInstanceWidget::get_accessible_description() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + OUString sDescription; + pQtInstance->RunInMainThread([&] { sDescription = get_accessible_description(); }); + return sDescription; + } + assert(m_pWidget); return toOUString(m_pWidget->accessibleDescription()); } OUString QtInstanceWidget::get_accessible_id() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + OUString sId; + pQtInstance->RunInMainThread([&] { sId = get_accessible_id(); }); + return sId; + } + assert(m_pWidget); #if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) return toOUString(m_pWidget->accessibleIdentifier()); @@ -188,12 +316,29 @@ void QtInstanceWidget::set_accessible_relation_labeled_by(weld::Widget*) {} void QtInstanceWidget::set_tooltip_text(const OUString& rTip) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_tooltip_text(rTip); }); + return; + } + assert(m_pWidget); m_pWidget->setToolTip(toQString(rTip)); } OUString QtInstanceWidget::get_tooltip_text() const { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + OUString sToolTipText; + pQtInstance->RunInMainThread([&] { sToolTipText = get_tooltip_text(); }); + return sToolTipText; + } + assert(m_pWidget); return toOUString(m_pWidget->toolTip()); } diff --git a/vcl/qt5/QtInstanceWindow.cxx b/vcl/qt5/QtInstanceWindow.cxx index 05dfec57a973..bf2d713e1482 100644 --- a/vcl/qt5/QtInstanceWindow.cxx +++ b/vcl/qt5/QtInstanceWindow.cxx @@ -16,10 +16,30 @@ QtInstanceWindow::QtInstanceWindow(QWidget* pWidget) void QtInstanceWindow::set_title(const OUString& rTitle) { + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + pQtInstance->RunInMainThread([&] { set_title(rTitle); }); + return; + } + getQWidget()->setWindowTitle(toQString(rTitle)); } -OUString QtInstanceWindow::get_title() const { return toOUString(getQWidget()->windowTitle()); } +OUString QtInstanceWindow::get_title() const +{ + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + if (!pQtInstance->IsMainThread()) + { + OUString sTitle; + pQtInstance->RunInMainThread([&] { sTitle = get_title(); }); + return sTitle; + } + + return toOUString(getQWidget()->windowTitle()); +} void QtInstanceWindow::window_move(int, int) {}