summaryrefslogtreecommitdiff
path: root/pcr/freefilesync
diff options
context:
space:
mode:
authorbill-auger <mr.j.spam.me@gmail.com>2021-01-26 21:03:47 -0500
committerbill-auger <mr.j.spam.me@gmail.com>2021-01-27 03:05:56 -0500
commit7471bf5b106f788cab088d06a163fc86021b681c (patch)
tree2c62883c54d485108059f28a8ad9918f077e9c32 /pcr/freefilesync
parenta4d47df007522722070e167a435398175a1ae162 (diff)
downloadabslibre-7471bf5b106f788cab088d06a163fc86021b681c.tar.gz
abslibre-7471bf5b106f788cab088d06a163fc86021b681c.tar.bz2
abslibre-7471bf5b106f788cab088d06a163fc86021b681c.zip
[freefilesync]: upgrade to v11.4
Diffstat (limited to 'pcr/freefilesync')
-rw-r--r--pcr/freefilesync/FreeFileSync.desktop17
-rw-r--r--pcr/freefilesync/PKGBUILD146
-rw-r--r--pcr/freefilesync/RealTimeSync.desktop19
-rw-r--r--pcr/freefilesync/disable-autoupdate.patch26
-rwxr-xr-xpcr/freefilesync/ffsicon.pngbin12078 -> 0 bytes
-rw-r--r--pcr/freefilesync/freefilesync.install20
-rw-r--r--pcr/freefilesync/reversions_11-1.patch68
-rw-r--r--pcr/freefilesync/revert_bulk_append.patch55
-rw-r--r--pcr/freefilesync/revert_linkflags.patch35
-rw-r--r--pcr/freefilesync/revert_xdg_config_path.patch10
-rwxr-xr-xpcr/freefilesync/rtsicon.pngbin11335 -> 0 bytes
-rw-r--r--pcr/freefilesync/theme_fixes.patch75
12 files changed, 369 insertions, 102 deletions
diff --git a/pcr/freefilesync/FreeFileSync.desktop b/pcr/freefilesync/FreeFileSync.desktop
index 9acfb0c16..b94e4799d 100644
--- a/pcr/freefilesync/FreeFileSync.desktop
+++ b/pcr/freefilesync/FreeFileSync.desktop
@@ -1,14 +1,11 @@
[Desktop Entry]
+Type=Application
Name=FreeFileSync
-GenericName=File synchronization
-Comment=Backup software to synchronize files and folders
-Exec=FreeFileSync
+GenericName=Folder Comparison and Synchronization
+GenericName[de_DE]=Ordnervergleich und Synchronisation
+Exec=FreeFileSync %F
+Icon=/usr/share/pixmaps/FreeFileSync.png
NoDisplay=false
-Terminal=0
-TerminalOptions=
-Type=Application
-Icon=/usr/share/pixmaps/ffsicon.png
-Categories=GTK;Application;Utility;
+Terminal=false
+Categories=Utility;FileTools;
StartupNotify=true
-X-KDE-SubstituteUID=false
-X-KDE-Username=
diff --git a/pcr/freefilesync/PKGBUILD b/pcr/freefilesync/PKGBUILD
index d32ee9be9..f62c7a02d 100644
--- a/pcr/freefilesync/PKGBUILD
+++ b/pcr/freefilesync/PKGBUILD
@@ -1,90 +1,116 @@
-
-# Contributor (Arch): chenxing <cxcxcxcx AT gmail DOT com>
-# Contributor (Arch): Michael Burkhard <Michael DOT Burkhard AT web DOT de>
-# Maintainer (Arch): alexmo82 <25396682 AT live DOT it>
+# Contributor (aur): chenxing <cxcxcxcx AT gmail DOT com>
+# Contributor (aur): Michael Burkhard <Michael DOT Burkhard AT web DOT de>
+# Contributor (aur): alexmo82 <25396682 AT live DOT it>
+# Contributor (aur): Simon Brulhart <simon@brulhart.me>
+# Maintainer (aur): jooch <jooch AT gmx DOT com>
# Maintainer: Omar Vega Ramos <ovruni@gnu.org.pe>
+# Contributor: bill-auger <bill-auger@programmer.net>
+
+# NOTE: this PKGBUILD requires 'wget' to be available to the build host
+# the upstream file server is wonky - very inconsistent results with curl
pkgname=freefilesync
-pkgver=10.2
+pkgver=11.4
pkgrel=1
pkgdesc="Backup software to synchronize files and folders"
-arch=('i686' 'x86_64' 'armv7h')
-url="http://www.freefilesync.org/"
-license=('GPLv3')
-depends=(wxgtk webkit2gtk boost-libs)
-makedepends=(boost)
+arch=('i686' 'x86_64')
+arch+=('armv7h')
+url="https://freefilesync.org"
+license=('GPL3')
+depends=(wxgtk2 curl lsb-release)
+makedepends=(unzip)
source=(
- "FreeFileSync_${pkgver}_Source.zip::https://www.freefilesync.org/download_redirect.php?file=FreeFileSync_${pkgver}_Source.zip" #ffs
+ https://freefilesync.org/download/FreeFileSync_${pkgver}_Source.zip
+ reversions_11-1.patch
+ theme_fixes.patch
+ revert_xdg_config_path.patch
+ revert_bulk_append.patch
+ revert_linkflags.patch
FreeFileSync.desktop
- ffsicon.png
RealTimeSync.desktop
- rtsicon.png
- )
-
-sha256sums=(
- 'b7b072f6239529d0030d845b4b62463edf37910dda3e75cd9dd64f01da81b5b9' #ffs source
- 'b381bb9dbda25c3c08a67f18072a2761abe34339ddf3318e1758eb7c349f1a3b' #FreeFileSync.desktop
- '31df3fa1f1310de14bbd379f891d4f8ed2df5b0d68913eb52c88b3be682933fb' #ffsicon.png
- '1502efdbf1638856a18ab9916e0431bf6a53471792cb2daa380345bac33f67c4' #RealTimeSync.desktop
- 'f28042587dbe99cf5d6bef2c1be4b026488e418e4ba8332b3016d246b7053a4e' #rtsicon.png
- )
-
-DLAGENTS=('https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -A Mozilla -o %o %u')
+)
+source+=(disable-autoupdate.patch)
+sha256sums=('d0c20c1388024460944bb0871e91ce6dc9ac5c02be45a095f288db169eb844b4'
+ '6c2d7f24e4edc52bc1af95d3f48ef67456cde0b952b81a702901acfb36545999'
+ '4f2b1d46c0b754c668be7ec675a2bb09f72b3bd0e20987b4db61575b5ca1bf46'
+ '0f9a9a6b2c3c460bbde7425bd62273c925259db1cc9dc18c6013aae99fb15cd8'
+ '17e7db683662809882db6d6b3d855eb4372ca1bd05e15c4c490970a0b4b127c0'
+ 'c83475ef3ac8bd534d637062d516c9eeea54ac18c775be55e1adef413ac73063'
+ '590d87707240529ca893199f852143f5d7c7266cb050e37e615900b013ac3d51'
+ '82439b4b81b0a72652befad9b9db52ffbc0180f307c92205aa5ab344f9f82830')
+sha256sums+=(8dab1089d582058ccbbc8409961b73e5b4d5defe9c6526ee1880a5697449c53f)
+
+DLAGENTS=('https::/usr/bin/wget %u')
prepare() {
-# wxgtk < 3.1.0
- sed -i 's/m_listBoxHistory->GetTopItem()/0/g' FreeFileSync/Source/ui/main_dlg.cpp
+ # wxgtk < 3.1.0
+ # Revert to classic config path
+ patch -p1 -i revert_xdg_config_path.patch
-# gcc 6.3.1
- sed -i 's!static_assert!//static_assert!' zen/scope_guard.h
+ # Avoid uses of wxItemContainer::Append(const std::vector<wxString>& items)
+ patch -p1 -i revert_bulk_append.patch
-# warn_static(string)
- sed -i 's!-O3 -DN!-D"warn_static(arg)= " -O3 -DN!' FreeFileSync/Source/Makefile
- sed -i 's!-O3 -DN!-D"warn_static(arg)= " -O3 -DN!' FreeFileSync/Source/RealTimeSync/Makefile
+ # edit lines to remove functions that require wxgtk 3.1.x
+ sed -e 's:m_textCtrlOfflineActivationKey->ForceUpper:// &:g' -i 'FreeFileSync/Source/ui/small_dlgs.cpp'
+ sed -e 's:const double scrollSpeed =:& 6; //:g' -i 'wx+/grid.cpp'
-# linker error
- sed -i 's#inline##g' FreeFileSync/Source/ui/version_check_impl.h
+ patch -p1 -i reversions_11-1.patch
+ grep -RiIl 'wxASCII_STR' | xargs sed -e 's/wxASCII_STR/wxString::FromAscii/g' -i
+ grep -RiIl 'wxDD_SHOW_HIDDEN' | xargs sed -e 's/, wxDD_DEFAULT_STYLE | wxDD_SHOW_HIDDEN//g' -i
-# install error
- cp ${srcdir}/Changelog.txt ${srcdir}/FreeFileSync/Build
+ # undo zenju hacks
+ sed -e '71,77d' -i 'wx+/dc.h'
+ sed -e '73d' -i 'wx+/no_flicker.h'
-# edit lines to remove functions that require wxgtk 3.1.x
- sed -e 's:m_textCtrlOfflineActivationKey->ForceUpper:// &:g' -i 'FreeFileSync/Source/ui/small_dlgs.cpp'
- sed -e 's:const double scrollSpeed =:& 6; //:g' -i 'wx+/grid.cpp'
+ # GUI theme fixes (for improved color compatibility)
+ patch -p1 -i theme_fixes.patch
+
+ # add LINKFLAGS that were removed but that we still need in our case
+ patch -p1 -i revert_linkflags.patch
+
+ # inlining of constants not present in libssh2's distributed headers
+ sed -i 's/MAX_SFTP_READ_SIZE/30000/g' FreeFileSync/Source/afs/sftp.cpp
+ sed -i 's/MAX_SFTP_OUTGOING_SIZE/30000/g' FreeFileSync/Source/afs/sftp.cpp
-# add '-lz' back into LINKFLAGS
- sed -i '/pie/ s/-pthread/-lz -pthread/' FreeFileSync/Source/Makefile
- sed -i '/pie/ s/-pthread/-lz -pthread/' FreeFileSync/Source/RealTimeSync/Makefile
+ echo "applying disable-autoupdate.patch"
+ cd "${srcdir}"/FreeFileSync/
+ patch -p1 -i "${srcdir}"/disable-autoupdate.patch
}
build() {
-### speed up compile on multithread machines
+ ### speed up compile on multithread machines
MAKEFLAGS="-j$(nproc)"
-### just in case of compile errors
+ ### just in case of compile errors
VER=`g++ -dumpversion`
MAC=`g++ -dumpmachine`
echo "compiler g++ $VER $MAC"
-### FFS
- cd ${srcdir}/FreeFileSync/Source
- make
+ ### FFS
+ cd "${srcdir}/FreeFileSync/Source"
+ make exeName=FreeFileSync tmpPath="${srcdir}/FreeFileSync/tmp_ffs"
-### RTS
- cd RealTimeSync
- make
+ ### RTS
+ cd "${srcdir}/FreeFileSync/Source/RealTimeSync"
+ make exeName=RealTimeSync tmpPath="${srcdir}/FreeFileSync/tmp_rts"
}
package() {
- cd ${srcdir}/FreeFileSync/Source
- make DESTDIR=${pkgdir} install
-
- cd RealTimeSync
- make DESTDIR=${pkgdir} install
-
- cd ${srcdir}
- install -Dm644 FreeFileSync.desktop $pkgdir/usr/share/applications/FreeFileSync.desktop
- install -Dm644 ffsicon.png $pkgdir/usr/share/pixmaps/ffsicon.png
- install -Dm644 RealTimeSync.desktop $pkgdir/usr/share/applications/RealTimeSync.desktop
- install -Dm644 rtsicon.png $pkgdir/usr/share/pixmaps/rtsicon.png
+ bindir="${pkgdir}/usr/bin"
+ appdir="${pkgdir}/opt/FreeFileSync"
+ appdocdir="${pkgdir}/usr/share/doc/FreeFileSync"
+
+ cd "${srcdir}/FreeFileSync/Build"
+ install -t "${appdir}/Bin" -Dm755 Bin/*
+ mkdir -p "${bindir}"
+ ln -s /opt/FreeFileSync/Bin/{FreeFileSync,RealTimeSync} "${bindir}"
+
+ cp -rT Resources "${appdir}/Resources"
+ find "${appdir}/Resources" -type f -print0 | xargs -0 chmod 644
+ install -t "${pkgdir}/usr/share/pixmaps" -Dm644 Resources/FreeFileSync.png Resources/RealTimeSync.png
+
+ cd "${srcdir}"
+ install -d "${appdocdir}"
+ gzip < Changelog.txt > "${appdocdir}/CHANGELOG.gz"
+ install -Dm644 -t "${pkgdir}/usr/share/applications" FreeFileSync.desktop RealTimeSync.desktop
}
diff --git a/pcr/freefilesync/RealTimeSync.desktop b/pcr/freefilesync/RealTimeSync.desktop
index ae02f6ad9..dfd533ffd 100644
--- a/pcr/freefilesync/RealTimeSync.desktop
+++ b/pcr/freefilesync/RealTimeSync.desktop
@@ -1,16 +1,11 @@
[Desktop Entry]
-Name=RealtimeSync
+Type=Application
+Name=RealTimeSync
GenericName=Automated Synchronization
-Comment=Real time synchronization
-Exec=RealTimeSync
+GenericName[de_DE]=Automatisierte Synchronisation
+Exec=RealTimeSync %f
+Icon=/usr/share/pixmaps/RealTimeSync.png
NoDisplay=false
-Terminal=0
-TerminalOptions=
-Icon=/usr/share/pixmaps/rtsicon.png
-Categories=GTK;Application;Utility;
+Terminal=false
+Categories=Utility;FileTools;
StartupNotify=true
-Type=Application
-X-KDE-SubstituteUID=false
-X-KDE-Username=
-
-Name[it_IT.utf8]=RealTimeSync
diff --git a/pcr/freefilesync/disable-autoupdate.patch b/pcr/freefilesync/disable-autoupdate.patch
new file mode 100644
index 000000000..d4fd36122
--- /dev/null
+++ b/pcr/freefilesync/disable-autoupdate.patch
@@ -0,0 +1,26 @@
+diff --git a/Source/ui/version_check.cpp b/Source/ui/version_check.cpp
+index d19d05e..e30cf85 100644
+--- a/Source/ui/version_check.cpp
++++ b/Source/ui/version_check.cpp
+@@ -220,9 +220,12 @@ void fff::disableUpdateCheck(time_t& lastUpdateCheck)
+ lastUpdateCheck = getVersionCheckInactiveId();
+ }
+
+-
+ void fff::checkForUpdateNow(wxWindow& parent, std::string& lastOnlineVersion)
+ {
++ showNotificationDialog(&parent, DialogInfoType::info, PopupDialogCfg().
++ setTitle(_("FreeFileSync (Parabola GNU/Linux Edition)")).
++ setMainInstructions(_("Automatic updates disabled.")));
++
+ try
+ {
+ const std::string onlineVersion = getOnlineVersion(geHttpPostParameters(parent)); //throw SysError
+@@ -325,6 +328,7 @@ void fff::automaticUpdateCheckEval(wxWindow* parent, time_t& lastUpdateCheck, st
+ {
+ assert(runningOnMainThread());
+
++ return ;
+
+ const UpdateCheckResult& result = *asyncResult;
+
diff --git a/pcr/freefilesync/ffsicon.png b/pcr/freefilesync/ffsicon.png
deleted file mode 100755
index 7fbc97509..000000000
--- a/pcr/freefilesync/ffsicon.png
+++ /dev/null
Binary files differ
diff --git a/pcr/freefilesync/freefilesync.install b/pcr/freefilesync/freefilesync.install
deleted file mode 100644
index a2b7306a1..000000000
--- a/pcr/freefilesync/freefilesync.install
+++ /dev/null
@@ -1,20 +0,0 @@
-#function to tell user to run shell script to reinstall wxgtk and extract libwx*3.1.so* items from wxgtk-dev packages after installation/upgrade of freefilesync
-reinstall_and_extract_message() {
- echo -e "\n\n$(tput bold)$(tput setaf 7)$(tput setab 1)Run 'sudo sh /usr/bin/wxgtk_fix.sh' after this finishes"'!'"$(tput sgr 0)\n\n"
-}
-
-# send message after installation of freefilesync
-post_install() {
- reinstall_and_extract_message
-}
-
-# send message after upgrade of freefilesync
-post_upgrade() {
- reinstall_and_extract_message
-}
-
-# remove the libwx*3.1.so* files from /usr/lib/ and wxgtk_fix.sh from /usr/bin after removal of freefilesync
-post_remove() {
- rm /usr/lib/libwx*3.1.so*
- rm /usr/bin/wxgtk_fix.sh
-} \ No newline at end of file
diff --git a/pcr/freefilesync/reversions_11-1.patch b/pcr/freefilesync/reversions_11-1.patch
new file mode 100644
index 000000000..c503a4f2b
--- /dev/null
+++ b/pcr/freefilesync/reversions_11-1.patch
@@ -0,0 +1,68 @@
+Version: 11.1
+Message: Had to revert gui_status_handler.cpp and .h entirely to version 11.0 to avoid the wx 3.1.4-isms here.
+diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp
+index 3cb6aaaa..9484af2c 100644
+--- a/FreeFileSync/Source/ui/gui_status_handler.cpp
++++ b/FreeFileSync/Source/ui/gui_status_handler.cpp
+@@ -43,8 +43,8 @@ StatusHandlerTemporaryPanel::StatusHandlerTemporaryPanel(MainDialog& dlg,
+ mainDlg_.Update(); //don't wait until idle event!
+
+ //register keys
+- mainDlg_. Bind(wxEVT_CHAR_HOOK, &StatusHandlerTemporaryPanel::onLocalKeyEvent, this);
+- mainDlg_.m_buttonCancel->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &StatusHandlerTemporaryPanel::onAbortCompare, this);
++ mainDlg_.Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(StatusHandlerTemporaryPanel::OnKeyPressed), nullptr, this);
++ mainDlg_.m_buttonCancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusHandlerTemporaryPanel::OnAbortCompare), nullptr, this);
+ }
+
+
+@@ -128,9 +128,8 @@ StatusHandlerTemporaryPanel::~StatusHandlerTemporaryPanel()
+ mainDlg_.auiMgr_.Update();
+
+ //unregister keys
+- [[maybe_unused]] bool ubOk1 = mainDlg_. Unbind(wxEVT_CHAR_HOOK, &StatusHandlerTemporaryPanel::onLocalKeyEvent, this);
+- [[maybe_unused]] bool ubOk2 = mainDlg_.m_buttonCancel->Unbind(wxEVT_COMMAND_BUTTON_CLICKED, &StatusHandlerTemporaryPanel::onAbortCompare, this);
+- assert(ubOk1 && ubOk2);
++ mainDlg_.Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(StatusHandlerTemporaryPanel::OnKeyPressed), nullptr, this);
++ mainDlg_.m_buttonCancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusHandlerTemporaryPanel::OnAbortCompare), nullptr, this);
+
+ mainDlg_.compareStatus_->teardown();
+
+@@ -314,20 +313,20 @@ void StatusHandlerTemporaryPanel::forceUiUpdateNoThrow()
+ }
+
+
+-void StatusHandlerTemporaryPanel::onLocalKeyEvent(wxKeyEvent& event)
++void StatusHandlerTemporaryPanel::OnKeyPressed(wxKeyEvent& event)
+ {
+ const int keyCode = event.GetKeyCode();
+ if (keyCode == WXK_ESCAPE)
+ {
+ wxCommandEvent dummy;
+- onAbortCompare(dummy);
++ OnAbortCompare(dummy);
+ }
+
+ event.Skip();
+ }
+
+
+-void StatusHandlerTemporaryPanel::onAbortCompare(wxCommandEvent& event)
++void StatusHandlerTemporaryPanel::OnAbortCompare(wxCommandEvent& event)
+ {
+ userRequestAbort();
+ }
+diff --git a/FreeFileSync/Source/ui/gui_status_handler.h b/FreeFileSync/Source/ui/gui_status_handler.h
+index e8ed01e4..2a9e00d2 100644
+--- a/FreeFileSync/Source/ui/gui_status_handler.h
++++ b/FreeFileSync/Source/ui/gui_status_handler.h
+@@ -41,8 +41,8 @@ public:
+ Result reportResults(); //noexcept!!
+
+ private:
+- void onLocalKeyEvent(wxKeyEvent& event);
+- void onAbortCompare(wxCommandEvent& event); //handle abort button click
++ void OnKeyPressed(wxKeyEvent& event);
++ void OnAbortCompare(wxCommandEvent& event); //handle abort button click
+ void showStatsPanel();
+
+ MainDialog& mainDlg_;
diff --git a/pcr/freefilesync/revert_bulk_append.patch b/pcr/freefilesync/revert_bulk_append.patch
new file mode 100644
index 000000000..9782134ec
--- /dev/null
+++ b/pcr/freefilesync/revert_bulk_append.patch
@@ -0,0 +1,55 @@
+diff -r -u a/FreeFileSync/Source/ui/command_box.cpp b/FreeFileSync/Source/ui/command_box.cpp
+--- a/FreeFileSync/Source/ui/command_box.cpp 2020-06-18 19:16:52.000000000 +0200
++++ b/FreeFileSync/Source/ui/command_box.cpp 2020-06-21 10:45:23.265579023 +0200
+@@ -120,7 +120,8 @@
+
+ //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!!
+ wxItemContainer::Clear(); //suffices to clear the selection items only!
+- this->Append(items); //expensive as fuck! => only call when absolutely needed!
++ for (const wxString& item : items)
++ this->Append(item);
+
+ //this->SetSelection(wxNOT_FOUND); //don't select anything
+ ChangeValue(value); //preserve main text!
+diff -r -u a/FreeFileSync/Source/ui/folder_history_box.cpp b/FreeFileSync/Source/ui/folder_history_box.cpp
+--- a/FreeFileSync/Source/ui/folder_history_box.cpp 2020-06-18 19:16:52.000000000 +0200
++++ b/FreeFileSync/Source/ui/folder_history_box.cpp 2020-06-21 10:45:23.265579023 +0200
+@@ -90,7 +90,8 @@
+
+ //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!!
+ wxItemContainer::Clear(); //suffices to clear the selection items only!
+- this->Append(items); //expensive as fuck! => only call when absolutely needed!
++ for (const wxString& item : items)
++ this->Append(item);
+
+ //this->SetSelection(wxNOT_FOUND); //don't select anything
+ ChangeValue(folderPathPhrase); //preserve main text!
+diff -r -u a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp
+--- a/FreeFileSync/Source/ui/small_dlgs.cpp 2020-06-18 19:16:52.000000000 +0200
++++ b/FreeFileSync/Source/ui/small_dlgs.cpp 2020-06-21 11:35:53.494412284 +0200
+@@ -293,7 +293,9 @@
+ {
+ showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString()));
+ }
+- m_listBoxGdriveUsers->Append(gdriveAccounts);
++ for (auto const& account: gdriveAccounts) {
++ m_listBoxGdriveUsers->Append(account);
++ }
+
+ //set default values for Google Drive: use first item of m_listBoxGdriveUsers
+ if (!gdriveAccounts.empty() && !acceptsItemPathPhraseGdrive(folderPathPhrase))
+diff -r -u a/wx+/choice_enum.h b/wx+/choice_enum.h
+--- a/wx+/choice_enum.h 2020-06-18 19:16:51.000000000 +0200
++++ b/wx+/choice_enum.h 2020-06-21 10:45:23.268912329 +0200
+@@ -79,7 +79,10 @@
+
+ if (items != itemsSetLast)
+ {
+- ctrl.Set(items); //expensive as fuck! => only call when absolutely needed!
++ ctrl.Clear();
++ for (auto item : items) {
++ ctrl.Append(item);
++ }
+ itemsSetLast = std::move(items);
+ }
+ //----------------------------------------------------------------- \ No newline at end of file
diff --git a/pcr/freefilesync/revert_linkflags.patch b/pcr/freefilesync/revert_linkflags.patch
new file mode 100644
index 000000000..323924a00
--- /dev/null
+++ b/pcr/freefilesync/revert_linkflags.patch
@@ -0,0 +1,35 @@
+diff -r -u a/FreeFileSync/Source/Makefile b/FreeFileSync/Source/Makefile
+--- a/FreeFileSync/Source/Makefile
++++ b/FreeFileSync/Source/Makefile
+@@ -4,7 +4,7 @@
+ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
+ -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread
+
+-linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -pthread
++linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -lz -pthread
+
+
+ cxxFlags += `pkg-config --cflags openssl`
+@@ -17,6 +17,7 @@
+ linkFlags += `pkg-config --libs libssh2`
+
+ cxxFlags += `pkg-config --cflags gtk+-2.0`
++linkFlags += `pkg-config --libs gtk+-2.0`
+ #treat as system headers so that warnings are hidden:
+ cxxFlags += -isystem/usr/include/gtk-2.0
+
+diff -r -u a/FreeFileSync/Source/RealTimeSync/Makefile b/FreeFileSync/Source/RealTimeSync/Makefile
+--- a/FreeFileSync/Source/RealTimeSync/Makefile
++++ b/FreeFileSync/Source/RealTimeSync/Makefile
+@@ -4,10 +4,11 @@
+ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
+ -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread
+
+-linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -pthread
++linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -lz -pthread
+
+ #Gtk - support "no button border"
+ cxxFlags += `pkg-config --cflags gtk+-2.0`
++linkFlags += `pkg-config --libs gtk+-2.0`
+ #treat as system headers so that warnings are hidden:
+ cxxFlags += -isystem/usr/include/gtk-2.0
diff --git a/pcr/freefilesync/revert_xdg_config_path.patch b/pcr/freefilesync/revert_xdg_config_path.patch
new file mode 100644
index 000000000..1802311e6
--- /dev/null
+++ b/pcr/freefilesync/revert_xdg_config_path.patch
@@ -0,0 +1,10 @@
+--- a/FreeFileSync/Source/ffs_paths.cpp 2019-11-19 23:52:20.000000000 +0100
++++ b/FreeFileSync/Source/ffs_paths.cpp 2019-11-24 18:14:17.627328553 +0100
+@@ -80,6 +80,4 @@
+
+- //OS standard path (XDG layout): ~/.config/FreeFileSync
+- //wxBug: wxStandardPaths::GetUserDataDir() does not honor FileLayout_XDG flag
+- wxStandardPaths::Get().SetFileLayout(wxStandardPaths::FileLayout_XDG);
+- const Zstring cfgFolderPath = appendSeparator(utfTo<Zstring>(wxStandardPaths::Get().GetUserConfigDir())) + "FreeFileSync";
++ //OS standard path (classic layout): ~/.FreeFileSync
++ Zstring cfgFolderPath = utfTo<Zstring>(wxStandardPaths::Get().GetUserDataDir());
diff --git a/pcr/freefilesync/rtsicon.png b/pcr/freefilesync/rtsicon.png
deleted file mode 100755
index f76e74503..000000000
--- a/pcr/freefilesync/rtsicon.png
+++ /dev/null
Binary files differ
diff --git a/pcr/freefilesync/theme_fixes.patch b/pcr/freefilesync/theme_fixes.patch
new file mode 100644
index 000000000..e87464db7
--- /dev/null
+++ b/pcr/freefilesync/theme_fixes.patch
@@ -0,0 +1,75 @@
+diff -r -u a/wx+/grid.cpp b/wx+/grid.cpp
+--- a/wx+/grid.cpp 2020-12-05 14:38:39.000000000 +0100
++++ b/wx+/grid.cpp 2020-12-22 06:36:21.000000000 +0100
+@@ -36,10 +36,10 @@
+ {
+ //------------------------------ Grid Parameters --------------------------------
+ inline wxColor getColorLabelText(bool enabled) { return wxSystemSettings::GetColour(enabled ? wxSYS_COLOUR_WINDOWTEXT : wxSYS_COLOUR_GRAYTEXT); }
+-inline wxColor getColorGridLine() { return { 192, 192, 192 }; } //light grey
++inline wxColor getColorGridLine() { return wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW); } //light grey
+
+ inline wxColor getColorLabelGradientFrom() { return wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); }
+-inline wxColor getColorLabelGradientTo () { return { 200, 200, 200 }; } //light grey
++inline wxColor getColorLabelGradientTo () { return wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); } //light grey
+
+ inline wxColor getColorLabelGradientFocusFrom() { return getColorLabelGradientFrom(); }
+ inline wxColor getColorLabelGradientFocusTo () { return GridData::getColorSelectionGradientFrom(); }
+@@ -227,7 +227,7 @@
+ {
+ //left border
+ {
+- wxDCPenChanger dummy(dc, wxPen(*wxWHITE, fastFromDIP(1)));
++ wxDCPenChanger dummy(dc, wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW), fastFromDIP(1)));
+ dc.DrawLine(rect.GetTopLeft(), rect.GetBottomLeft());
+ }
+ //bottom, right border
+@@ -444,7 +444,7 @@
+
+ wxRect rectShrinked = clientRect;
+ rectShrinked.Deflate(fastFromDIP(1));
+- dc.SetPen(wxPen(*wxWHITE, fastFromDIP(1)));
++ dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW), fastFromDIP(1)));
+
+ //dc.DrawLine(clientRect.GetTopLeft(), clientRect.GetTopRight() + wxPoint(1, 0));
+ dc.DrawLine(rectShrinked.GetTopLeft(), rectShrinked.GetBottomLeft() + wxPoint(0, 1));
+@@ -545,7 +545,7 @@
+
+ //border lines
+ {
+- wxDCPenChanger dummy(dc, wxPen(*wxWHITE, fastFromDIP(1)));
++ wxDCPenChanger dummy(dc, wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW), fastFromDIP(1)));
+ dc.DrawLine(rect.GetTopLeft(), rect.GetTopRight());
+ }
+ {
+diff -r -u a/FreeFileSync/Source/ui/file_grid.cpp b/FreeFileSync/Source/ui/file_grid.cpp
+--- a/FreeFileSync/Source/ui/file_grid.cpp 2020-12-05 14:38:39.000000000 +0100
++++ b/FreeFileSync/Source/ui/file_grid.cpp 2020-12-22 06:05:29.000000000 +0100
+@@ -46,7 +46,7 @@
+ inline wxColor getColorInactiveBack(bool faint) { if (faint) return { 0xf6, 0xf6, 0xf6}; return { 0xe4, 0xe4, 0xe4 }; } //light grey
+ inline wxColor getColorInactiveText() { return { 0x40, 0x40, 0x40 }; } //dark grey
+
+-inline wxColor getColorGridLine() { return { 192, 192, 192 }; } //light grey
++inline wxColor getColorGridLine() { return wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW); } //light grey
+
+ const int FILE_GRID_GAP_SIZE_DIP = 2;
+ const int FILE_GRID_GAP_SIZE_WIDE_DIP = 6;
+diff -r -u a/FreeFileSync/Source/ui/triple_splitter.cpp b/FreeFileSync/Source/ui/triple_splitter.cpp
+--- a/FreeFileSync/Source/ui/triple_splitter.cpp 2020-12-05 14:38:39.000000000 +0100
++++ b/FreeFileSync/Source/ui/triple_splitter.cpp 2020-12-22 05:37:32.000000000 +0100
+@@ -8,6 +8,7 @@
+ #include <algorithm>
+ #include <zen/stl_tools.h>
+ #include <wx+/dc.h>
++#include <wx/settings.h>
+
+ using namespace zen;
+ using namespace fff;
+@@ -24,8 +25,8 @@
+ const int CHILD_WINDOW_MIN_SIZE_DIP = 50; //min. size of managed windows
+
+ //let's NOT create wxWidgets objects statically:
+-inline wxColor getColorSashGradientFrom() { return { 192, 192, 192 }; } //light grey
+-inline wxColor getColorSashGradientTo () { return *wxWHITE; }
++inline wxColor getColorSashGradientFrom() { return wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW); } //light grey
++inline wxColor getColorSashGradientTo () { return wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); }
+ }