include/vcl/weld/ComboBox.hxx        |    8 +++++---
 include/vcl/weld/EntryTreeView.hxx   |   12 ++++++------
 vcl/inc/jsdialog/jsdialogbuilder.hxx |   13 +++++++++----
 vcl/inc/qt5/QtInstanceComboBox.hxx   |    5 +++--
 vcl/inc/salvtables.hxx               |   14 ++++++++------
 vcl/jsdialog/jsdialogbuilder.cxx     |   12 ++++++------
 vcl/qt5/QtInstanceBuilder.cxx        |    1 +
 vcl/qt5/QtInstanceComboBox.cxx       |    4 ++--
 vcl/source/app/salvtables.cxx        |    9 +++++----
 vcl/source/weld/ComboBox.cxx         |    8 ++++++++
 vcl/unx/gtk3/gtkinst.cxx             |    4 ++--
 11 files changed, 55 insertions(+), 35 deletions(-)

New commits:
commit de055cfc35c9387e0149f60382f8ae497f242c00
Author:     Michael Weghorn <[email protected]>
AuthorDate: Fri Jan 16 17:08:16 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Sat Jan 17 06:39:13 2026 +0100

    tdf#130857 weld: Block signals in ComboBox::insert
    
    As is the case in other weld methods, signals about
    ComboBox changes are not supposed to be
    emitted when the change happens programatically
    and not by manual user interaction.
    
    Therefore, disable notify events in ComboBox::insert
    by renaming the actual toolkit implementations to
    do_insert and making the weld::ComboBox::insert
    base class method block signals while calling
    the virtual methods.
    
    See also e.g. weld::TreeView::insert which
    uses the same approach.
    
    The GTK implementation was already blocking signals
    because it calls GtkInstanceComboBox::insert_including_mru
    which in turn blocks signals during insertion.
    
    This fixes a nullptr deref seen with the qt6 VCL
    plugin and env var SAL_VCL_QT_USE_WELDED_WIDGETS=1
    in a WIP branch to declare support for native widgets
    in the dialog triggered as follows:
    
    * start Writer
    * "Insert" -> "Chart"
    * right-click on the X axes to open the context menu
    * activate the "Format Axis" context menu entry
    
    Backtrace:
    
        Thread 1 "soffice.bin" received signal SIGSEGV, Segmentation fault.
        0x00007ffff2525a54 in SvxNumberFormatShell::LanguageChanged (this=0x0, 
eLangType=..., rFmtSelPos=@0x7fffffff79ee: 0, rFmtEntries=std::__debug::vector 
of length 0, capacity 0)
            at 
/home/michi/development/git/libreoffice/svx/source/items/numfmtsh.cxx:190
        190         eCurLanguage = eLangType;
        (gdb) bt
        #0  0x00007ffff2525a54 in SvxNumberFormatShell::LanguageChanged 
(this=0x0, eLangType=..., rFmtSelPos=@0x7fffffff79ee: 0, 
rFmtEntries=std::__debug::vector of length 0, capacity 0)
            at 
/home/michi/development/git/libreoffice/svx/source/items/numfmtsh.cxx:190
        #1  0x00007fff8a6c5bfc in 
SvxNumberFormatTabPage::UpdateFormatListBox_Impl (this=0x5555606d5ea0, 
bCat=false, bUpdateEdit=true) at 
/home/michi/development/git/libreoffice/cui/source/tabpages/numfmt.cxx:990
        #2  0x00007fff8a6caa4a in SvxNumberFormatTabPage::SelFormatHdl_Impl 
(this=0x5555606d5ea0, pLb=0x555560788f98) at 
/home/michi/development/git/libreoffice/cui/source/tabpages/numfmt.cxx:1240
        #3  0x00007fff8a6cab98 in 
SvxNumberFormatTabPage::SelFormatListBoxHdl_Impl (this=0x5555606d5ea0, rLb=...) 
at /home/michi/development/git/libreoffice/cui/source/tabpages/numfmt.cxx:1131
        #4  0x00007fff8a6c43bd in 
SvxNumberFormatTabPage::LinkStubSelFormatListBoxHdl_Impl 
(instance=0x5555606d5ea0, data=...) at 
/home/michi/development/git/libreoffice/cui/source/tabpages/numfmt.cxx:1129
        #5  0x00007ffff115bb01 in Link<weld::ComboBox&, void>::Call 
(this=0x555560788f18, data=...) at include/tools/link.hxx:105
        #6  0x00007ffff114e85b in SvxLanguageBox::ChangeHdl 
(this=0x555560788f10, rControl=...) at 
/home/michi/development/git/libreoffice/svx/source/dialog/langbox.cxx:534
        #7  0x00007ffff114e51d in SvxLanguageBox::LinkStubChangeHdl 
(instance=0x555560788f10, data=...) at 
/home/michi/development/git/libreoffice/svx/source/dialog/langbox.cxx:464
        #8  0x00007fffe58a4371 in Link<weld::ComboBox&, void>::Call 
