desktop/source/deployment/gui/dp_gui_service.cxx | 2 desktop/source/deployment/gui/dp_gui_theextmgr.cxx | 6 desktop/source/deployment/gui/dp_gui_theextmgr.hxx | 2 download.lst | 16 +- emfio/qa/cppunit/emf/EmfImportTest.cxx | 12 + external/freetype/ubsan.patch | 4 hwpfilter/source/hwpreader.cxx | 7 - odk/Package_examples.mk | 8 - odk/Package_odk_headers.mk | 14 -- solenv/bin/modules/installer/scriptitems.pm | 2 sw/inc/AnnotationWin.hxx | 1 sw/source/uibase/docvw/AnnotationWin2.cxx | 13 ++ vcl/inc/win/salinst.h | 1 vcl/osx/salinst.cxx | 34 +++++ vcl/source/gdi/TypeSerializer.cxx | 15 ++ vcl/win/app/salinst.cxx | 128 +++------------------ xmloff/source/style/xmlnumi.cxx | 9 - 17 files changed, 134 insertions(+), 140 deletions(-)
New commits: commit f5fd29560dbbacb1a7a39a2264e5dde6226d396e Author: Xisco Fauli <[email protected]> AuthorDate: Sat Mar 7 12:33:42 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:51:15 2026 +0100 sqlite: upgrade to 3.52.0 Downloaded from https://www.sqlite.org/2026/sqlite-amalgamation-3520000.zip Change-Id: Idf46e338a1c6d767ed6b15bc9cd464a0645072f1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201169 Reviewed-by: Xisco Fauli <[email protected]> Tested-by: Jenkins (cherry picked from commit 60ce5b271321c054cb7346792c57af47c8cd8faa) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201206 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/download.lst b/download.lst index 1337878d293e..1caf9801de44 100644 --- a/download.lst +++ b/download.lst @@ -730,8 +730,8 @@ SKIA_TARBALL := skia-m142-f4ed99d2443962782cf5f8b4dd27179f131e7cbe.tar.xz # three static lines # so that git cherry-pick # will not run into conflicts -SQLITE3_SHA256SUM := 6e2a845a493026bdbad0618b2b5a0cf48584faab47384480ed9f592d912f23ec -SQLITE3_TARBALL := sqlite-amalgamation-3510200.zip +SQLITE3_SHA256SUM := 45d0fea15971dd1300e5b509f48ca134621e10d9297713b64618fbca21b325fa +SQLITE3_TARBALL := sqlite-amalgamation-3520000.zip # three static lines # so that git cherry-pick # will not run into conflicts commit 6d96da3a1d3c4bf5a8529c2bc76ce4d6cc97f197 Author: Patrick Luby <[email protected]> AuthorDate: Wed Mar 4 11:56:25 2026 -0500 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:51:15 2026 +0100 tdf#170740 only repost the same left mouse up event once Dragging a window's titlebar with the Option key pressed may trigger live resizing. Unlike normal live resizing, live resizing while Option-dragging a window needs left mouse up events to be dispatched to end live resizing. So if we keep reposting the same left mouse up event, LibreOffice will go into an infinite loop waiting for live resizing to end. Reposting last mouse up events is still needed to prevent tdf#155092 during normal live resizing so allow last mouse up events to be reposted but only once. The purpose of reposting is to skip native event dispatching during this pass and only let native timers run. This lets pending LibreOffice resizing and repainting timers run before the left mouse up event is dispatched. Change-Id: Ide2ec9988a8258cd1acf9852a61cfc4d4c1abdef Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200957 Reviewed-by: Dan Williams <[email protected]> Tested-by: Jenkins Reviewed-by: Patrick Luby <[email protected]> (cherry picked from commit 7575bbe54a6afec3b289985593977579835cce3f) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201195 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx index 375f8361b2e2..6cd78291ca40 100644 --- a/vcl/osx/salinst.cxx +++ b/vcl/osx/salinst.cxx @@ -586,8 +586,40 @@ bool AquaSalInstance::DoYield(bool bWait, bool bHandleAllCurrentEvents) // the front of the event queue so no more events will be // dispatched until live resizing ends. Surprisingly, live // resizing appears to end in the next mouse down event. - if ( ImplGetSVData()->mpWinData->mbIsLiveResize && [pEvent type] == NSEventTypeLeftMouseUp ) + bool bRepostEvent = false; + if ( ImplGetSVData()->mpWinData->mbIsLiveResize ) + bRepostEvent = ( [pEvent type] == NSEventTypeLeftMouseUp ); + + // tdf#170740 only repost the same left mouse up event once + // Dragging a window's titlebar with the Option key pressed + // may trigger live resizing. Unlike normal live resizing, + // live resizing while Option-dragging a window needs + // left mouse up events to be dispatched to end live + // resizing. So if we keep reposting the same left mouse up + // event, LibreOffice will go into an infinite loop waiting + // for live resizing to end. + // Reposting last mouse up events is still needed to + // prevent tdf#155092 during normal live resizing so allow + // last mouse up events to be reposted but only once. + // The purpose of reposting is to skip native event + // dispatching during this pass and only let native timers + // run. This lets pending LibreOffice resizing and + // repainting timers run before the left mouse up event is + // dispatched. + static NSEvent *pLastRepostedEvent = nil; + if ( pLastRepostedEvent ) { + [pLastRepostedEvent release]; + pLastRepostedEvent = nil; + } + // Only repost event if pLastRepostedEvent was already nil. + // Reposting an event while waiting to dispatch a previously + // reposted event can cause incorrect ordering of native events + // in the native queue. So, to be safe, resume normal event + // dispatching. + else if ( bRepostEvent ) + { + pLastRepostedEvent = [pEvent retain]; [NSApp postEvent: pEvent atStart: YES]; return false; } commit f32a01530e36908d1cbbdc950d426a402d3eaf5b Author: Xisco Fauli <[email protected]> AuthorDate: Fri Mar 6 16:28:24 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:51:15 2026 +0100 CppunitTest_emfio_emf: fix build on Windows Change-Id: Iffc791557eea3e38b02262f81c26c5dece6c343b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201137 Tested-by: Jenkins Reviewed-by: Christian Lohmaier <[email protected]> diff --git a/emfio/qa/cppunit/emf/EmfImportTest.cxx b/emfio/qa/cppunit/emf/EmfImportTest.cxx index 46a5b2fa8281..3d630ae4229c 100644 --- a/emfio/qa/cppunit/emf/EmfImportTest.cxx +++ b/emfio/qa/cppunit/emf/EmfImportTest.cxx @@ -1388,12 +1388,20 @@ CPPUNIT_TEST_FIXTURE(Test, testExtTextOutScaleGM_COMPATIBLE) assertXPath(pDocument, aXPathPrefix + "textsimpleportion[3]", "text", u"24"); assertXPath(pDocument, aXPathPrefix + "textsimpleportion[3]", "fontcolor", u"#000000"); +#ifndef _WIN32 //FIXME assertXPath(pDocument, aXPathPrefix + "textsimpleportion[3]", "width", u"201"); +#else + assertXPath(pDocument, aXPathPrefix + "textsimpleportion[3]", "width", u"199"); +#endif assertXPath(pDocument, aXPathPrefix + "textsimpleportion[3]", "height", u"317"); assertXPath(pDocument, aXPathPrefix + "textsimpleportion[4]", "text", u"25"); assertXPath(pDocument, aXPathPrefix + "textsimpleportion[4]", "fontcolor", u"#000000"); +#ifndef _WIN32 //FIXME assertXPath(pDocument, aXPathPrefix + "textsimpleportion[4]", "width", u"268"); +#else + assertXPath(pDocument, aXPathPrefix + "textsimpleportion[4]", "width", u"267"); +#endif assertXPath(pDocument, aXPathPrefix + "textsimpleportion[4]", "height", u"317"); assertXPath(pDocument, aXPathPrefix + "polygonstroke", 9); @@ -1749,7 +1757,11 @@ CPPUNIT_TEST_FIXTURE(Test, testCreatePen) assertXPath(pDocument, aXPathPrefix + "mask/textsimpleportion", 69); assertXPath(pDocument, aXPathPrefix + "mask/textsimpleportion[1]", "height", u"374"); +#ifndef _WIN32 // FIXME assertXPath(pDocument, aXPathPrefix + "mask/textsimpleportion[1]", "width", u"310"); +#else + assertXPath(pDocument, aXPathPrefix + "mask/textsimpleportion[1]", "width", u"308"); +#endif assertXPath(pDocument, aXPathPrefix + "mask/textsimpleportion[1]", "x", u"28124"); assertXPath(pDocument, aXPathPrefix + "mask/textsimpleportion[1]", "y", u"16581"); assertXPath(pDocument, aXPathPrefix + "mask/textsimpleportion[1]", "text", u"0.0"); commit 91bcfe5e645ee72117f4c234f9945d09d23315c7 Author: Xisco Fauli <[email protected]> AuthorDate: Thu Mar 5 11:05:26 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:59 2026 +0100 poppler: upgrade to 26.03.0 Downloaded from https://poppler.freedesktop.org/poppler-26.03.0.tar.xz Change-Id: Ibd2a34f0d5729b759eab28d8e4c7bd7fd7f7d52a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201014 Reviewed-by: Xisco Fauli <[email protected]> Tested-by: Jenkins (cherry picked from commit 107bdebf8194ffdebed8a292cde548bcf53468ab) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201022 Reviewed-by: Christian Lohmaier <[email protected]> diff --git a/download.lst b/download.lst index 1f8e47dbe1a4..1337878d293e 100644 --- a/download.lst +++ b/download.lst @@ -667,8 +667,8 @@ LIBTIFF_TARBALL := tiff-4.7.1.tar.xz # three static lines # so that git cherry-pick # will not run into conflicts -POPPLER_SHA256SUM := dded8621f7b2f695c91063aab1558691c8418374cd583501e89ed39487e7ab77 -POPPLER_TARBALL := poppler-26.02.0.tar.xz +POPPLER_SHA256SUM := 8b3c5e2a9f2ab4c3ec5029f28af1b433c6b71f0d1e7b3997aa561cf1c0ca4ebe +POPPLER_TARBALL := poppler-26.03.0.tar.xz POPPLER_DATA_SHA256SUM := c835b640a40ce357e1b83666aabd95edffa24ddddd49b8daff63adb851cdab74 POPPLER_DATA_TARBALL := poppler-data-0.4.12.tar.gz # three static lines commit ede3684b3d085a86286e1a968b7339168fe6b838 Author: Hossein <[email protected]> AuthorDate: Sat Feb 21 23:05:14 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:59 2026 +0100 tdf#170954 Ship LibreOfficeKit headers / examples on macOS This reverts commit 20ee295dd11fcad8ba72439e6ad28f61ed740958, such that LibreOfficeKit headers and examples are usable on macOS again. After 5d4a689293d47c7671315452f6b90a185fe809c0 and 857a760f317ad6540a6f03169ef8dda97d2c1de7 among other related patches, LibreOfficeKit became usable on macOS. The build issues are fixed in d6773eccb382c0c6b9d78f406c96230c5f40f44c. Change-Id: Ifaac9c3652bf4b4f53b41997015f00b9083628a8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199965 Tested-by: Jenkins Reviewed-by: Hossein <[email protected]> (cherry picked from commit 2a72ad755d75741a71eff8e75803072c871956f2) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200251 Reviewed-by: Christian Lohmaier <[email protected]> diff --git a/odk/Package_examples.mk b/odk/Package_examples.mk index f0b4eff160a6..cbc0f0b19f33 100644 --- a/odk/Package_examples.mk +++ b/odk/Package_examples.mk @@ -435,11 +435,9 @@ $(eval $(call gb_Package_add_files_with_dir,odk_examples,$(SDKDIRNAME)/examples, cpp/Convertor/Convertor.cxx \ cpp/Convertor/Makefile \ cpp/Convertor/test.odt \ - $(if $(filter-out $(OS),MACOSX), \ - cpp/lokconvert/lokconvert.cxx \ - cpp/lokconvert/Makefile \ - cpp/lokconvert/test.odt \ - ) \ + cpp/lokconvert/lokconvert.cxx \ + cpp/lokconvert/Makefile \ + cpp/lokconvert/test.odt \ cpp/Draw/Draw.cxx \ cpp/Draw/Makefile \ cpp/DocumentLoader/DocumentLoader.cxx \ diff --git a/odk/Package_odk_headers.mk b/odk/Package_odk_headers.mk index e9af36c0fe25..c103c23d4b27 100644 --- a/odk/Package_odk_headers.mk +++ b/odk/Package_odk_headers.mk @@ -184,14 +184,12 @@ $(eval $(call gb_Package_add_files_with_dir,odk_headers,$(SDKDIRNAME)/include,\ uno/mapping.hxx \ uno/sequence2.h \ uno/threadpool.h \ - $(if $(filter-out $(OS),MACOSX), \ - $(if $(ENABLE_GTK3),LibreOfficeKit/LibreOfficeKitGtk.h) \ - LibreOfficeKit/LibreOfficeKit.hxx \ - LibreOfficeKit/LibreOfficeKitEnums.h \ - LibreOfficeKit/LibreOfficeKit.h \ - LibreOfficeKit/LibreOfficeKitInit.h \ - LibreOfficeKit/LibreOfficeKitTypes.h \ - ) \ + $(if $(ENABLE_GTK3),LibreOfficeKit/LibreOfficeKitGtk.h) \ + LibreOfficeKit/LibreOfficeKit.hxx \ + LibreOfficeKit/LibreOfficeKitEnums.h \ + LibreOfficeKit/LibreOfficeKit.h \ + LibreOfficeKit/LibreOfficeKitInit.h \ + LibreOfficeKit/LibreOfficeKitTypes.h \ )) # vim: set noet sw=4 ts=4: commit 1d9e4b2942db76e5946bdd0c70911e1aaeb98964 Author: Caolán McNamara <[email protected]> AuthorDate: Sun Mar 1 20:56:13 2026 +0000 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:59 2026 +0100 ofz#421997573 Timeout clip nNumDisplayLevels import like export does in SvxXMLNumRuleExport::exportLevelStyle Change-Id: I1ddc49a9c70155b9ac6f218cc9d453c36302302f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200732 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> (cherry picked from commit ba2fb4af99f05a8a8a48d8fbc51bd232a91d634e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201056 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/xmloff/source/style/xmlnumi.cxx b/xmloff/source/style/xmlnumi.cxx index 8019855f6b16..487af94ab5d8 100644 --- a/xmloff/source/style/xmlnumi.cxx +++ b/xmloff/source/style/xmlnumi.cxx @@ -61,6 +61,7 @@ #include <xmloff/maptype.hxx> #include <xmloff/xmlnumi.hxx> +#include <algorithm> #include <optional> using namespace ::com::sun::star; @@ -407,12 +408,14 @@ Sequence<beans::PropertyValue> SvxXMLListLevelStyleContext_Impl::GetProperties() // Generate list format string, based on this sListFormat = std::make_optional(sPrefix); - for (int i = 1; i <= nNumDisplayLevels; i++) + // Can't display more levels than exist + sal_Int32 nDisplayLevels = std::min<sal_Int32>(nNumDisplayLevels, nLevel + 1); + for (int i = 1; i <= nDisplayLevels; i++) { *sListFormat += "%"; - *sListFormat += OUString::number(nLevel - nNumDisplayLevels + i + 1); + *sListFormat += OUString::number(nLevel - nDisplayLevels + i + 1); *sListFormat += "%"; - if (i != nNumDisplayLevels) + if (i != nDisplayLevels) *sListFormat += "."; // Default separator for older ODT } commit 70e0677b0f6c89afd686f0d8ec95c2a02acc8cbe Author: Caolán McNamara <[email protected]> AuthorDate: Sun Mar 1 15:26:55 2026 +0000 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:59 2026 +0100 ofz#473156285 Integer-overflow FWIW oox/source/drawingml/fillproperties.cxx is also clamping nOffsetX/nOffsetY to max 100. nBorder > 100% doesn't seem to make sense and the various GtkAdjustments for the ui limit those to 100% too. Change-Id: I9efb765af549ac13bdbd9c50a313f0d902059522 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200713 Tested-by: Caolán McNamara <[email protected]> Reviewed-by: Caolán McNamara <[email protected]> (cherry picked from commit ac03040f68d91f6a185596108a8f055e74b99042) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201057 Tested-by: Jenkins Reviewed-by: Xisco Fauli <[email protected]> diff --git a/vcl/source/gdi/TypeSerializer.cxx b/vcl/source/gdi/TypeSerializer.cxx index 0edf74bba537..adab7c48f9fb 100644 --- a/vcl/source/gdi/TypeSerializer.cxx +++ b/vcl/source/gdi/TypeSerializer.cxx @@ -67,8 +67,23 @@ void TypeSerializer::readGradient(Gradient& rGradient) nAngle = 0; } rGradient.SetAngle(Degree10(nAngle)); + if (nBorder > 100) + { + SAL_WARN("vcl", "border out of range " << nBorder); + nBorder = 100; + } rGradient.SetBorder(nBorder); + if (nOffsetX > 100) + { + SAL_WARN("vcl", "offset x out of range " << nOffsetX); + nOffsetX = 100; + } rGradient.SetOfsX(nOffsetX); + if (nOffsetY > 100) + { + SAL_WARN("vcl", "offset y out of range " << nOffsetY); + nOffsetY = 100; + } rGradient.SetOfsY(nOffsetY); rGradient.SetStartIntensity(nIntensityStart); rGradient.SetEndIntensity(nIntensityEnd); commit b78c462de7733daffafbae0f3e5df21632ce8fbe Author: Xisco Fauli <[email protected]> AuthorDate: Thu Feb 26 16:40:16 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:59 2026 +0100 postgresql: upgrade to 15.17 Downloaded from https://ftp.postgresql.org/pub/source/v15.17/postgresql-15.17.tar.bz2 Change-Id: I78152063d79af71864576d341405d7bd076ccd9f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200453 Tested-by: Jenkins Reviewed-by: Christian Lohmaier <[email protected]> diff --git a/download.lst b/download.lst index fe9415ee4e87..1f8e47dbe1a4 100644 --- a/download.lst +++ b/download.lst @@ -674,8 +674,8 @@ POPPLER_DATA_TARBALL := poppler-data-0.4.12.tar.gz # three static lines # so that git cherry-pick # will not run into conflicts -POSTGRESQL_SHA256SUM := 695ee29a77be1f5010e10f3667696f29871587f7aa311eadc1f809bea287cf48 -POSTGRESQL_TARBALL := postgresql-15.16.tar.bz2 +POSTGRESQL_SHA256SUM := ae14f24c14727e0b2ded1c5553031666099bd1054db3ef44bfa6e2bd6d554a56 +POSTGRESQL_TARBALL := postgresql-15.17.tar.bz2 # three static lines # so that git cherry-pick # will not run into conflicts commit 5b90a8b952af2511b562ced5d7e68b28c07017ea Author: Christian Lohmaier <[email protected]> AuthorDate: Thu Mar 5 15:06:35 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:59 2026 +0100 tdf#169032 fix wrong/missing buildid hash in windows MSI packages while the ini files that are put into instdir are created by instsetoo_native/CustomTarget_setup.mk and work just fine in wsl-as-helper build environment, the files for installation sets are actually created by scp2 and the perl installer code. It fails to get the git hash/the command exits with error, so instead of doing a separate cd command with fancy redirections use git directly with the path argument. Change-Id: I9ced68c5ed9056e8fb140f7bcf1f07691c60115b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201049 Reviewed-by: Christian Lohmaier <[email protected]> Reviewed-by: Xisco Fauli <[email protected]> Tested-by: Jenkins (cherry picked from commit 14b2feffbc243e9b38e16ca35c6aaea3f9b28d1a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201061 diff --git a/solenv/bin/modules/installer/scriptitems.pm b/solenv/bin/modules/installer/scriptitems.pm index 35139fd785e5..555c44c2af2f 100644 --- a/solenv/bin/modules/installer/scriptitems.pm +++ b/solenv/bin/modules/installer/scriptitems.pm @@ -615,7 +615,7 @@ sub replace_setup_variables if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; } # using "680" instead of "src680" - my $buildidstring = `cd $ENV{'SRCDIR'} 2>&1 >/dev/null && git log -n 1 --pretty=format:"%H"`; + my $buildidstring = `git -C $ENV{'SRCDIR'} log -n 1 --pretty=format:"%H"`; if ($? || !$buildidstring) { $buildidstring = $localbuild . "(Build:" . $installer::globals::buildid . ")"; } commit 13dc6797111640f59220eea9a093d78ecb06fe66 Author: Caolán McNamara <[email protected]> AuthorDate: Sun Mar 1 19:48:00 2026 +0000 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:59 2026 +0100 ofz#481418344 Timeout Change-Id: I12d5cc145e3d2cf156d2b1d30b50d9d9d25a25e2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200730 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> (cherry picked from commit 5bd6ce333a1e21c68858120d22cac7e25d591f8b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201055 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/hwpfilter/source/hwpreader.cxx b/hwpfilter/source/hwpreader.cxx index 121183d4e7a2..568e07101c75 100644 --- a/hwpfilter/source/hwpreader.cxx +++ b/hwpfilter/source/hwpreader.cxx @@ -1485,6 +1485,11 @@ void HwpReader::makePageStyle() pmCount = 512; } + OUString sBackInfoEncoded; + // Do this once, so if we need it we don't end up with many duplicate strings of the background image + if (hwpinfo.back_info.isset && hwpinfo.back_info.type == 2 && hwpinfo.back_info.size > 0) + sBackInfoEncoded = base64_encode_string(reinterpret_cast<unsigned char*>(hwpinfo.back_info.data.data()), hwpinfo.back_info.size); + for( int i = 0 ; i < pmCount ; i++ ){ mxList->addAttribute(u"style:name"_ustr, sXML_CDATA, "pm" + OUString::number(i + 1)); startEl(u"style:page-master"_ustr); @@ -1679,7 +1684,7 @@ void HwpReader::makePageStyle() if( hwpinfo.back_info.type == 2 ){ startEl(u"office:binary-data"_ustr); mxList->clear(); - chars(base64_encode_string(reinterpret_cast<unsigned char*>(hwpinfo.back_info.data.data()), hwpinfo.back_info.size)); + chars(sBackInfoEncoded); endEl(u"office:binary-data"_ustr); } endEl(u"style:background-image"_ustr); commit e71fd07ea7d3691defbb8564795a711e9cedeee5 Author: Mike Kaganski <[email protected]> AuthorDate: Thu Mar 5 09:29:41 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:58 2026 +0100 tdf#170205: drop NoYieldLock mode Added in commit 4baec725e0dc0713f0d47003e9b10bc3b62f56ff (WIN run main thread redirects ignoring SolarMutex, 2017-09-26), it tried to handle SendMessage calls without releasing SolarMutex in the calling code. The idea seemed to be, that the calling thread keeps holding SolarMutex while waiting for the main thread, and main thread has this mode that turns all calls to acquire/release/test solar mutex to noop (which was safe, since the thread holding the mutex is known to be blocked). Unfortunately, that doesn't work. The many hangs discovered since then (e.g., commit 1e2e51607a163021ef1fb1fb0d217266bd448173 - Try to use CoWaitForMultipleHandles magic to handle COM message loop, 2025-01-10) required to unlock solar mutex when calling SendMessage (implemented in commit 23afeaedf4d4a03943338fc39ae41f5c423e5997 - tdf#168431: Release solar mutex when sending window message to main thread, 2025-09-09). It made it possibe, that SolarMutex::doRelease called from non-main thread got false from IsCurrentThread, because the NoYieldLock mode was active, and SalYieldMutex::IsCurrentThread only checked that current thread is main; that caused abort(). This change removes this special mode. The intention is, that every call to SendMessage must release solar mutex, and allow main thread to lock it. Hope this is a reasonable approach. Change-Id: I838be4d366b24727cd93610d9cacfbe14992923e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201007 Reviewed-by: Noel Grandin <[email protected]> Reviewed-by: Mike Kaganski <[email protected]> Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201016 diff --git a/vcl/inc/win/salinst.h b/vcl/inc/win/salinst.h index 398efdc1888d..6fc7833fcef8 100644 --- a/vcl/inc/win/salinst.h +++ b/vcl/inc/win/salinst.h @@ -37,7 +37,6 @@ public: HWND mhComWnd; osl::Condition maWaitingYieldCond; - unsigned m_nNoYieldLock; public: WinSalInstance(); diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx index c7e4f1106ef8..93d57c4c8cef 100644 --- a/vcl/win/app/salinst.cxx +++ b/vcl/win/app/salinst.cxx @@ -84,9 +84,6 @@ protected: public: explicit SalYieldMutex(); - - virtual bool IsCurrentThread() const override; - virtual bool tryToAcquire() override; }; SalYieldMutex::SalYieldMutex() @@ -114,8 +111,6 @@ void SalYieldMutex::doAcquire( sal_uInt32 nLockCount ) WinSalInstance* pInst = GetSalData()->mpInstance; if ( pInst && pInst->IsMainThread() ) { - if ( pInst->m_nNoYieldLock ) - return; // tdf#96887 If this is the main thread, then we must wait for two things: // - the yield mutex being unlocked // - SendMessage() being triggered @@ -151,10 +146,6 @@ void SalYieldMutex::doAcquire( sal_uInt32 nLockCount ) sal_uInt32 SalYieldMutex::doRelease( const bool bUnlockAll ) { - WinSalInstance* pInst = GetSalData()->mpInstance; - if ( pInst && pInst->m_nNoYieldLock && pInst->IsMainThread() ) - return 1; - sal_uInt32 nCount = comphelper::SolarMutex::doRelease( bUnlockAll ); // wake up ImplSalYieldMutexAcquireWithWait() after release if ( 0 == m_nCount ) @@ -162,20 +153,6 @@ sal_uInt32 SalYieldMutex::doRelease( const bool bUnlockAll ) return nCount; } -bool SalYieldMutex::tryToAcquire() -{ - WinSalInstance* pInst = GetSalData()->mpInstance; - if ( pInst ) - { - if ( pInst->m_nNoYieldLock && pInst->IsMainThread() ) - return true; - else - return comphelper::SolarMutex::tryToAcquire(); - } - else - return false; -} - void ImplSalYieldMutexAcquireWithWait( sal_uInt32 nCount ) { WinSalInstance* pInst = GetSalData()->mpInstance; @@ -199,14 +176,6 @@ void ImplSalYieldMutexRelease() } } -bool SalYieldMutex::IsCurrentThread() const -{ - if ( !GetSalData()->mpInstance->m_nNoYieldLock ) - return SolarMutex::IsCurrentThread(); - else - return GetSalData()->mpInstance->IsMainThread(); -} - void SalData::initKeyCodeMap() { auto initKey = [this](wchar_t ch, sal_uInt16 key) @@ -399,7 +368,6 @@ WinSalInstance::WinSalInstance() : SalInstance(std::make_unique<SalYieldMutex>()) , mhInst( nullptr ) , mhComWnd( nullptr ) - , m_nNoYieldLock( 0 ) { ImplSVData* pSVData = ImplGetSVData(); pSVData->maAppData.mxToolkitName = OUString("win"); @@ -440,12 +408,6 @@ bool ImplSalYield(const bool bWait, const bool bHandleAllCurrentEvents) // used to abort further message processing on tick count wraps static sal_uInt32 nLastTicks = 0; - // we should never yield in m_nNoYieldLock mode! - const bool bNoYieldLock = (GetSalData()->mpInstance->m_nNoYieldLock > 0); - assert(!bNoYieldLock); - if (bNoYieldLock) - return false; - MSG aMsg; bool bWasMsg = false, bWasTimeoutMsg = false; WinSalTimer* pTimer = static_cast<WinSalTimer*>(ImplGetSVData()->maSchedCtx.mpSalTimer); @@ -542,26 +504,6 @@ bool WinSalInstance::DoYield(bool bWait, bool bHandleAllCurrentEvents) return bDidWork; } -namespace -{ -struct NoYieldLockGuard -{ - NoYieldLockGuard() - : counter(InSendMessage() ? GetSalData()->mpInstance->m_nNoYieldLock : dummy()) - { - ++counter; - } - ~NoYieldLockGuard() { --counter; } - static decltype(WinSalInstance::m_nNoYieldLock)& dummy() - { - DBG_TESTSOLARMUTEX(); // called when !InSendMessage() - static decltype(WinSalInstance::m_nNoYieldLock) n = 0; - return n; - } - decltype(WinSalInstance::m_nNoYieldLock)& counter; -}; -} - LRESULT CALLBACK SalComWndProc( HWND, UINT nMsg, WPARAM wParam, LPARAM lParam, bool& rDef ) { LRESULT nRet = 0; @@ -602,33 +544,21 @@ LRESULT CALLBACK SalComWndProc( HWND, UINT nMsg, WPARAM wParam, LPARAM lParam, b pTimer->ImplStop(); break; - case (SAL_MSG_CREATEFRAME): - { - NoYieldLockGuard g; - nRet = reinterpret_cast<LRESULT>( - ImplSalCreateFrame(GetSalData()->mpInstance, reinterpret_cast<HWND>(lParam), - static_cast<SalFrameStyleFlags>(wParam))); - } + case SAL_MSG_CREATEFRAME: + nRet = reinterpret_cast<LRESULT>( + ImplSalCreateFrame(GetSalData()->mpInstance, reinterpret_cast<HWND>(lParam), + static_cast<SalFrameStyleFlags>(wParam))); break; - case (SAL_MSG_RECREATEHWND): - { - NoYieldLockGuard g; - nRet = reinterpret_cast<LRESULT>(ImplSalReCreateHWND( - reinterpret_cast<HWND>(wParam), reinterpret_cast<HWND>(lParam), false)); - } + case SAL_MSG_RECREATEHWND: + nRet = reinterpret_cast<LRESULT>(ImplSalReCreateHWND( + reinterpret_cast<HWND>(wParam), reinterpret_cast<HWND>(lParam), false)); break; - case (SAL_MSG_RECREATECHILDHWND): - { - NoYieldLockGuard g; - nRet = reinterpret_cast<LRESULT>(ImplSalReCreateHWND( - reinterpret_cast<HWND>(wParam), reinterpret_cast<HWND>(lParam), true)); - } + case SAL_MSG_RECREATECHILDHWND: + nRet = reinterpret_cast<LRESULT>(ImplSalReCreateHWND( + reinterpret_cast<HWND>(wParam), reinterpret_cast<HWND>(lParam), true)); break; - case (SAL_MSG_DESTROYFRAME): - { - NoYieldLockGuard g; - delete reinterpret_cast<SalFrame*>(lParam); - } + case SAL_MSG_DESTROYFRAME: + delete reinterpret_cast<SalFrame*>(lParam); break; case SAL_MSG_DESTROYHWND: @@ -643,31 +573,19 @@ LRESULT CALLBACK SalComWndProc( HWND, UINT nMsg, WPARAM wParam, LPARAM lParam, b } break; - case (SAL_MSG_CREATEOBJECT): - { - NoYieldLockGuard g; - nRet = reinterpret_cast<LRESULT>(ImplSalCreateObject( - GetSalData()->mpInstance, reinterpret_cast<WinSalFrame*>(lParam))); - } + case SAL_MSG_CREATEOBJECT: + nRet = reinterpret_cast<LRESULT>(ImplSalCreateObject( + GetSalData()->mpInstance, reinterpret_cast<WinSalFrame*>(lParam))); break; - case (SAL_MSG_DESTROYOBJECT): - { - NoYieldLockGuard g; - delete reinterpret_cast<SalObject*>(lParam); - } + case SAL_MSG_DESTROYOBJECT: + delete reinterpret_cast<SalObject*>(lParam); break; - case (SAL_MSG_GETCACHEDDC): - { - NoYieldLockGuard g; - nRet = reinterpret_cast<LRESULT>( - GetDCEx(reinterpret_cast<HWND>(wParam), nullptr, 0x00000002L)); - } + case SAL_MSG_GETCACHEDDC: + nRet = reinterpret_cast<LRESULT>( + GetDCEx(reinterpret_cast<HWND>(wParam), nullptr, 0x00000002L)); break; - case (SAL_MSG_RELEASEDC): - { - NoYieldLockGuard g; - ReleaseDC(reinterpret_cast<HWND>(wParam), reinterpret_cast<HDC>(lParam)); - } + case SAL_MSG_RELEASEDC: + ReleaseDC(reinterpret_cast<HWND>(wParam), reinterpret_cast<HDC>(lParam)); break; case SAL_MSG_TIMER_CALLBACK: @@ -766,7 +684,7 @@ bool WinSalInstance::AnyInput( VclInputFlags nType ) LRESULT WinSalInstance::SendWndMessage_impl(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) const { std::optional<SolarMutexReleaser> oReleaser; - if (!IsMainThread()) + if (GetCurrentThreadId() != GetWindowThreadProcessId(hWnd, nullptr)) oReleaser.emplace(); return SendMessageW(hWnd, Msg, wParam, lParam); } commit eb68482f251a018dc4d54959801d5177a7082f72 Author: Michael Weghorn <[email protected]> AuthorDate: Mon Feb 23 18:27:53 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:58 2026 +0100 tdf#170805 extension mgr: Use more specific weld::Dialog Return and use the more specific weld::Dialog subclass in TheExtensionManager::getDialog instead of just weld::Window. Change-Id: I931864f8117af87386761f0838b4f3970d9d8c62 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200150 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]> (cherry picked from commit f379e1c62b6303189d1223d2b6233cf3bf1072d0) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200270 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/desktop/source/deployment/gui/dp_gui_service.cxx b/desktop/source/deployment/gui/dp_gui_service.cxx index 2045e4e52c4d..1a9c1f90b7ca 100644 --- a/desktop/source/deployment/gui/dp_gui_service.cxx +++ b/desktop/source/deployment/gui/dp_gui_service.cxx @@ -182,7 +182,7 @@ void ServiceImpl::setDialogTitle( OUString const & title ) if ( dp_gui::TheExtensionManager::s_ExtMgr.is() ) { const SolarMutexGuard guard; - if (weld::Window* pDialog = dp_gui::TheExtensionManager::s_ExtMgr->getDialog()) + if (weld::Dialog* pDialog = dp_gui::TheExtensionManager::s_ExtMgr->getDialog()) pDialog->set_title(title); } } diff --git a/desktop/source/deployment/gui/dp_gui_theextmgr.cxx b/desktop/source/deployment/gui/dp_gui_theextmgr.cxx index 04d1e08077db..c2f0b5c354ad 100644 --- a/desktop/source/deployment/gui/dp_gui_theextmgr.cxx +++ b/desktop/source/deployment/gui/dp_gui_theextmgr.cxx @@ -148,7 +148,7 @@ void TheExtensionManager::SetText( const OUString &rTitle ) { const SolarMutexGuard guard; - if (weld::Window* pDialog = getDialog()) + if (weld::Dialog* pDialog = getDialog()) pDialog->set_title( rTitle ); } @@ -157,7 +157,7 @@ void TheExtensionManager::ToTop() { const SolarMutexGuard guard; - if (weld::Window* pDialog = getDialog()) + if (weld::Dialog* pDialog = getDialog()) pDialog->present(); } @@ -196,7 +196,7 @@ sal_Int16 TheExtensionManager::execute() bool TheExtensionManager::isVisible() { - weld::Window* pDialog = getDialog(); + weld::Dialog* pDialog = getDialog(); return pDialog && pDialog->get_visible(); } diff --git a/desktop/source/deployment/gui/dp_gui_theextmgr.hxx b/desktop/source/deployment/gui/dp_gui_theextmgr.hxx index dbfe0b76ff3f..0a2cb5813f49 100644 --- a/desktop/source/deployment/gui/dp_gui_theextmgr.hxx +++ b/desktop/source/deployment/gui/dp_gui_theextmgr.hxx @@ -68,7 +68,7 @@ public: bool isModified() const { return m_bModified; } void clearModified() { m_bModified = false; } - weld::Window* getDialog() + weld::Dialog* getDialog() { if (m_xExtMgrDialog) return m_xExtMgrDialog->getDialog(); commit 629d8a21cc99b5e974eefe2e23f322ccb11f2552 Author: Xisco Fauli <[email protected]> AuthorDate: Mon Mar 2 10:20:07 2026 +0100 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:58 2026 +0100 freetype: upgrade to 2.14.2 Downloaded from https://download.savannah.gnu.org/releases/freetype/freetype-2.14.2.tar.xz Change-Id: I5f1896b71497be9b730c0725e23c48d3d1c893dd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200776 Tested-by: Jenkins Reviewed-by: Xisco Fauli <[email protected]> (cherry picked from commit c9da599daf8ffdb198d364925649ed7729df7c89) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200817 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/download.lst b/download.lst index 053bc568a47b..fe9415ee4e87 100644 --- a/download.lst +++ b/download.lst @@ -370,8 +370,8 @@ FREEHAND_TARBALL := libfreehand-0.1.2.tar.xz # three static lines # so that git cherry-pick # will not run into conflicts -FREETYPE_SHA256SUM := 32427e8c471ac095853212a37aef816c60b42052d4d9e48230bab3bdf2936ccc -FREETYPE_TARBALL := freetype-2.14.1.tar.xz +FREETYPE_SHA256SUM := 4b62dcab4c920a1a860369933221814362e699e26f55792516d671e6ff55b5e1 +FREETYPE_TARBALL := freetype-2.14.2.tar.xz # three static lines # so that git cherry-pick # will not run into conflicts diff --git a/external/freetype/ubsan.patch b/external/freetype/ubsan.patch index f7099f110eec..10c527e9db85 100644 --- a/external/freetype/ubsan.patch +++ b/external/freetype/ubsan.patch @@ -1,11 +1,11 @@ --- src/autofit/aflatin.c +++ src/autofit/aflatin.c -@@ -3705,11 +3705,13 @@ +@@ -3711,11 +3711,13 @@ /* We also check that the y minimum of the 'other' contour */ /* is below the high contour to avoid potential false hits */ /* with contours enclosed in the high one. */ + if (max_y != FT_LONG_MIN) { - distance = high_min_y - max_y; + distance = SUB_LONG( high_min_y, max_y ); if ( distance < 64 && distance < min_distance && min_y < high_min_y ) commit 2e8e6dae8342ae25fdb9639b54ecb3f3218ee1d5 Author: Caolán McNamara <[email protected]> AuthorDate: Tue Mar 3 11:58:45 2026 +0000 Commit: Andras Timar <[email protected]> CommitDate: Mon Mar 9 15:50:58 2026 +0100 tdf#170645 During a save the comment can lose focus During the save the ui is set disabled/insensitive, and the gtk widget in the comment will lose focus, and not automatically regain it when enabled/sensitive. So manually restore it when enabled and it should still have focus. Change-Id: Icf08d6695cb1d6883636747bb3d70e18f64fb75c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200884 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> (cherry picked from commit 56f2abbf3f107d849305df507818f00e6f6086df) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200926 Reviewed-by: Adolfo Jayme Barrientos <[email protected]> diff --git a/sw/inc/AnnotationWin.hxx b/sw/inc/AnnotationWin.hxx index 622cb88f7396..ad6c03e10d75 100644 --- a/sw/inc/AnnotationWin.hxx +++ b/sw/inc/AnnotationWin.hxx @@ -212,6 +212,7 @@ class SAL_DLLPUBLIC_RTTI SwAnnotationWin final : public InterimItemWindow virtual void LoseFocus() override; virtual void GetFocus() override; + virtual void StateChanged(StateChangedType nStateChange) override; virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override; void SetSizePixel( const Size& rNewSize ) override; diff --git a/sw/source/uibase/docvw/AnnotationWin2.cxx b/sw/source/uibase/docvw/AnnotationWin2.cxx index f665c6e9f22a..d10f89b4c05c 100644 --- a/sw/source/uibase/docvw/AnnotationWin2.cxx +++ b/sw/source/uibase/docvw/AnnotationWin2.cxx @@ -970,6 +970,19 @@ void SwAnnotationWin::Paint(vcl::RenderContext& rRenderContext, const tools::Rec } } +// tdf#170645 During a save the UI is disabled/insensitive so in GTK the +// widget with focus will lose it, so restore that when enabled/sensitive +void SwAnnotationWin::StateChanged(StateChangedType nStateChange) +{ + InterimItemWindow::StateChanged(nStateChange); + if (nStateChange == StateChangedType::Enable && IsEnabled() + && mrMgr.GetActiveSidebarWin() == this + && mxSidebarTextControl && !mxSidebarTextControl->HasFocus()) + { + mxSidebarTextControl->GrabFocus(); + } +} + void SwAnnotationWin::ShowNote() { SetPosAndSize();
