vcl/inc/qt5/QtInstanceDialog.hxx | 1 vcl/qt5/QtInstance.cxx | 10 +++ vcl/qt5/QtInstanceButton.cxx | 17 +++++ vcl/qt5/QtInstanceDialog.cxx | 48 ++++++++++++++- vcl/qt5/QtInstanceMessageDialog.cxx | 112 +++++++++++++++++++++++++++++++++++- vcl/qt5/QtInstanceWindow.cxx | 22 ++++++- 6 files changed, 205 insertions(+), 5 deletions(-)
New commits: commit 59e393c1689a0d6a780aa499c617f2adacf5a886 Author: Michael Weghorn <[email protected]> AuthorDate: Fri Aug 30 10:14:04 2024 +0200 Commit: Adolfo Jayme Barrientos <[email protected]> CommitDate: Sat Aug 31 08:30:17 2024 +0200 tdf#162696 qt weld: Destroy QDialog in main thread Besides the obvious cases handled in previous commit Change-Id: Ifa84a038fc56f34958cd732caeb9c436b48b3c75 Author: Michael Weghorn <[email protected]> Date: Fri Aug 30 10:12:21 2024 +0200 tdf#162696 qt weld: Do GUI things in main thread , the destruction of `QtInstanceDialog::m_pDialog` (that previously implicitly happened due to it being a `std::unique_ptr`) also needs to happen in the main thread. Otherwise, it triggers this assert with a debug Qt build for the tdf#162696 of installing an extension via drag'n'drop into the start center: ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread QThread(0x7f4b14003390). Receiver 'QDialog(0x562e6ba77450)' was created in thread QThread(0x562e69709f60, name = "Qt mainThread")", file /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp, line 551 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) [0x7f4be7455590] #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) [0x7f4be70a1a3d] #9 /lib/x86_64-linux-gnu/libstdc++.so.6(+0xb306a) [0x7f4be70b306a] #10 std::unexpected() in /lib/x86_64-linux-gnu/libstdc++.so.6 #11 /home/michi/development/git/qt5/qtbase/lib/libQt6Core.so.6(+0xed562) [0x7f4bd2eed562] #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 QCoreApplicationPrivate::checkReceiverThread(QObject*) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:0 #15 QApplication::notify(QObject*, QEvent*) at /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qapplication.cpp:2583 #16 QCoreApplication::notifyInternal2(QObject*, QEvent*) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1170 #17 QCoreApplication::sendEvent(QObject*, QEvent*) at /home/michi/development/git/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp:1614 #18 QWidgetPrivate::setVisible(bool) at /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:8415 #19 QDialogPrivate::setVisible(bool) at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:832 #20 QMessageBoxPrivate::setVisible(bool) at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qmessagebox.cpp:1676 #21 QDialog::setVisible(bool) at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:750 #22 QWidget::hide() at /home/michi/development/git/qt5/qtbase/src/widgets/kernel/qwidget.cpp:8176 #23 QDialog::~QDialog() at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qdialog.cpp:390 #24 QMessageBox::~QMessageBox() at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qmessagebox.cpp:879 #25 QMessageBox::~QMessageBox() at /home/michi/development/git/qt5/qtbase/src/widgets/dialogs/qmessagebox.cpp:878 #26 std::default_delete<QDialog>::operator()(QDialog*) const at /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:94 #27 std::unique_ptr<QDialog, std::default_delete<QDialog>>::~unique_ptr() at /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:398 #28 QtInstanceDialog::~QtInstanceDialog() at /home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceDialog.hxx:14 #29 QtInstanceMessageDialog::~QtInstanceMessageDialog() at /home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceMessageDialog.hxx:16 #30 QtInstanceMessageDialog::~QtInstanceMessageDialog() at /home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceMessageDialog.hxx:16 #31 QtInstanceMessageDialog::~QtInstanceMessageDialog() at /home/michi/development/git/libreoffice/vcl/inc/qt6/../qt5/QtInstanceMessageDialog.hxx:16 #32 std::default_delete<weld::MessageDialog>::operator()(weld::MessageDialog*) const at /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:94 #33 std::__uniq_ptr_impl<weld::MessageDialog, std::default_delete<weld::MessageDialog>>::reset(weld::MessageDialog*) at /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:206 #34 std::unique_ptr<weld::MessageDialog, std::default_delete<weld::MessageDialog>>::reset(weld::MessageDialog*) at /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/unique_ptr.h:504 #35 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:379 #36 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 #37 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 #38 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 #39 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 #40 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 #41 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 #42 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 #43 dp_gui::ExtensionCmdQueue::Thread::execute() at /home/michi/development/git/libreoffice/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx:738 #44 salhelper::Thread::run() at /home/michi/development/git/libreoffice/salhelper/source/thread.cxx:39 #45 threadFunc at /home/michi/development/git/libreoffice/include/osl/thread.hxx:190 #46 osl_thread_start_Impl(void*) at /home/michi/development/git/libreoffice/sal/osl/unx/thread.cxx:245 #47 start_thread at ./nptl/pthread_create.c:447 #48 clone3 at ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80 Change-Id: Idb5b20bde8c306ed14efd5467887d55fdf470202 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172643 Reviewed-by: Michael Weghorn <[email protected]> Tested-by: Jenkins Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172653 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/vcl/inc/qt5/QtInstanceDialog.hxx b/vcl/inc/qt5/QtInstanceDialog.hxx index 303206be7194..6efa77818745 100644 --- a/vcl/inc/qt5/QtInstanceDialog.hxx +++ b/vcl/inc/qt5/QtInstanceDialog.hxx @@ -17,6 +17,7 @@ class QtInstanceDialog : public QtInstanceWindow, public virtual weld::Dialog public: QtInstanceDialog(QDialog* pDialog); + ~QtInstanceDialog(); virtual bool runAsync(std::shared_ptr<Dialog> const&, const std::function<void(sal_Int32)>&) override; diff --git a/vcl/qt5/QtInstanceDialog.cxx b/vcl/qt5/QtInstanceDialog.cxx index 14a4774c8671..36f7e75c4fc8 100644 --- a/vcl/qt5/QtInstanceDialog.cxx +++ b/vcl/qt5/QtInstanceDialog.cxx @@ -15,6 +15,13 @@ QtInstanceDialog::QtInstanceDialog(QDialog* pDialog) { } +QtInstanceDialog::~QtInstanceDialog() +{ + SolarMutexGuard g; + QtInstance* pQtInstance = GetQtInstance(); + pQtInstance->RunInMainThread([&] { m_pDialog.reset(); }); +} + bool QtInstanceDialog::runAsync(std::shared_ptr<Dialog> const&, const std::function<void(sal_Int32)>&) { commit 308545e2ed4e35960b8c4ed09dcd6a9f95872613 Author: Michael Weghorn <[email protected]> AuthorDate: Fri Aug 30 10:12:21 2024 +0200 Commit: Adolfo Jayme Barrientos <[email protected]> CommitDate: Sat Aug 31 08:30:05 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 <[email protected]> (cherry picked from commit 5e4c1638eaf16908add86fbf6d9d83204178f100) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172652 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/vcl/qt5/QtInstance.cxx b/vcl/qt5/QtInstance.cxx index 6872fb0fe1a3..eb4e297b49fd 100644 --- a/vcl/qt5/QtInstance.cxx +++ b/vcl/qt5/QtInstance.cxx @@ -790,6 +790,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/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) {}