(this=0x555560789150, data=...) at include/tools/link.hxx:105
        #9  0x00007fffe58a3f88 in weld::ComboBox::signal_changed 
(this=0x555560789108) at include/vcl/weld/ComboBox.hxx:63
        #10 0x00007fffe58988dd in QtInstanceComboBox::signalChanged 
(this=0x555560788f60) at vcl/qt6/../qt5/QtInstanceComboBox.cxx:432
        #11 0x00007fffe58a4791 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, void (QtInstanceComboBox::*)()>::call(void (QtInstanceComboBox::*)(), 
QtInstanceComboBox*, void**)::{lambda()#1}::operator()() const 
(this=0x7fffffff7e10) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:127
        #12 0x00007fffe58a46c9 in 
QtPrivate::FunctorCallBase::call_internal<void, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, void (QtInstanceComboBox::*)()>::call(void (QtInstanceComboBox::*)(), 
QtInstanceComboBox*, void**)::{lambda()#1}>(void**, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, void (QtInstanceComboBox::*)()>::call(void (QtInstanceComboBox::*)(), 
QtInstanceComboBox*, void**)::{lambda()#1}&&) (args=0x7fffffff81f0, fn=...) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:65
        #13 0x00007fffe58a45fb in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, 
void, void (QtInstanceComboBox::*)()>::call(void (QtInstanceComboBox::*)(), 
QtInstanceComboBox*, void**)
            (f=(void (QtInstanceComboBox::*)(QtInstanceComboBox * const)) 
0x7fffe58988a0 <QtInstanceComboBox::signalChanged()>, o=0x555560788f60, 
arg=0x7fffffff81f0)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:126
        #14 0x00007fffe58a457d in QtPrivate::FunctionPointer<void 
(QtInstanceComboBox::*)()>::call<QtPrivate::List<>, void>(void 
(QtInstanceComboBox::*)(), QtInstanceComboBox*, void**)
            (f=(void (QtInstanceComboBox::*)(QtInstanceComboBox * const)) 
0x7fffe58988a0 <QtInstanceComboBox::signalChanged()>, o=0x555560788f60, 
arg=0x7fffffff81f0)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:174
        #15 0x00007fffe58a44a6 in QtPrivate::QCallableObject<void 
(QtInstanceComboBox::*)(), QtPrivate::List<>, void>::impl(int, 
QtPrivate::QSlotObjectBase*, QObject*, void**, bool*)
            (which=1, this_=0x5555607893d0, r=0x555560788f60, a=0x7fffffff81f0, 
ret=0x0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobjectdefs_impl.h:545
        #16 0x00007fffe46ea402 in QtPrivate::QSlotObjectBase::call 
(this=0x5555607893d0, r=0x555560788f60, a=0x7fffffff81f0) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
        #17 0x00007fffe491b872 in doActivate<false> (sender=0x55556077ac40, 
signal_index=13, argv=0x7fffffff81f0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4371
        #18 0x00007fffe4911c63 in QMetaObject::activate (sender=0x55556077ac40, 
m=0x7fffe33803b8 <QComboBox::staticMetaObject>, local_signal_index=6, 
argv=0x7fffffff81f0)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4431
        #19 0x00007fffe28859eb in QMetaObject::activate<void, QString> 
(sender=0x55556077ac40, mo=0x7fffe33803b8 <QComboBox::staticMetaObject>, 
local_signal_index=6, ret=0x0, args=...) at 
qtbase/src/corelib/kernel/qobjectdefs.h:321
        #20 0x00007fffe2a40f41 in QComboBox::currentTextChanged 
(this=0x55556077ac40, _t1=...) at 
qtbase/src/widgets/Widgets_autogen/include/moc_qcombobox.cpp:376
        #21 0x00007fffe2a3e3ad in QComboBoxPrivate::updateCurrentText 
(this=0x55556077c400, text=...) at 
/home/michi/development/git/qt5/qtbase/src/widgets/widgets/qcombobox.cpp:3210
        #22 0x00007fffe2a3e68e in QComboBoxPrivate::emitCurrentIndexChanged 
(this=0x55556077c400, index=...) at 
/home/michi/development/git/qt5/qtbase/src/widgets/widgets/qcombobox.cpp:1695
        #23 0x00007fffe2a3973b in QComboBoxPrivate::setCurrentIndex 
(this=0x55556077c400, mi=...) at 
/home/michi/development/git/qt5/qtbase/src/widgets/widgets/qcombobox.cpp:2480
        #24 0x00007fffe2a38b6a in QComboBox::setCurrentIndex 
(this=0x55556077ac40, index=0) at 
/home/michi/development/git/qt5/qtbase/src/widgets/widgets/qcombobox.cpp:2427
        #25 0x00007fffe2a3e550 in QComboBoxPrivate::rowsInserted 
(this=0x55556077c400, parent=..., start=0, end=0) at 
/home/michi/development/git/qt5/qtbase/src/widgets/widgets/qcombobox.cpp:1399
        #26 0x00007fffe2a57482 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, 
QtPrivate::List<QModelIndex const&, int, int>, void, void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int)>::call(void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int), QComboBoxPrivate*, 
void**)::{lambda()#1}::operator()() const (this=0x7fffffff85c0) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:127
        #27 0x00007fffe2a573dd in 
QtPrivate::FunctorCallBase::call_internal<void, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, 
QtPrivate::List<QModelIndex const&, int, int>, void, void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int)>::call(void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int), QComboBoxPrivate*, 
void**)::{lambda()#1}>(void**, 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, 
QtPrivate::List<QModelIndex const&, int, int>, void, void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int)>::call(void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int), QComboBoxPrivate*, 
void**)::{lambda()#1}&&) (args=0x7fffffff89c0, fn=...)
            at qtbase/src/corelib/kernel/qobjectdefs_impl.h:65
        #28 0x00007fffe2a57397 in 
QtPrivate::FunctorCall<std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>, 
QtPrivate::List<QModelIndex const&, int, int>, void, void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int)>::call
            (f=(void (QComboBoxPrivate::*)(QComboBoxPrivate * const, const 
QModelIndex &, int, int)) 0x7fffe2a3e3c0 
<QComboBoxPrivate::rowsInserted(QModelIndex const&, int, int)>, 
o=0x55556077c400, arg=0x7fffffff89c0)
            at qtbase/src/corelib/kernel/qobjectdefs_impl.h:126
        #29 0x00007fffe2a57301 in QtPrivate::FunctionPointer<void 
