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) {}
 

Reply via email to