Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package FreeFileSync for openSUSE:Factory checked in at 2026-10-05 15:21:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/FreeFileSync (Old) and /work/SRC/openSUSE:Factory/.FreeFileSync.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "FreeFileSync" Mon Oct 5 15:21:40 2026 rev:34 rq:1382490 version:14.12 Changes: -------- --- /work/SRC/openSUSE:Factory/FreeFileSync/FreeFileSync.changes 2026-09-01 15:48:54.720918951 +0200 +++ /work/SRC/openSUSE:Factory/.FreeFileSync.new.3698736/FreeFileSync.changes 2026-10-05 15:21:42.641398172 +0200 @@ -1,0 +2,20 @@ +Mon Oct 5 09:55:06 UTC 2026 - Paolo Stivanin <[email protected]> + +- Add FreeFileSync-wxstring-char-type.patch + * Fix build with wxWidgets 3.2: wxString::c_str() converts to both + const char* and const wchar_t*, making GetCharTypeImpl ambiguous +- Add FreeFileSync-libssh2-no-store-overflow.patch + * Fix build with libssh2 <= 1.11.1 (no LIBSSH2_ERROR_STORE_OVERFLOW) + +------------------------------------------------------------------- +Mon Oct 5 09:17:01 UTC 2026 - Paolo Stivanin <[email protected]> + +- Update to 14.12: + * Further reduced size of database files by 16% + * Improved toggle button layout calculations + * Fixed grid view filters not showing (Linux) + * Fixed text descriptions not wrapping + * Work around ERROR_UNTRUSTED_MOUNT_POINT + * Fixed bitmap buttons being shrinked (macOS) + +------------------------------------------------------------------- Old: ---- FreeFileSync_14.11_Source.zip New: ---- FreeFileSync-libssh2-no-store-overflow.patch FreeFileSync-wxstring-char-type.patch FreeFileSync_14.12_Source.zip ----------(New B)---------- New: const char* and const wchar_t*, making GetCharTypeImpl ambiguous - Add FreeFileSync-libssh2-no-store-overflow.patch * Fix build with libssh2 <= 1.11.1 (no LIBSSH2_ERROR_STORE_OVERFLOW) New: - Add FreeFileSync-wxstring-char-type.patch * Fix build with wxWidgets 3.2: wxString::c_str() converts to both ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ FreeFileSync.spec ++++++ --- /var/tmp/diff_new_pack.MjLIS3/_old 2026-10-05 15:21:43.811446909 +0200 +++ /var/tmp/diff_new_pack.MjLIS3/_new 2026-10-05 15:21:43.813446993 +0200 @@ -21,7 +21,7 @@ %endif Name: FreeFileSync -Version: 14.11 +Version: 14.12 Release: 0 Summary: Backup software to synchronize files and folders License: GPL-3.0-or-later @@ -41,6 +41,10 @@ Patch4: glib2-2.78-free_size-Fix-build-when-g_free-macro-is-defined.patch # https://salsa.debian.org/bastif/freefilesync/-/blob/debian/latest/debian/patches/03-deps/wxwidgets-no-wx3.3.1-WxLogCollector.patch Patch5: wxwidgets-no-wx3.3.1-WxLogCollector.patch +# PATCH-FIX-OPENSUSE FreeFileSync-wxstring-char-type.patch -- wxString::c_str() (wxCStrData) converts to both const char* and const wchar_t* in wxWidgets 3.2: prefer wchar_t +Patch6: FreeFileSync-wxstring-char-type.patch +# PATCH-FIX-OPENSUSE FreeFileSync-libssh2-no-store-overflow.patch -- LIBSSH2_ERROR_STORE_OVERFLOW does not exist in libssh2 <= 1.11.1 +Patch7: FreeFileSync-libssh2-no-store-overflow.patch BuildRequires: boost-devel >= 1.54 BuildRequires: gcc%{?force_gcc_version}-c++ >= 15 BuildRequires: libcurl-devel ++++++ FreeFileSync-disable-in-app-updates.patch ++++++ --- /var/tmp/diff_new_pack.MjLIS3/_old 2026-10-05 15:21:43.849448492 +0200 +++ /var/tmp/diff_new_pack.MjLIS3/_new 2026-10-05 15:21:43.851448576 +0200 @@ -19,14 +19,14 @@ =================================================================== --- FreeFileSync-14.9.orig/FreeFileSync/Source/ui/main_dlg.cpp +++ FreeFileSync-14.9/FreeFileSync/Source/ui/main_dlg.cpp -@@ -1089,7 +1089,7 @@ imgFileManagerSmall_([] +@@ -1086,7 +1086,7 @@ imgFileManagerSmall_([] updateGui(); //register regular check for update on next idle event - Bind(wxEVT_IDLE, &MainDialog::onStartupUpdateCheck, this); + //Bind(wxEVT_IDLE, &MainDialog::onStartupUpdateCheck, this); - //asynchronous call to wxWindow::Dimensions(): fix superfluous frame on right and bottom when FFS is started in fullscreen mode + //asynchronous call to wxWindow::Layout(): fix superfluous frame on right and bottom when FFS is started in fullscreen mode Bind(wxEVT_IDLE, &MainDialog::onLayoutWindowAsync, this); Index: FreeFileSync-14.9/FreeFileSync/Source/ui/version_check.cpp =================================================================== ++++++ FreeFileSync-gui.patch ++++++ --- /var/tmp/diff_new_pack.MjLIS3/_old 2026-10-05 15:21:43.870449367 +0200 +++ /var/tmp/diff_new_pack.MjLIS3/_new 2026-10-05 15:21:43.873449492 +0200 @@ -1,33 +1,7 @@ -Index: FreeFileSync-14.9/wx+/dc.h -=================================================================== ---- FreeFileSync-14.9.orig/wx+/dc.h -+++ FreeFileSync-14.9/wx+/dc.h -@@ -333,7 +333,6 @@ public: - { - assert(wnd.IsDoubleBuffered()); - dc_.emplace<wxPaintDC>(&wnd); -- static_cast<wxDC&>(*this).DisableAutomaticBoundingBoxUpdates(); //MOOOAAAR perf!? - } - - operator wxDC& () -Index: FreeFileSync-14.9/wx+/grid.cpp -=================================================================== ---- FreeFileSync-14.9.orig/wx+/grid.cpp -+++ FreeFileSync-14.9/wx+/grid.cpp -@@ -172,7 +172,7 @@ - - wxRect GridData::drawCellBorder(wxDC& dc, const wxRect& rect) //returns remaining rectangle - { -- drawRectangleBorder(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_GRIDLINES), dipToWxsize(1), wxRIGHT | wxBOTTOM); -+ drawRectangleBorder(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT), dipToWxsize(1), wxRIGHT | wxBOTTOM); - - return {rect.x, rect.y, rect.width - dipToWxsize(1), rect.height - dipToWxsize(1)}; - } -Index: FreeFileSync-14.9/FreeFileSync/Source/ui/gui_status_handler.cpp -=================================================================== ---- FreeFileSync-14.9.orig/FreeFileSync/Source/ui/gui_status_handler.cpp -+++ FreeFileSync-14.9/FreeFileSync/Source/ui/gui_status_handler.cpp -@@ -70,27 +70,33 @@ void StatusHandlerTemporaryPanel::showSt +diff -ruN a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp +--- a/FreeFileSync/Source/ui/gui_status_handler.cpp 2026-10-05 11:26:30.986938552 +0200 ++++ b/FreeFileSync/Source/ui/gui_status_handler.cpp 2026-10-05 11:26:31.021227748 +0200 +@@ -70,27 +70,33 @@ //case wxAUI_DOCK_CENTRE: } @@ -64,11 +38,48 @@ //------------------------------------------------------------------ statusPanel.Show(); -Index: FreeFileSync-14.9/wx+/darkmode.cpp -=================================================================== ---- FreeFileSync-14.9.orig/wx+/darkmode.cpp -+++ FreeFileSync-14.9/wx+/darkmode.cpp -@@ -53,7 +53,7 @@ void zen::colorThemeInit(wxApp& app, Col +diff -ruN a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp +--- a/FreeFileSync/Source/ui/main_dlg.cpp 2026-10-05 11:26:30.987030691 +0200 ++++ b/FreeFileSync/Source/ui/main_dlg.cpp 2026-10-05 11:26:31.022104585 +0200 +@@ -1273,11 +1273,11 @@ + + //-------------------------------------------------------------------------------- + m_checkBoxMatchCase->SetValue(globalCfg_.mainDlg.textSearchRespectCase); +- ++ wxAuiPaneInfoArray& paneArray = auiMgr_.GetAllPanes(); + //work around wxAuiManager::LoadPerspective overwriting pane captions with old values (might be different language!) + std::vector<std::pair<wxAuiPaneInfo*, wxString>> paneCaptions; +- for (wxAuiPaneInfo& paneInfo : auiMgr_.GetAllPanes()) +- paneCaptions.emplace_back(&paneInfo, paneInfo.caption); ++ for (size_t i = 0; i < paneArray.size(); ++i) ++ paneCaptions.emplace_back(&paneArray[i], paneArray[i].caption); + + //compare progress dialog minimum sizes are layout-dependent + can't be changed by user => don't load stale values from config + std::vector<std::tuple<wxAuiPaneInfo*, wxSize /*min size*/, wxSize /*best size*/>> paneConstraints; +@@ -3141,8 +3141,8 @@ + //---------------------------------------------------------------------------------------- + + bool addedSeparator = false; +- +- for (wxAuiPaneInfo& paneInfo : auiMgr_.GetAllPanes()) ++ const wxAuiPaneInfoArray& paneArray = auiMgr_.GetAllPanes(); ++ for (size_t i = 0; i < paneArray.size(); ++i){ wxAuiPaneInfo& paneInfo = paneArray[i]; + if (!paneInfo.IsShown() && + paneInfo.window != compareStatus_->getAsWindow() && + paneInfo.window != m_panelLog && +@@ -3160,7 +3160,7 @@ + this->auiMgr_.Update(); + }); + } +- ++ } + menu.popup(*this); + } + +diff -ruN a/wx+/darkmode.cpp b/wx+/darkmode.cpp +--- a/wx+/darkmode.cpp 2026-10-05 11:26:30.992167023 +0200 ++++ b/wx+/darkmode.cpp 2026-10-05 11:26:31.021355402 +0200 +@@ -53,7 +53,7 @@ { assert(!refGlobalColorHook()); @@ -77,7 +88,7 @@ ZEN_ON_SCOPE_EXIT(if (!refGlobalColorHook()) refGlobalColorHook() = std::make_unique<SysColorsHook>()); //*after* SetAppearance() and despite errors //caveat: on macOS there are more themes than light/dark: https://developer.apple.com/documentation/appkit/nsappearance/name-swift.struct -@@ -86,10 +86,6 @@ void zen::changeColorTheme(ColorTheme co +@@ -86,10 +86,6 @@ try { ZEN_ON_SCOPE_SUCCESS(refGlobalColorHook() = std::make_unique<SysColorsHook>()); //*after* SetAppearance() @@ -88,17 +99,16 @@ } catch (const SysError& e) { throw FileError(_("Failed to update the color theme."), e.toString()); } } -Index: FreeFileSync-14.9/wx+/darkmode.h -=================================================================== ---- FreeFileSync-14.9.orig/wx+/darkmode.h -+++ FreeFileSync-14.9/wx+/darkmode.h -@@ -9,14 +9,16 @@ +diff -ruN a/wx+/darkmode.h b/wx+/darkmode.h +--- a/wx+/darkmode.h 2026-10-05 11:26:30.991614771 +0200 ++++ b/wx+/darkmode.h 2026-10-05 11:26:31.044585835 +0200 +@@ -7,13 +7,16 @@ #include <zen/file_error.h> #include <wx/app.h> +#include <wx/settings.h> - ++ +enum class Appearance{System,Light,Dark}; namespace zen { @@ -110,10 +120,10 @@ void colorThemeInit(wxApp& app, ColorTheme colTheme); //throw FileError void colorThemeCleanup(); -@@ -25,4 +27,28 @@ bool equalAppearance(ColorTheme colTheme +@@ -21,3 +24,27 @@ + bool equalAppearance(ColorTheme colTheme1, ColorTheme colTheme2); void changeColorTheme(ColorTheme colTheme); //throw FileError } - +struct wxColorHook +{ + virtual ~wxColorHook() {} @@ -138,44 +148,27 @@ + } +}; + - #endif //DARKMODE_H_754298057018 -Index: FreeFileSync-14.9/FreeFileSync/Source/ui/main_dlg.cpp -=================================================================== ---- FreeFileSync-14.9.orig/FreeFileSync/Source/ui/main_dlg.cpp -+++ FreeFileSync-14.9/FreeFileSync/Source/ui/main_dlg.cpp -@@ -1276,11 +1276,11 @@ void MainDialog::setGlobalCfgOnInit(cons +diff -ruN a/wx+/dc.h b/wx+/dc.h +--- a/wx+/dc.h 2026-10-05 11:26:30.991646261 +0200 ++++ b/wx+/dc.h 2026-10-05 11:26:31.020577178 +0200 +@@ -341,7 +341,6 @@ + { + assert(wnd.IsDoubleBuffered()); + dc_.emplace<wxPaintDC>(&wnd); +- static_cast<wxDC&>(*this).DisableAutomaticBoundingBoxUpdates(); //MOOOAAAR perf!? + } - //-------------------------------------------------------------------------------- - m_checkBoxMatchCase->SetValue(globalCfg_.mainDlg.textSearchRespectCase); -- -+ wxAuiPaneInfoArray& paneArray = auiMgr_.GetAllPanes(); - //work around wxAuiManager::LoadPerspective overwriting pane captions with old values (might be different language!) - std::vector<std::pair<wxAuiPaneInfo*, wxString>> paneCaptions; -- for (wxAuiPaneInfo& paneInfo : auiMgr_.GetAllPanes()) -- paneCaptions.emplace_back(&paneInfo, paneInfo.caption); -+ for (size_t i = 0; i < paneArray.size(); ++i) -+ paneCaptions.emplace_back(&paneArray[i], paneArray[i].caption); + operator wxDC& () +diff -ruN a/wx+/grid.cpp b/wx+/grid.cpp +--- a/wx+/grid.cpp 2026-10-05 11:26:30.992397141 +0200 ++++ b/wx+/grid.cpp 2026-10-05 11:26:31.020907086 +0200 +@@ -172,7 +172,7 @@ - //compare progress dialog minimum sizes are layout-dependent + can't be changed by user => don't load stale values from config - std::vector<std::tuple<wxAuiPaneInfo*, wxSize /*min size*/, wxSize /*best size*/>> paneConstraints; -@@ -3144,8 +3144,8 @@ void MainDialog::onSetLayoutContext(wxMo - //---------------------------------------------------------------------------------------- + wxRect GridData::drawCellBorder(wxDC& dc, const wxRect& rect) //returns remaining rectangle + { +- drawRectangleBorder(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_GRIDLINES), dipToWxsize(1), wxRIGHT | wxBOTTOM); ++ drawRectangleBorder(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT), dipToWxsize(1), wxRIGHT | wxBOTTOM); - bool addedSeparator = false; -- -- for (wxAuiPaneInfo& paneInfo : auiMgr_.GetAllPanes()) -+ const wxAuiPaneInfoArray& paneArray = auiMgr_.GetAllPanes(); -+ for (size_t i = 0; i < paneArray.size(); ++i){ wxAuiPaneInfo& paneInfo = paneArray[i]; - if (!paneInfo.IsShown() && - paneInfo.window != compareStatus_->getAsWindow() && - paneInfo.window != m_panelLog && -@@ -3163,7 +3163,7 @@ void MainDialog::onSetLayoutContext(wxMo - this->auiMgr_.Update(); - }); - } -- -+ } - menu.popup(*this); + return {rect.x, rect.y, rect.width - dipToWxsize(1), rect.height - dipToWxsize(1)}; } - ++++++ FreeFileSync-libssh2-no-store-overflow.patch ++++++ diff -ruN a/libssh2/libssh2_wrap.h b/libssh2/libssh2_wrap.h --- a/libssh2/libssh2_wrap.h +++ b/libssh2/libssh2_wrap.h @@ -195,7 +195,9 @@ ZEN_CASE_RETURN_STRING(LIBSSH2_ERROR_MAC_FAILURE); ZEN_CASE_RETURN_STRING(LIBSSH2_ERROR_HASH_INIT); ZEN_CASE_RETURN_STRING(LIBSSH2_ERROR_HASH_CALC); +#ifdef LIBSSH2_ERROR_STORE_OVERFLOW //not available in libssh2 <= 1.11.1 ZEN_CASE_RETURN_STRING(LIBSSH2_ERROR_STORE_OVERFLOW); +#endif default: return replaceCpy<std::wstring>(L"SSH status %x", L"%x", numberTo<std::wstring>(sc)); ++++++ FreeFileSync-remove_ifdef_exceptions.patch ++++++ --- /var/tmp/diff_new_pack.MjLIS3/_old 2026-10-05 15:21:43.898450534 +0200 +++ /var/tmp/diff_new_pack.MjLIS3/_new 2026-10-05 15:21:43.902450700 +0200 @@ -1,23 +1,22 @@ -Index: FreeFileSync-14.8/FreeFileSync/Source/application.cpp +Index: FreeFileSync-14.12/FreeFileSync/Source/application.cpp =================================================================== ---- FreeFileSync-14.8.orig/FreeFileSync/Source/application.cpp -+++ FreeFileSync-14.8/FreeFileSync/Source/application.cpp -@@ -222,10 +222,6 @@ wxLayoutDirection Application::GetLayout +--- FreeFileSync-14.12.orig/FreeFileSync/Source/application.cpp ++++ FreeFileSync-14.12/FreeFileSync/Source/application.cpp +@@ -232,9 +232,6 @@ wxLayoutDirection Application::GetLayout int Application::OnRun() { -#if wxUSE_EXCEPTIONS -#error why is wxWidgets uncaught exception handling enabled!? -#endif -- - //exception => Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console + //exception? => Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console + [[maybe_unused]] const int rc = wxApp::OnRun(); - return static_cast<int>(exitCode_); -Index: FreeFileSync-14.8/FreeFileSync/Source/RealTimeSync/application.cpp +Index: FreeFileSync-14.12/FreeFileSync/Source/RealTimeSync/application.cpp =================================================================== ---- FreeFileSync-14.8.orig/FreeFileSync/Source/RealTimeSync/application.cpp -+++ FreeFileSync-14.8/FreeFileSync/Source/RealTimeSync/application.cpp -@@ -203,10 +203,6 @@ wxLayoutDirection Application::GetLayout +--- FreeFileSync-14.12.orig/FreeFileSync/Source/RealTimeSync/application.cpp ++++ FreeFileSync-14.12/FreeFileSync/Source/RealTimeSync/application.cpp +@@ -215,10 +215,6 @@ wxLayoutDirection Application::GetLayout int Application::OnRun() { ++++++ FreeFileSync-wxstring-char-type.patch ++++++ diff -ruN a/zen/string_traits.h b/zen/string_traits.h --- a/zen/string_traits.h +++ b/zen/string_traits.h @@ -46,18 +46,27 @@ class GetCharTypeImpl; +template <class S, class Char> //test if result of S::c_str() can convert to const Char* +class HasConversion +{ + using Yes = char[1]; + using No = char[2]; + + static Yes& hasConversion(const Char*); + static No& hasConversion(...); + +public: + static constexpr bool value = sizeof(hasConversion(std::declval<S>().c_str())) == sizeof(Yes); +}; + + template <class S> class GetCharTypeImpl<S, StringType::class_> { - static char conversionType(const char*); - static wchar_t conversionType(const wchar_t*); - //static char8_t conversionType(const char8_t*); - //static char16_t conversionType(const char16_t*); - //static char32_t conversionType(const char32_t*); - static void conversionType(...); - public: - using Type = decltype(conversionType(std::declval<S>().c_str())); + //wchar_t is tested first: wxString::c_str() returns a proxy (wxCStrData) which converts to *both* const char* and const wchar_t* + using Type = std::conditional_t<HasConversion<S, wchar_t>::value, wchar_t, + /**/ std::conditional_t<HasConversion<S, char >::value, char, void>>; //using Type = typename S::value_type; /*DON'T use S::value_type: 1. support Glib::ustring: value_type is "unsigned int" but c_str() returns "const char*" ++++++ FreeFileSync_14.11_Source.zip -> FreeFileSync_14.12_Source.zip ++++++ ++++ 8976 lines of diff (skipped) ++++++ glib2-2.78-free_size-Fix-build-when-g_free-macro-is-defined.patch ++++++ --- /var/tmp/diff_new_pack.MjLIS3/_old 2026-10-05 15:21:44.239464738 +0200 +++ /var/tmp/diff_new_pack.MjLIS3/_new 2026-10-05 15:21:44.248465113 +0200 @@ -82,7 +82,7 @@ --- FreeFileSync-14.10.orig/zen/zstring.cpp +++ FreeFileSync-14.10/zen/zstring.cpp @@ -25,7 +25,11 @@ Zstring getUnicodeNormalForm_NonAsciiVal - gchar* strNorm = ::g_utf8_normalize(str.c_str(), str.length(), form == UnicodeNormalForm::nfc ? G_NORMALIZE_NFC : G_NORMALIZE_NFD); + gchar* strNorm = ::g_utf8_normalize(str.c_str(), str.size(), form == UnicodeNormalForm::nfc ? G_NORMALIZE_NFC : G_NORMALIZE_NFD); if (!strNorm) throw SysError(formatSystemError("g_utf8_normalize", L"", L"Conversion failed.")); +#ifdef g_free @@ -91,6 +91,6 @@ ZEN_ON_SCOPE_EXIT(::g_free(strNorm)); +#endif - const std::string_view strNormView(strNorm, strLength(strNorm)); + const std::string_view strNormView(strNorm, strSize(strNorm)); ++++++ wxwidgets-no-wx3.3.1-WxLogCollector.patch ++++++ --- /var/tmp/diff_new_pack.MjLIS3/_old 2026-10-05 15:21:44.264465780 +0200 +++ /var/tmp/diff_new_pack.MjLIS3/_new 2026-10-05 15:21:44.270466030 +0200 @@ -1,22 +1,6 @@ -From: Fab Stz <[email protected]> -Date: Wed, 1 Jul 2026 10:26:39 +0200 -Subject: Revert to WxLog instead of WxLogCollector - -WxLogCollector appeared is wxWidgets 3.3.1 & FreeFileSync 14.10 - -This reverts to the way it worked in FreeFileSync 14.9 ---- - FreeFileSync/Source/localization.cpp | 8 +------- - FreeFileSync/Source/ui/batch_status_handler.cpp | 6 +++--- - FreeFileSync/Source/ui/gui_status_handler.cpp | 7 +++---- - FreeFileSync/Source/ui/main_dlg.cpp | 7 +++---- - wx+/image_resources.cpp | 8 +------- - 5 files changed, 11 insertions(+), 25 deletions(-) - -diff --git a/FreeFileSync/Source/localization.cpp b/FreeFileSync/Source/localization.cpp -index 31379c5..5d8dac6 100644 ---- a/FreeFileSync/Source/localization.cpp -+++ b/FreeFileSync/Source/localization.cpp +diff -ruN a/FreeFileSync/Source/localization.cpp b/FreeFileSync/Source/localization.cpp +--- a/FreeFileSync/Source/localization.cpp 2026-10-05 11:23:23.983134803 +0200 ++++ b/FreeFileSync/Source/localization.cpp 2026-10-05 11:23:24.003523570 +0200 @@ -8,7 +8,6 @@ #include <clocale> //setlocale #include <zen/file_traverser.h> @@ -25,7 +9,7 @@ #include <wx/zipstrm.h> #include <wx/mstream.h> #include <wx/uilocale.h> -@@ -129,8 +128,6 @@ std::vector<TranslationInfo> loadTranslations(const Zstring& zipPath) //throw Fi +@@ -129,8 +128,6 @@ } //------------------------------------------------------------- @@ -34,7 +18,7 @@ wxMemoryInputStream byteStream(rawStream.c_str(), rawStream.size()); //does not take ownership wxZipInputStream zipStream(byteStream, wxConvUTF8); -@@ -151,11 +148,8 @@ std::vector<TranslationInfo> loadTranslations(const Zstring& zipPath) //throw Fi +@@ -151,11 +148,8 @@ streams.emplace_back(zipPath + Zstr(':') + utfTo<Zstring>(entry->GetName()), std::move(stream)); } else @@ -43,15 +27,14 @@ } - - if (zipStream.GetLastError() != wxSTREAM_EOF || !zipLog.GetMessages().empty()) -- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(zipPath)), utfTo<std::wstring>(zipLog.GetMessages())); +- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(zipPath)), utfTo<std::wstring>(zipLog.GetMessages())); }(); //-------------------------------------------------------------------- -diff --git a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp -index 88f722b..b065b3b 100644 ---- a/FreeFileSync/Source/ui/batch_status_handler.cpp -+++ b/FreeFileSync/Source/ui/batch_status_handler.cpp -@@ -190,12 +190,12 @@ BatchStatusHandler::DlgOptions BatchStatusHandler::showResult() +diff -ruN a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp +--- a/FreeFileSync/Source/ui/batch_status_handler.cpp 2026-10-05 11:23:23.980777739 +0200 ++++ b/FreeFileSync/Source/ui/batch_status_handler.cpp 2026-10-05 11:23:24.002664094 +0200 +@@ -190,12 +190,12 @@ else if (!suspend && !autoClose && //only play when actually showing results dialog !soundFileSyncComplete_.empty()) { @@ -67,15 +50,14 @@ } //if (::GetForegroundWindow() != GetHWND()) // RequestUserAttention(); -> probably too much since task bar is already colorized with Taskbar::Status::error or Status::normal -diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp -index 15fed1f..3dce443 100644 ---- a/FreeFileSync/Source/ui/gui_status_handler.cpp -+++ b/FreeFileSync/Source/ui/gui_status_handler.cpp -@@ -515,12 +515,11 @@ StatusHandlerFloatingDialog::DlgOptions StatusHandlerFloatingDialog::showResult( +diff -ruN a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp +--- a/FreeFileSync/Source/ui/gui_status_handler.cpp 2026-10-05 11:23:23.981591100 +0200 ++++ b/FreeFileSync/Source/ui/gui_status_handler.cpp 2026-10-05 11:23:24.001916292 +0200 +@@ -508,12 +508,11 @@ if (!taskCancelled() && !suspend && !autoClose && //only play when actually showing results dialog !soundFileSyncComplete_.empty()) { -- wxLogCollector soundLog; //wxWidgets shows modal error dialog by default => "no, wxWidgets, NO!" +- wxLogCollector soundLog; //wxWidgets shows modal error dialog by default => "no, wxWidgets, NO!" + //wxWidgets shows modal error dialog by default => "no, wxWidgets, NO!" + wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! + ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); @@ -87,11 +69,10 @@ } //if (::GetForegroundWindow() != GetHWND()) // RequestUserAttention(); -> probably too much since task bar is already colorized with Taskbar::Status::error or Status::normal -diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp -index 9300767..bc3e88d 100644 ---- a/FreeFileSync/Source/ui/main_dlg.cpp -+++ b/FreeFileSync/Source/ui/main_dlg.cpp -@@ -4622,12 +4622,11 @@ void MainDialog::onCompare(wxCommandEvent& event) +diff -ruN a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp +--- a/FreeFileSync/Source/ui/main_dlg.cpp 2026-10-05 11:23:23.981832066 +0200 ++++ b/FreeFileSync/Source/ui/main_dlg.cpp 2026-10-05 11:23:24.002832207 +0200 +@@ -4614,12 +4614,11 @@ //play (optional) sound notification if (!globalCfg_.soundFileCompareFinished.empty()) { @@ -107,10 +88,9 @@ } } catch (CancelProcess&) {} -diff --git a/wx+/image_resources.cpp b/wx+/image_resources.cpp -index 2df8282..e672d05 100644 ---- a/wx+/image_resources.cpp -+++ b/wx+/image_resources.cpp +diff -ruN a/wx+/image_resources.cpp b/wx+/image_resources.cpp +--- a/wx+/image_resources.cpp 2026-10-05 11:23:23.987369636 +0200 ++++ b/wx+/image_resources.cpp 2026-10-05 11:23:24.007936155 +0200 @@ -9,7 +9,6 @@ #include <zen/thread.h> #include <zen/file_io.h> @@ -119,7 +99,7 @@ #include <wx/mstream.h> #include <wx/zipstrm.h> #include <xBRZ/src/xbrz.h> -@@ -202,8 +201,6 @@ ImageBuffer::ImageBuffer(const Zstring& zipPath) //throw FileError +@@ -204,8 +203,6 @@ } //-------------------------------------------------------------------- @@ -128,7 +108,7 @@ //wxFFileInputStream/wxZipInputStream loads in junks of 512 bytes => WTF!!! => implement sane file loading: wxMemoryInputStream memStream(rawStream.c_str(), rawStream.size()); //does not take ownership wxZipInputStream zipStream(memStream, wxConvUTF8); -@@ -220,10 +217,7 @@ ImageBuffer::ImageBuffer(const Zstring& zipPath) //throw FileError +@@ -222,10 +219,7 @@ streams.emplace_back(utfTo<Zstring>(entry->GetName()), std::move(stream)); } else