(QComboBoxPrivate::*)(QModelIndex const&, int, 
int)>::call<QtPrivate::List<QModelIndex const&, int, int>, void>
            (f=(void (QComboBoxPrivate::*)(QComboBoxPrivate * const, const 
QModelIndex &, int, int)) 0x7fffe2a3e3c0 
<QComboBoxPrivate::rowsInserted(QModelIndex const&, int, int)>, 
o=0x55556077c400, arg=0x7fffffff89c0)
            at qtbase/src/corelib/kernel/qobjectdefs_impl.h:174
        #30 0x00007fffe2a57230 in QtPrivate::QPrivateSlotObject<void 
(QComboBoxPrivate::*)(QModelIndex const&, int, int), 
QtPrivate::List<QModelIndex const&, int, int>, void>::impl
            (which=1, this_=0x55556077cd80, r=0x55556077ac40, a=0x7fffffff89c0, 
ret=0x0) at qtbase/src/corelib/kernel/qobject_p.h:272
        #31 0x00007fffe46ea402 in QtPrivate::QSlotObjectBase::call 
(this=0x55556077cd80, r=0x55556077ac40, a=0x7fffffff89c0) at 
qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
        #32 0x00007fffe491b872 in doActivate<false> (sender=0x555560766e90, 
signal_index=13, argv=0x7fffffff89c0) at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4371
        #33 0x00007fffe4911c63 in QMetaObject::activate (sender=0x555560766e90, 
m=0x7fffe527bdf0 <QAbstractItemModel::staticMetaObject>, local_signal_index=10, 
argv=0x7fffffff89c0)
            at 
/home/michi/development/git/qt5/qtbase/src/corelib/kernel/qobject.cpp:4431
        #34 0x00007fffe4d77bf5 in QMetaObject::activate<void, QModelIndex, int, 
int, QAbstractItemModel::QPrivateSignal>
            (sender=0x555560766e90, mo=0x7fffe527bdf0 
<QAbstractItemModel::staticMetaObject>, local_signal_index=10, ret=0x0, 
args=..., args=@0x7fffffff8a30: 0, args=@0x7fffffff8a2c: 0, args=...) at 
qtbase/src/corelib/kernel/qobjectdefs.h:321
        #35 0x00007fffe4d6b8ca in QAbstractItemModel::rowsInserted 
(this=0x555560766e90, _t1=..., _t2=0, _t3=0, _t4=...) at 
qtbase/src/corelib/Core_autogen/include/moc_qabstractitemmodel.cpp:690
        #36 0x00007fffe4d6b846 in QAbstractItemModel::endInsertRows 
(this=0x555560766e90) at 
/home/michi/development/git/qt5/qtbase/src/corelib/itemmodels/qabstractitemmodel.cpp:2922
        #37 0x00007fffe3c56a98 in QStandardItemModelPrivate::rowsInserted 
(this=0x555560775680, parent=0x55556077c9b0, row=0, count=1) at 
/home/michi/development/git/qt5/qtbase/src/gui/itemmodels/qstandarditemmodel.cpp:625
        #38 0x00007fffe3c56d93 in QStandardItemPrivate::insertRows 
(this=0x55556077c010, row=0, count=1, items=...) at 
/home/michi/development/git/qt5/qtbase/src/gui/itemmodels/qstandarditemmodel.cpp:497
        #39 0x00007fffe3c58bdd in QStandardItem::insertRow 
(this=0x55556077c9b0, row=0, items=...) at 
/home/michi/development/git/qt5/qtbase/src/gui/itemmodels/qstandarditemmodel.cpp:1601
        #40 0x00007fffe3c5aa3f in QStandardItemModel::insertRow 
