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

Reply via email to