(this=0x555560766e90, row=0, items=...) at 
/home/michi/development/git/qt5/qtbase/src/gui/itemmodels/qstandarditemmodel.cpp:2680
        #41 0x00007fffe2a4b5ea in QStandardItemModel::insertRow 
(this=0x555560766e90, arow=0, aitem=0x55556078ad80) at 
qtbase/src/gui/itemmodels/qstandarditemmodel.h:401
        #42 0x00007fffe2a419f7 in QComboBox::insertItem (this=0x55556077ac40, 
index=0, icon=..., text=..., userData=...) at 
/home/michi/development/git/qt5/qtbase/src/widgets/widgets/qcombobox.cpp:2593
        #43 0x00007fffe57c1ea7 in QComboBox::insertItem (this=0x55556077ac40, 
aindex=0, atext=..., auserData=...) at 
/home/michi/development/git/qt5/qtbase/src/widgets/widgets/qcombobox.h:228
        #44 0x00007fffe589ccd3 in QtInstanceComboBox::insert(int, rtl::OUString 
const&, rtl::OUString const*, rtl::OUString const*, 
VirtualDevice*)::$_0::operator()() const (this=0x55556078b1a0) at 
vcl/qt6/../qt5/QtInstanceComboBox.cxx:45
        #45 0x00007fffe589cba5 in std::__invoke_impl<void, 
QtInstanceComboBox::insert(int, rtl::OUString const&, rtl::OUString const*, 
rtl::OUString const*, VirtualDevice*)::$_0&>(std::__invoke_other, 
QtInstanceComboBox::insert(int, rtl::OUString const&, rtl::OUString const*, 
rtl::OUString const*, VirtualDevice*)::$_0&) (__f=...) at 
/usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/invoke.h:63
        #46 0x00007fffe589cb65 in std::__invoke_r<void, 
QtInstanceComboBox::insert(int, rtl::OUString const&, rtl::OUString const*, 
rtl::OUString const*, VirtualDevice*)::$_0&>(QtInstanceComboBox::insert(int, 
rtl::OUString const&, rtl::OUString const*, rtl::OUString const*, 
VirtualDevice*)::$_0&) (__fn=...) at 
/usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/invoke.h:113
        #47 0x00007fffe589ca4d in std::_Function_handler<void(), 
QtInstanceComboBox::insert(int, rtl::OUString const&, rtl::OUString const*, 
rtl::OUString const*, VirtualDevice*)::$_0>::_M_invoke (__functor=...)
            at 
/usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/std_function.h:292
        #48 0x00007fffe584803e in std::function<void()>::operator() 
(this=0x7fffffff9210) at 
/usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/std_function.h:593
        #49 0x00007fffe583f17f in QtInstance::RunInMainThread 
(this=0x5555555f8540, func=...) at vcl/qt6/../qt5/QtInstance.cxx:206
        #50 0x00007fffe5898fcf in QtInstanceComboBox::insert 
(this=0x555560788f60, nPos=0, rStr="Default - English (UK)", 
pId=0x7fffffff9558, pIconName=0x0, pImageSurface=0x0) at 
vcl/qt6/../qt5/QtInstanceComboBox.cxx:37
        #51 0x00007ffff115d8fb in weld::ComboBox::insert (this=0x555560789108, 
pos=-1, rItem=...) at include/vcl/weld/ComboBox.hxx:89
        #52 0x00007ffff115af02 in weld::ComboBox::append (this=0x555560789108, 
rItem=...) at include/vcl/weld/ComboBox.hxx:96
        #53 0x00007ffff114d012 in SvxLanguageBox::SetLanguageList
            (this=0x555560788f10, nLangList=(SvxLanguageListFlags::ALL | 
SvxLanguageListFlags::ONLY_KNOWN), bHasLangNone=false, 
bLangNoneIsLangAll=false, bCheckSpellAvail=false, bDefaultLangExist=true, 
eDefaultLangType=..., nDefaultType=4)
            at 
/home/michi/development/git/libreoffice/svx/source/dialog/langbox.cxx:323
        #54 0x00007fff8a6c405e in SvxNumberFormatTabPage::Init_Impl 
(this=0x5555606d5ea0) at 
/home/michi/development/git/libreoffice/cui/source/tabpages/numfmt.cxx:318
        #55 0x00007fff8a6c2e3d in SvxNumberFormatTabPage::SvxNumberFormatTabPage
            (this=0x5555606d5ea0, pPage=0x555560718098, 
pController=0x55555a7234c0, rCoreAttrs=SfxItemSet of pool 0x55555b593c40 with 
parent 0x0 and Which ranges: [(17, 18), (40, 70), (1000, 1012), (4021, 4079), 
(10085, 10085), (10932, 10932), (11090, 11090)] = {...}) at 
/home/michi/development/git/libreoffice/cui/source/tabpages/numfmt.cxx:247
        #56 0x00007fff8a6cc2ee in std::make_unique<SvxNumberFormatTabPage, 
weld::Container*&, weld::DialogController*&, SfxItemSet const&>
            (__args=@0x7fffffffa160: 0x555560718098, __args=@0x7fffffffa158: 
0x55555a7234c0, __args=SfxItemSet of pool 0x55555b593c40 with parent 0x0 and 
Which ranges: [(17, 18), (40, 70), (1000, 1012), (4021, 4079), (10085, 10085), 
(10932, 10932), (11090, 11090)] = {...}) at 
/usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/bits/unique_ptr.h:1084
        #57 0x00007fff8a6c46d9 in SvxNumberFormatTabPage::Create 
(pPage=0x555560718098, pController=0x55555a7234c0, rAttrSet=0x55555b5c41f0) at 
/home/michi/development/git/libreoffice/cui/source/tabpages/numfmt.cxx:326
        #58 0x00007ffff399ed1d in SfxTabDialogController::CreatePages 
(this=0x55555a7234c0) at 
/home/michi/development/git/libreoffice/sfx2/source/dialog/tabdlg.cxx:946
        #59 0x00007ffff399fd19 in SfxTabDialogController::Start_Impl 
(this=0x55555a7234c0) at 
/home/michi/development/git/libreoffice/sfx2/source/dialog/tabdlg.cxx:1034
        #60 0x00007ffff39a011e in SfxTabDialogController::runAsync 
(rController=std::shared_ptr<SfxTabDialogController> (use count 3, weak count 
1) = {...}, rFunc=...)
            at 
/home/michi/development/git/libreoffice/sfx2/source/dialog/tabdlg.cxx:1091
        #61 0x00007fff8b0da287 in 
chart::ChartController::executeDlg_ObjectProperties_withUndoGuard
            (this=0x55555c98cd40, xUndoGuard=std::shared_ptr<chart::UndoGuard> 
(empty) = {...}, rObjectCID="CID/D=0:CS=0:Axis=0,0", bSuccessOnUnchanged=false)
            at 
/home/michi/development/git/libreoffice/chart2/source/controller/main/ChartController_Properties.cxx:778
        #62 0x00007fff8b0d94fc in 
chart::ChartController::executeDlg_ObjectProperties (this=0x55555c98cd40, 
rSelectedObjectCID="CID/D=0:CS=0:Axis=0,0")
            at 
/home/michi/development/git/libreoffice/chart2/source/controller/main/ChartController_Properties.cxx:695
        #63 0x00007fff8b0d7368 in 
chart::ChartController::executeDispatch_FormatObject (this=0x55555c98cd40, 
rDispatchCommand=u"FormatAxis")
            at 
/home/michi/development/git/libreoffice/chart2/source/controller/main/ChartController_Properties.cxx:651
        #64 0x00007fff8b0a72a3 in chart::ChartController::dispatch 
(this=0x55555c98cd40, rURL=..., rArgs=empty uno::Sequence) at 
/home/michi/development/git/libreoffice/chart2/source/controller/main/ChartController.cxx:1226
        #65 0x00007fff8b1512fc in chart::ControllerCommandDispatch::dispatch 
(this=0x55555b6ae620, URL=..., Arguments=empty uno::Sequence)
            at 
/home/michi/development/git/libreoffice/chart2/source/controller/main/ControllerCommandDispatch.cxx:933
        #66 0x00007ffff4b03874 in framework::(anonymous 
namespace)::AsyncMenuExecute (data=0x55555b573710) at 
/home/michi/development/git/libreoffice/framework/source/uielement/menubarmanager.cxx:793
        #67 0x00007fffedc46db1 in Link<void*, void>::Call (this=0x55555b574058, 
data=0x55555b573710) at include/tools/link.hxx:105
        #68 0x00007fffedc426d1 in ImplHandleUserEvent (pSVEvent=0x55555b574050) 
at /home/michi/development/git/libreoffice/vcl/source/window/winproc.cxx:2314
        #69 0x00007fffedc3f5ff in ImplWindowFrameProc (_pWindow=0x555556d919d0, 
nEvent=SalEvent::UserEvent, pEvent=0x55555b574050) at 
/home/michi/development/git/libreoffice/vcl/source/window/winproc.cxx:2871
        #70 0x00007fffe582034c in SalFrame::CallCallback (this=0x555556949a50, 
nEvent=SalEvent::UserEvent, pEvent=0x55555b574050) at vcl/inc/salframe.hxx:310
        #71 0x00007fffe58421df in QtInstance::ProcessEvent 
(this=0x5555555f8540, aEvent=...) at vcl/qt6/../qt5/QtInstance.cxx:600
        #72 0x00007fffee22366d in 
SalUserEventList::DispatchUserEvents(bool)::$_0::operator()() const 
(this=0x7fffffffb990) at 
/home/michi/development/git/libreoffice/vcl/source/app/salusereventlist.cxx:119
        #73 0x00007fffee22353b in SalUserEventList::DispatchUserEvents 
(this=0x5555555f85b0, bHandleAllCurrentEvents=false) at 
/home/michi/development/git/libreoffice/vcl/source/app/salusereventlist.cxx:120
        #74 0x00007fffe583e921 in QtInstance::ImplYield (this=0x5555555f8540, 
bWait=true, bHandleAllCurrentEvents=false) at vcl/qt6/../qt5/QtInstance.cxx:496
        #75 0x00007fffe5841da1 in QtInstance::DoYield (this=0x5555555f8540, 
bWait=true, bHandleAllCurrentEvents=false) at vcl/qt6/../qt5/QtInstance.cxx:518
        #76 0x00007fffee2ee966 in InnerYield (i_bWait=true, i_bAllEvents=false) 
at /home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:389
        #77 0x00007fffee2ee1ef in Application::Yield () at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:502
        #78 0x00007fffee2edfd0 in Application::Execute () at 
/home/michi/development/git/libreoffice/vcl/source/app/svapp.cxx:364
        #79 0x00007ffff7b228b5 in desktop::Desktop::Main (this=0x7fffffffd540) 
at /home/michi/development/git/libreoffice/desktop/source/app/app.cxx:1681
        #80 0x00007fffee3179d6 in ImplSVMain () at 
/home/michi/development/git/libreoffice/vcl/source/app/svmain.cxx:230
        #81 0x00007fffee3194f9 in SVMain () at 
/home/michi/development/git/libreoffice/vcl/source/app/svmain.cxx:248
        #82 0x00007ffff7b9c86a in soffice_main () at 
/home/michi/development/git/libreoffice/desktop/source/app/sofficemain.cxx:122
        #83 0x0000555555555a2d in sal_main () at 
/home/michi/development/git/libreoffice/desktop/source/app/main.c:51
        #84 0x0000555555555a07 in main (argc=2, argv=0x7fffffffd748) at 
/home/michi/development/git/libreoffice/desktop/source/app/main.c:49
    
    Change-Id: I5ecf1c0e0f60b5f215bb21894e98f93ce4516e07
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197468
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/include/vcl/weld/ComboBox.hxx b/include/vcl/weld/ComboBox.hxx
index fbdc2b8d205d..adeef50a86e3 100644
--- a/include/vcl/weld/ComboBox.hxx
+++ b/include/vcl/weld/ComboBox.hxx
@@ -75,13 +75,15 @@ protected:
     Link<vcl::RenderContext&, Size> m_aGetSizeHdl;
     Size signal_custom_get_size(vcl::RenderContext& rDevice) { return 
m_aGetSizeHdl.Call(rDevice); }
 
+    virtual void do_insert(int pos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface)
+        = 0;
     virtual void do_set_active(int pos) = 0;
     virtual void do_set_active_id(const OUString& rStr) = 0;
 
 public:
-    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface)
-        = 0;
+    void insert(int pos, const OUString& rStr, const OUString* pId, const 
OUString* pIconName,
+                VirtualDevice* pImageSurface);
     virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems, 
bool bKeepExisting)
         = 0;
     void insert(int pos, const weld::ComboBoxEntry& rItem)
diff --git a/include/vcl/weld/EntryTreeView.hxx 
b/include/vcl/weld/EntryTreeView.hxx
index 4383f239da5c..29341defe8b2 100644
--- a/include/vcl/weld/EntryTreeView.hxx
+++ b/include/vcl/weld/EntryTreeView.hxx
@@ -29,6 +29,12 @@ protected:
     std::unique_ptr<Entry> m_xEntry;
     std::unique_ptr<TreeView> m_xTreeView;
 
+    virtual void do_insert(int pos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface) override
+    {
+        m_xTreeView->insert(pos, rStr, pId, pIconName, pImageSurface);
+    }
+
 public:
     EntryTreeView(std::unique_ptr<Entry> xEntry, std::unique_ptr<TreeView> 
xTreeView);
 
@@ -43,12 +49,6 @@ public:
         m_xTreeView->thaw();
     }
 
-    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface) override
-    {
-        m_xTreeView->insert(pos, rStr, pId, pIconName, pImageSurface);
-    }
-
     virtual int get_count() const override { return m_xTreeView->n_children(); 
}
     virtual void clear() override { m_xTreeView->clear(); }
 
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx 
b/vcl/inc/jsdialog/jsdialogbuilder.hxx
index f2d978c57e1b..a6ba49019389 100644
--- a/vcl/inc/jsdialog/jsdialogbuilder.hxx
+++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx
@@ -551,11 +551,13 @@ public:
 
 class JSListBox final : public JSWidget<SalInstanceComboBoxWithoutEdit, 
::ListBox>
 {
+protected:
+    virtual void do_insert(int pos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
+
 public:
     JSListBox(JSDialogSender* pSender, ::ListBox* pListBox, 
SalInstanceBuilder* pBuilder,
               bool bTakeOwnership);
-    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
     virtual void remove(int pos) override;
     virtual void do_set_active(int pos) override;
 };
@@ -563,11 +565,14 @@ public:
 class JSComboBox final : public JSWidget<SalInstanceComboBoxWithEdit, 
::ComboBox>,
                          public OnDemandRenderingHandler
 {
+protected:
+    virtual void do_insert(int pos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
+
 public:
     JSComboBox(JSDialogSender* pSender, ::ComboBox* pComboBox, 
SalInstanceBuilder* pBuilder,
                bool bTakeOwnership);
-    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
+
     virtual void remove(int pos) override;
     void set_entry_text_without_notify(const OUString& rText);
     virtual void set_entry_text(const OUString& rText) override;
diff --git a/vcl/inc/qt5/QtInstanceComboBox.hxx 
b/vcl/inc/qt5/QtInstanceComboBox.hxx
index 8b6ed5bd541d..1286e4ddfd8c 100644
--- a/vcl/inc/qt5/QtInstanceComboBox.hxx
+++ b/vcl/inc/qt5/QtInstanceComboBox.hxx
@@ -22,11 +22,12 @@ class QtInstanceComboBox : public QtInstanceWidget, public 
virtual weld::ComboBo
     QComboBox* m_pComboBox;
     bool m_bSorted;
 
+    virtual void do_insert(int nPos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
+
 public:
     QtInstanceComboBox(QComboBox* pComboBox);
 
-    virtual void insert(int nPos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
     virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems,
                                bool bKeepExisting) override;
 
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index 37af5460a424..be5c78a3f31a 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -929,6 +929,10 @@ class SalInstanceComboBoxWithoutEdit : public 
SalInstanceComboBox<ListBox>
 private:
     DECL_LINK(SelectHdl, ListBox&, void);
 
+protected:
+    virtual void do_insert(int pos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
+
 public:
     SalInstanceComboBoxWithoutEdit(ListBox* pListBox, SalInstanceBuilder* 
pBuilder,
                                    bool bTakeOwnership);
@@ -937,9 +941,6 @@ public:
 
     virtual void remove(int pos) override;
 
-    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
-
     virtual void insert_separator(int pos, const OUString& /*rId*/) override;
 
     virtual bool has_entry() const override;
@@ -1001,6 +1002,10 @@ private:
     WeldTextFilter m_aTextFilter;
     bool m_bInSelect;
 
+protected:
+    virtual void do_insert(int pos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
+
 public:
     SalInstanceComboBoxWithEdit(::ComboBox* pComboBox, SalInstanceBuilder* 
pBuilder,
                                 bool bTakeOwnership);
@@ -1015,9 +1020,6 @@ public:
 
     virtual void remove(int pos) override;
 
-    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface) override;
-
     virtual void insert_separator(int pos, const OUString& /*rId*/) override;
 
     virtual void set_entry_text(const OUString& rText) override;
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index 772ab1b28e69..12be503b6834 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -1247,10 +1247,10 @@ JSListBox::JSListBox(JSDialogSender* pSender, 
::ListBox* pListBox, SalInstanceBu
 {
 }
 
-void JSListBox::insert(int pos, const OUString& rStr, const OUString* pId,
-                       const OUString* pIconName, VirtualDevice* pImageSurface)
+void JSListBox::do_insert(int pos, const OUString& rStr, const OUString* pId,
+                          const OUString* pIconName, VirtualDevice* 
pImageSurface)
 {
-    SalInstanceComboBoxWithoutEdit::insert(pos, rStr, pId, pIconName, 
pImageSurface);
+    SalInstanceComboBoxWithoutEdit::do_insert(pos, rStr, pId, pIconName, 
pImageSurface);
     sendUpdate();
 }
 
@@ -1273,10 +1273,10 @@ JSComboBox::JSComboBox(JSDialogSender* pSender, 
::ComboBox* pComboBox, SalInstan
 {
 }
 
-void JSComboBox::insert(int pos, const OUString& rStr, const OUString* pId,
-                        const OUString* pIconName, VirtualDevice* 
pImageSurface)
+void JSComboBox::do_insert(int pos, const OUString& rStr, const OUString* pId,
+                           const OUString* pIconName, VirtualDevice* 
pImageSurface)
 {
-    SalInstanceComboBoxWithEdit::insert(pos, rStr, pId, pIconName, 
pImageSurface);
+    SalInstanceComboBoxWithEdit::do_insert(pos, rStr, pId, pIconName, 
pImageSurface);
     sendUpdate();
 }
 
diff --git a/vcl/qt5/QtInstanceComboBox.cxx b/vcl/qt5/QtInstanceComboBox.cxx
index 724e757839f5..335079e9d681 100644
--- a/vcl/qt5/QtInstanceComboBox.cxx
+++ b/vcl/qt5/QtInstanceComboBox.cxx
@@ -30,8 +30,8 @@ QtInstanceComboBox::QtInstanceComboBox(QComboBox* pComboBox)
                      &QtInstanceComboBox::signalChanged);
 }
 
-void QtInstanceComboBox::insert(int nPos, const OUString& rStr, const 
OUString* pId,
-                                const OUString* pIconName, VirtualDevice* 
pImageSurface)
+void QtInstanceComboBox::do_insert(int nPos, const OUString& rStr, const 
OUString* pId,
+                                   const OUString* pIconName, VirtualDevice* 
pImageSurface)
 {
     SolarMutexGuard g;
     GetQtInstance().RunInMainThread([&] {
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 30b33ca1d1f7..3d0458101750 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -6051,8 +6051,9 @@ OUString 
SalInstanceComboBoxWithoutEdit::get_active_text() const
 
 void SalInstanceComboBoxWithoutEdit::remove(int pos) { 
m_xComboBox->RemoveEntry(pos); }
 
-void SalInstanceComboBoxWithoutEdit::insert(int pos, const OUString& rStr, 
const OUString* pId,
-                                            const OUString* pIconName, 
VirtualDevice* pImageSurface)
+void SalInstanceComboBoxWithoutEdit::do_insert(int pos, const OUString& rStr, 
const OUString* pId,
+                                               const OUString* pIconName,
+                                               VirtualDevice* pImageSurface)
 {
     auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos;
     sal_Int32 nInsertedAt;
@@ -6206,8 +6207,8 @@ OUString SalInstanceComboBoxWithEdit::get_active_text() 
const { return m_xComboB
 
 void SalInstanceComboBoxWithEdit::remove(int pos) { 
m_xComboBox->RemoveEntryAt(pos); }
 
-void SalInstanceComboBoxWithEdit::insert(int pos, const OUString& rStr, const 
OUString* pId,
-                                         const OUString* pIconName, 
VirtualDevice* pImageSurface)
+void SalInstanceComboBoxWithEdit::do_insert(int pos, const OUString& rStr, 
const OUString* pId,
+                                            const OUString* pIconName, 
VirtualDevice* pImageSurface)
 {
     auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos;
     sal_Int32 nInsertedAt;
diff --git a/vcl/source/weld/ComboBox.cxx b/vcl/source/weld/ComboBox.cxx
index 00304e52cf4f..3f6149776ea6 100644
--- a/vcl/source/weld/ComboBox.cxx
+++ b/vcl/source/weld/ComboBox.cxx
@@ -11,6 +11,14 @@
 
 namespace weld
 {
+void weld::ComboBox::insert(int pos, const OUString& rStr, const OUString* pId,
+                            const OUString* pIconName, VirtualDevice* 
pImageSurface)
+{
+    disable_notify_events();
+    do_insert(pos, rStr, pId, pIconName, pImageSurface);
+    enable_notify_events();
+}
+
 void weld::ComboBox::set_active(int pos)
 {
     disable_notify_events();
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index ea044f8c2d38..77108fb7e20d 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -20152,7 +20152,7 @@ public:
         remove_including_mru(pos);
     }
 
-    virtual void insert(int pos, const OUString& rText, const OUString* pId, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
+    virtual void do_insert(int pos, const OUString& rText, const OUString* 
pId, const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         insert_including_mru(include_mru(pos), rText, pId, pIconName, 
pImageSurface);
     }
@@ -22104,7 +22104,7 @@ public:
         remove_including_mru(pos);
     }
 
-    virtual void insert(int pos, const OUString& rText, const OUString* pId, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
+    virtual void do_insert(int pos, const OUString& rText, const OUString* 
pId, const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         insert_including_mru(include_mru(pos), rText, pId, pIconName, 
pImageSurface);
     }
commit 1ca26c761a8e2f4e87f39e9af6bcbe3dfb7e3c4d
Author:     Michael Weghorn <[email protected]>
AuthorDate: Fri Jan 16 16:30:33 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Sat Jan 17 06:39:06 2026 +0100

    tdf#130857 qt weld: Support chart "Insert Titles" dialog
    
    This means that native Qt widgets are used for that dialog
    now when using the qt5 or qt6 VCL plugin and starting LO with
    environment variable SAL_VCL_QT_USE_WELDED_WIDGETS=1 set.
    
    The dialog can be triggered like this:
    
    * start Writer
    * "Insert" -> "Chart"
    * right-click on the background of the chart and select
      the "Insert Titles" context menu entry
    
    Change-Id: I6c8f3262977f01f99e3862cac726ed8e7c399cad
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197464
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/qt5/QtInstanceBuilder.cxx b/vcl/qt5/QtInstanceBuilder.cxx
index ade726cd52c1..c6c222aa5a68 100644
--- a/vcl/qt5/QtInstanceBuilder.cxx
+++ b/vcl/qt5/QtInstanceBuilder.cxx
@@ -163,6 +163,7 @@ bool QtInstanceBuilder::IsUIFileSupported(const OUString& 
rUIFile, const weld::W
         u"modules/scalc/ui/ztestdialog.ui"_ustr,
         u"modules/schart/ui/charttypedialog.ui"_ustr,
         u"modules/schart/ui/insertaxisdlg.ui"_ustr,
+        u"modules/schart/ui/inserttitledlg.ui"_ustr,
         u"modules/sdraw/ui/dlgsnap.ui"_ustr,
         u"modules/sdraw/ui/insertlayer.ui"_ustr,
         u"modules/simpress/ui/customslideshows.ui"_ustr,

Reply via email to