summaryrefslogtreecommitdiff
path: root/freefilesync/debian/patches
diff options
context:
space:
mode:
Diffstat (limited to 'freefilesync/debian/patches')
-rw-r--r--freefilesync/debian/patches/ffs_allow_parallel_ops.patch14
-rw-r--r--freefilesync/debian/patches/ffs_curl.patch24
-rw-r--r--freefilesync/debian/patches/ffs_devuan.patch101
-rw-r--r--freefilesync/debian/patches/ffs_devuan_gtk3.patch36
-rw-r--r--freefilesync/debian/patches/ffs_gcc.patch46
-rw-r--r--freefilesync/debian/patches/ffs_libssh2.patch22
-rw-r--r--freefilesync/debian/patches/ffs_no_check_updates.patch61
-rw-r--r--freefilesync/debian/patches/ffs_no_wx311.patch83
-rw-r--r--freefilesync/debian/patches/ffs_sftp.patch27
-rw-r--r--freefilesync/debian/patches/ffs_traditional_view.patch275
-rw-r--r--freefilesync/debian/patches/revert_zenju_aggressive_upstreamisms.patch314
-rw-r--r--freefilesync/debian/patches/series4
12 files changed, 835 insertions, 172 deletions
diff --git a/freefilesync/debian/patches/ffs_allow_parallel_ops.patch b/freefilesync/debian/patches/ffs_allow_parallel_ops.patch
index e464662..15bf3ab 100644
--- a/freefilesync/debian/patches/ffs_allow_parallel_ops.patch
+++ b/freefilesync/debian/patches/ffs_allow_parallel_ops.patch
@@ -12,14 +12,14 @@ diff -x '*.orig' -x '*.swp' -x '*.rej' -Naur 10.9-0/FreeFileSync/Source/ui/folde
if (showCloudSetupDialog(parent_, folderPathPhrase, parallelOps, get(parallelOpsDisabledReason)) != ReturnSmallDlg::BUTTON_OKAY)
return;
diff -Naur -x '*.orig' -x '*.rej' 10.9-0/FreeFileSync/Source/ui/sync_cfg.cpp 10.9-1/FreeFileSync/Source/ui/sync_cfg.cpp
---- 10.9-0/FreeFileSync/Source/ui/sync_cfg.cpp 2019-02-10 22:01:42.075159451 -0500
-+++ 10.9-1/FreeFileSync/Source/ui/sync_cfg.cpp 2019-02-11 21:25:11.685992654 -0500
-@@ -263,7 +263,7 @@
+--- 10.21-0/FreeFileSync/Source/ui/sync_cfg.cpp 2020-03-18 08:56:08.644066742 -0400
++++ 10.21-1/FreeFileSync/Source/ui/sync_cfg.cpp 2020-03-18 09:13:30.459409986 -0400
+@@ -290,7 +290,7 @@
+ commandHistoryOut_(commandHistory),
globalPairCfg_(globalPairCfg),
localPairCfg_(localPairConfig),
- showMultipleCfgs_(showMultipleCfgs),
--perfPanelActive_(false),
-+perfPanelActive_(true),
- commandHistItemsMax_(commandHistItemsMax)
+- enableExtraFeatures_(false),
++ enableExtraFeatures_(true),
+ showMultipleCfgs_(showMultipleCfgs)
{
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel));
diff --git a/freefilesync/debian/patches/ffs_curl.patch b/freefilesync/debian/patches/ffs_curl.patch
index 2844a54..549d9ac 100644
--- a/freefilesync/debian/patches/ffs_curl.patch
+++ b/freefilesync/debian/patches/ffs_curl.patch
@@ -6,15 +6,29 @@ remove assertion for libcurl version >1.67 (1.66 should be safe but slower)
The upstream release uses the curl git master branch instead of release versions. The AUR guy thinks it's acceptable to use the older version of libcurl, that is actually already released.
Version: FreeFileSync 10.17
diff -r -u 10.17-0/FreeFileSync/Source/afs/ftp.cpp 10.17-1/FreeFileSync/Source/afs/ftp.cpp
---- 10.17-0/FreeFileSync/Source/afs/ftp.cpp 2019-10-17 18:37:03.000000000 +0200
-+++ 10.17-1/FreeFileSync/Source/afs/ftp.cpp 2019-10-20 20:18:07.221692533 +0200
-@@ -632,7 +632,7 @@
+--- 10.21-0/FreeFileSync/Source/afs/ftp.cpp 2020-03-18 08:56:08.608066350 -0400
++++ 10.21-1/FreeFileSync/Source/afs/ftp.cpp 2020-03-18 09:23:46.882110499 -0400
+@@ -635,7 +635,7 @@
curlRelPath += compFmt;
}
- static_assert(LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 67));
-+ // static_assert(LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 67));
++ static_assert(LIBCURL_VERSION_MAJOR > 7 || (LIBCURL_VERSION_MAJOR == 7 && LIBCURL_VERSION_MINOR >= 68));
/* 1. CURLFTPMETHOD_NOCWD requires absolute paths to unconditionally skip CWDs: https://github.com/curl/curl/pull/4382
2. CURLFTPMETHOD_SINGLECWD requires absolute paths to skip one needless "CWD entry path": https://github.com/curl/curl/pull/4332
=> https://curl.haxx.se/docs/faq.html#How_do_I_list_the_root_dir_of_an
-
+diff -Naur 10.20-0/libcurl/curl_wrap.h 10.20-1/libcurl/curl_wrap.h
+--- 10.21-0/libcurl/curl_wrap.h 2020-03-18 08:56:08.488065042 -0400
++++ 10.21-1/libcurl/curl_wrap.h 2020-03-18 09:25:52.871480165 -0400
+@@ -137,9 +137,9 @@
+ ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_AUTH_ERROR);
+ ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_HTTP3);
+ ZEN_CHECK_CASE_FOR_CONSTANT(CURL_LAST);
+- ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_QUIC_CONNECT_ERROR);
++ //ZEN_CHECK_CASE_FOR_CONSTANT(CURLE_QUIC_CONNECT_ERROR);
+ }
+- static_assert(CURL_LAST == CURLE_QUIC_CONNECT_ERROR + 1);
++ //static_assert(CURL_LAST == CURLE_QUIC_CONNECT_ERROR + 1);
+
+ return replaceCpy<std::wstring>(L"Curl status %x", L"%x", numberTo<std::wstring>(static_cast<int>(sc)));
+ }
diff --git a/freefilesync/debian/patches/ffs_devuan.patch b/freefilesync/debian/patches/ffs_devuan.patch
index fc16f54..67846e1 100644
--- a/freefilesync/debian/patches/ffs_devuan.patch
+++ b/freefilesync/debian/patches/ffs_devuan.patch
@@ -1,12 +1,11 @@
-Author: Simon Brulhart
-Source: AUR
-Date: 2019-10-21
-Message: Do not try to compile inexistant file
-Files affected: FreeFileSync/Source/Makefile
-diff -Naur 10.13-0/FreeFileSync/Source/base/ffs_paths.cpp 10.13-1/FreeFileSync/Source/base/ffs_paths.cpp
---- 10.13-0/FreeFileSync/Source/base/ffs_paths.cpp 2019-06-14 20:23:07.615661499 -0400
-+++ 10.13-1/FreeFileSync/Source/base/ffs_paths.cpp 2019-06-14 20:36:28.178274292 -0400
-@@ -55,7 +55,8 @@
+Author: B Stack
+Source: Original research
+Last date modified: 2020-02-15
+Message: Main patch to compile on Devuan.
+diff -x '*.swp' -x '.git*' -x '*.orig' -x '*.rej' -Naur 10.18-0/FreeFileSync/Source/ffs_paths.cpp 10.18-1/FreeFileSync/Source/ffs_paths.cpp
+--- 10.13-0/FreeFileSync/Source/ffs_paths.cpp 2019-06-14 20:23:07.615661499 -0400
++++ 10.18-1/FreeFileSync/Source/ffs_paths.cpp 2019-11-21 09:41:42.287474472 -0500
+@@ -64,7 +64,8 @@
Zstring fff::getResourceDirPf()
{
@@ -16,67 +15,49 @@ diff -Naur 10.13-0/FreeFileSync/Source/base/ffs_paths.cpp 10.13-1/FreeFileSync/S
}
-diff -Naur -x '*.orig' -x '*.rej' 10.11-0/FreeFileSync/Source/Makefile 10.11-1/FreeFileSync/Source/Makefile
---- 10.11-0/FreeFileSync/Source/Makefile 2019-04-12 08:05:57.000000000 -0400
-+++ 10.11-1/FreeFileSync/Source/Makefile 2019-04-12 14:00:16.774552362 -0400
+diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/FreeFileSync/Source/Makefile 10.24-1/FreeFileSync/Source/Makefile
+--- 10.24-0/FreeFileSync/Source/Makefile 2020-05-17 11:01:12.813889858 -0400
++++ 10.24-1/FreeFileSync/Source/Makefile 2020-05-17 11:29:01.456713486 -0400
@@ -1,10 +1,10 @@
--EXENAME = FreeFileSync_$(shell arch)
-+EXENAME = FreeFileSync
+-exeName = FreeFileSync_$(shell arch)
++exeName = FreeFileSync
- CXXFLAGS = -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
+-cxxFlags = -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
++cxxFlags += -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
-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 --debug=no` -pthread
-+LINKFLAGS = -s -no-pie `wx-config --libs std, aui --debug=no` -lz -pthread
+-linkFlags = -s -no-pie `wx-config --libs std, aui --debug=no` -pthread
++linkFlags += -s `wx-config --libs std, aui --debug=no` -lz -pthread
- CXXFLAGS += `pkg-config --cflags openssl`
-@@ -17,6 +17,7 @@ CXXFLAGS += `pkg-config --cflags libssh2`
- 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
-
-@@ -56,7 +56,6 @@
- CPP_FILES+=afs/init_curl_libssh2.cpp
- CPP_FILES+=afs/native.cpp
- CPP_FILES+=afs/sftp.cpp
--CPP_FILES+=afs/libssh2/init_libssh2.cpp
- CPP_FILES+=ui/batch_config.cpp
- CPP_FILES+=ui/abstract_folder_picker.cpp
- CPP_FILES+=ui/batch_status_handler.cpp
-diff -Naur -x '*.orig' -x '*.rej' 10.11-0/FreeFileSync/Source/RealTimeSync/Makefile 10.11-1/FreeFileSync/Source/RealTimeSync/Makefile
---- 10.11-0/FreeFileSync/Source/RealTimeSync/Makefile 2019-04-12 08:05:57.000000000 -0400
-+++ 10.15-1/FreeFileSync/Source/RealTimeSync/Makefile 2019-08-15 13:59:53.934551753 -0400
-@@ -1,13 +1,14 @@
--EXENAME = RealTimeSync_$(shell arch)
-+EXENAME = RealTimeSync
+ cxxFlags += `pkg-config --cflags openssl`
+diff -x '*.swp' -x '.git*' -x '*.orig' -x '*.rej' -Naur 10.19-0/FreeFileSync/Source/ui/small_dlgs.cpp 10.19-1/FreeFileSync/Source/ui/small_dlgs.cpp
+--- 10.11-0/FreeFileSync/Source/ui/small_dlgs.cpp 2019-12-27 07:56:06.714625467 -0500
++++ 10.21-1/FreeFileSync/Source/ui/small_dlgs.cpp 2020-03-18 09:03:57.753183052 -0400
+@@ -97,6 +97,8 @@
+ build += L"64 Bit";
+ #endif
+
++ build += L" for Devuan";
++
+ build += SPACED_BULLET;
+ build += utfTo<wxString>(formatTime(formatDateTag, getCompileTime()));
- CXXFLAGS = -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
+diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/FreeFileSync/Source/RealTimeSync/Makefile 10.24-1/FreeFileSync/Source/RealTimeSync/Makefile
+--- 10.24-0/FreeFileSync/Source/RealTimeSync/Makefile 2020-05-17 11:01:12.853890213 -0400
++++ 10.24-1/FreeFileSync/Source/RealTimeSync/Makefile 2020-05-17 11:29:17.540857423 -0400
+@@ -1,10 +1,10 @@
+-exeName = RealTimeSync_$(shell arch)
++exeName = RealTimeSync
+
+-cxxFlags = -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
++cxxFlags += -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
-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 --debug=no` -pthread
-+LINKFLAGS = -s -no-pie `wx-config --libs std, aui --debug=no` -lz -pthread
+-linkFlags = -s -no-pie `wx-config --libs std, aui --debug=no` -pthread
++linkFlags += -s `wx-config --libs std, aui --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 -Naur -x '*.orig' -x '*.rej' 10.11-0/FreeFileSync/Source/ui/small_dlgs.cpp 10.11-1/FreeFileSync/Source/ui/small_dlgs.cpp
---- 10.11-0/FreeFileSync/Source/ui/small_dlgs.cpp 2019-04-12 08:05:57.000000000 -0400
-+++ 10.11-1/FreeFileSync/Source/ui/small_dlgs.cpp 2019-04-12 13:58:55.050550183 -0400
-@@ -115,6 +115,8 @@
- L" x64";
- #endif
-
-+ build +=
-+ L" for Devuan";
-
- GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
-
+ cxxFlags += `pkg-config --cflags gtk+-2.0`
diff --git a/freefilesync/debian/patches/ffs_devuan_gtk3.patch b/freefilesync/debian/patches/ffs_devuan_gtk3.patch
new file mode 100644
index 0000000..8a5e83e
--- /dev/null
+++ b/freefilesync/debian/patches/ffs_devuan_gtk3.patch
@@ -0,0 +1,36 @@
+Author: B Stack
+Source: Original research
+Date: 2020-08-31
+Message: Main patch to compile on Devuan using GTK3.
+diff -x '*.swp' -x '.git*' -x '*.orig' -x '*.rej' -Naur 10.18-0/FreeFileSync/Source/Makefile 10.18-1/FreeFileSync/Source/Makefile
+--- 10.11-0/FreeFileSync/Source/Makefile 2019-04-12 08:05:57.000000000 -0400
++++ 10.18-1/FreeFileSync/Source/Makefile 2019-11-21 09:42:57.408243242 -0500
+@@ -16,9 +16,10 @@
+ cxxFlags += `pkg-config --cflags libssh2`
+ linkFlags += `pkg-config --libs libssh2`
+
+-cxxFlags += `pkg-config --cflags gtk+-2.0`
++cxxFlags += `pkg-config --cflags gtk+-3.0`
++linkFlags += `pkg-config --libs gtk+-3.0`
+ #treat as system headers so that warnings are hidden:
+-cxxFlags += -isystem/usr/include/gtk-2.0
++cxxFlags += -isystem/usr/include/gtk-3.0
+
+ #support for SELinux (optional)
+ SELINUX_EXISTING=$(shell pkg-config --exists libselinux && echo YES)
+diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/FreeFileSync/Source/RealTimeSync/Makefile 10.24-1/FreeFileSync/Source/RealTimeSync/Makefile
+--- 10.24-0/FreeFileSync/Source/RealTimeSync/Makefile 2020-05-17 18:30:59.289498093 -0400
++++ 10.24-1/FreeFileSync/Source/RealTimeSync/Makefile 2020-05-17 19:32:59.791394275 -0400
+@@ -7,9 +7,10 @@
+ linkFlags += -s `wx-config --libs std, aui --debug=no` -lz -pthread
+
+ #Gtk - support "no button border"
+-cxxFlags += `pkg-config --cflags gtk+-2.0`
++cxxFlags += `pkg-config --cflags gtk+-3.0`
++linkFlags += `pkg-config --libs gtk+-3.0`
+ #treat as system headers so that warnings are hidden:
+-cxxFlags += -isystem/usr/include/gtk-2.0
++cxxFlags += -isystem/usr/include/gtk-3.0
+
+ cppFiles=
+ cppFiles+=application.cpp
diff --git a/freefilesync/debian/patches/ffs_gcc.patch b/freefilesync/debian/patches/ffs_gcc.patch
new file mode 100644
index 0000000..ed007b5
--- /dev/null
+++ b/freefilesync/debian/patches/ffs_gcc.patch
@@ -0,0 +1,46 @@
+diff -Naur 10.25-1/FreeFileSync/Source/Makefile 10.25-2/FreeFileSync/Source/Makefile
+--- 10.25-1/FreeFileSync/Source/Makefile 2020-06-20 13:36:08.495867672 -0400
++++ 10.25-2/FreeFileSync/Source/Makefile 2020-06-20 13:31:36.180419862 -0400
+@@ -1,4 +1,5 @@
+ exeName = FreeFileSync
++CXX=g++-10
+
+ cxxFlags += -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
+ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
+@@ -114,11 +115,11 @@
+
+ ../Build/Bin/$(exeName): $(objFiles)
+ mkdir -p $(dir $@)
+- g++ -o $@ $^ $(linkFlags)
++ $(CXX) -o $@ $^ $(linkFlags)
+
+ $(tmpPath)/ffs/src/%.o : %
+ mkdir -p $(dir $@)
+- g++ $(cxxFlags) -c $< -o $@
++ $(CXX) $(cxxFlags) -c $< -o $@
+
+ clean:
+ rm -rf $(tmpPath)
+diff -Naur 10.25-1/FreeFileSync/Source/RealTimeSync/Makefile 10.25-2/FreeFileSync/Source/RealTimeSync/Makefile
+--- 10.25-1/FreeFileSync/Source/RealTimeSync/Makefile 2020-06-20 13:36:08.499867723 -0400
++++ 10.25-2/FreeFileSync/Source/RealTimeSync/Makefile 2020-06-20 13:31:48.844580205 -0400
+@@ -1,4 +1,5 @@
+ exeName = RealTimeSync
++CXX=g++-10
+
+ cxxFlags += -std=c++2a -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
+ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
+@@ -52,11 +53,11 @@
+
+ ../../Build/Bin/$(exeName): $(objFiles)
+ mkdir -p $(dir $@)
+- g++ -o $@ $^ $(linkFlags)
++ $(CXX) -o $@ $^ $(linkFlags)
+
+ $(tmpPath)/ffs/src/rts/%.o : %
+ mkdir -p $(dir $@)
+- g++ $(cxxFlags) -c $< -o $@
++ $(CXX) $(cxxFlags) -c $< -o $@
+
+ clean:
+ rm -rf $(tmpPath)
diff --git a/freefilesync/debian/patches/ffs_libssh2.patch b/freefilesync/debian/patches/ffs_libssh2.patch
index 0abd660..d5ca14e 100644
--- a/freefilesync/debian/patches/ffs_libssh2.patch
+++ b/freefilesync/debian/patches/ffs_libssh2.patch
@@ -9,8 +9,8 @@ Source: <none>
Author: B Stack
Message: libssh2 v1.8.0 does not yet implement these two error messages. I do not know why distros are not serving libssh2 v1.9.0 which wa released June 20, 2019.
Date: 2019-09-17T13:41:23Z
---- 10.17-0/FreeFileSync/Source/afs/libssh2/libssh2_wrap.h 2019-10-17 15:59:11.681641905 -0400
-+++ 10.17-1/FreeFileSync/Source/afs/libssh2/libssh2_wrap.h 2019-10-21 08:32:59.666149954 -0400
+--- 10.21-0/libssh2/libssh2_wrap.h 2020-03-18 08:56:08.500065173 -0400
++++ 10.21-1/libssh2/libssh2_wrap.h 2020-03-18 09:11:49.398311857 -0400
@@ -172,8 +172,8 @@
ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_ENCRYPT);
ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BAD_SOCKET);
@@ -19,18 +19,6 @@ Date: 2019-09-17T13:41:23Z
- ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEYFILE_AUTH_FAILED);
+ //ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_WINDOW_FULL);
+ //ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEYFILE_AUTH_FAILED);
- }
- return replaceCpy<std::wstring>(L"SSH status %x.", L"%x", numberTo<std::wstring>(sc));
- }
-diff -x '*.swp' -x .git -Naur 10.10-0/FreeFileSync/Source/afs/sftp.cpp 10.10-1/FreeFileSync/Source/afs/sftp.cpp
---- 10.10-0/FreeFileSync/Source/afs/sftp.cpp 2019-03-12 08:09:58.465098982 -0400
-+++ 10.17-1/FreeFileSync/Source/afs/sftp.cpp 2019-10-21 08:46:07.562161269 -0400
-@@ -1588,7 +1588,7 @@
- runSftpCommand(login_, L"libssh2_sftp_mkdir", //throw SysError
- [&](const SshSession::Details& sd) //noexcept!
- {
-- return ::libssh2_sftp_mkdir(sd.sftpChannel, getLibssh2Path(afsPath), LIBSSH2_SFTP_DEFAULT_MODE);
-+ return ::libssh2_sftp_mkdir(sd.sftpChannel, getLibssh2Path(afsPath), LIBSSH2_SFTP_S_IRWXU | LIBSSH2_SFTP_S_IRWXG | LIBSSH2_SFTP_S_IRWXO);
- //default for newly created directories: 0777 (LIBSSH2_SFTP_S_IRWXU | LIBSSH2_SFTP_S_IRWXG | LIBSSH2_SFTP_S_IRWXO)
- });
- }
+
+ default:
+ return replaceCpy<std::wstring>(L"SSH status %x", L"%x", numberTo<std::wstring>(sc));
diff --git a/freefilesync/debian/patches/ffs_no_check_updates.patch b/freefilesync/debian/patches/ffs_no_check_updates.patch
index 4e56d19..fcbeb97 100644
--- a/freefilesync/debian/patches/ffs_no_check_updates.patch
+++ b/freefilesync/debian/patches/ffs_no_check_updates.patch
@@ -1,7 +1,7 @@
-diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/main_dlg.cpp 10.14-1/FreeFileSync/Source/ui/main_dlg.cpp
---- 10.9-0/FreeFileSync/Source/ui/main_dlg.cpp 2019-02-10 22:01:42.029158919 -0500
-+++ 10.14-1/FreeFileSync/Source/ui/main_dlg.cpp 2019-07-16 10:56:40.213575535 -0400
-@@ -5298,7 +5298,7 @@
+diff -x '*.orig' -x '*.rej' -Naur 11.1-0/FreeFileSync/Source/ui/main_dlg.cpp 11.1-1/FreeFileSync/Source/ui/main_dlg.cpp
+--- 11.1-0/FreeFileSync/Source/ui/main_dlg.cpp 2020-08-31 20:04:21.621863187 -0400
++++ 11.1-1/FreeFileSync/Source/ui/main_dlg.cpp 2020-08-31 20:55:07.732089665 -0400
+@@ -5606,7 +5606,7 @@
globalCfg_.gui.lastUpdateCheck = 0; //reset to GlobalSettings.xml default value!
m_menuItemCheckVersionAuto->Check(updateCheckActive(globalCfg_.gui.lastUpdateCheck));
@@ -10,24 +10,23 @@ diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/main_dlg.cpp 10.14-
if (shouldRunAutomaticUpdateCheck(globalCfg_.gui.lastUpdateCheck))
{
flashStatusInformation(_("Searching for program updates..."));
-@@ -5306,6 +5306,7 @@
+@@ -5614,6 +5614,7 @@
automaticUpdateCheckEval(this, globalCfg_.gui.lastUpdateCheck, globalCfg_.gui.lastOnlineVersion,
- automaticUpdateCheckRunAsync(automaticUpdateCheckPrepare().get()).get());
+ automaticUpdateCheckRunAsync(automaticUpdateCheckPrepare(*this).get()).get());
}
+ */
}
-@@ -5313,7 +5314,7 @@
- {
- //execute just once per startup!
- Disconnect(wxEVT_IDLE, wxIdleEventHandler(MainDialog::OnRegularUpdateCheck), nullptr, this);
--
+@@ -5623,6 +5624,7 @@
+ [[maybe_unused]] bool ubOk = Unbind(wxEVT_IDLE, &MainDialog::onRegularUpdateCheck, this);
+ assert(ubOk);
+
+ /*
if (shouldRunAutomaticUpdateCheck(globalCfg_.gui.lastUpdateCheck))
{
flashStatusInformation(_("Searching for program updates..."));
-@@ -5327,6 +5328,7 @@
+@@ -5636,6 +5638,7 @@
resultAsync.get()); //run on main thread:
});
}
@@ -35,10 +34,10 @@ diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/main_dlg.cpp 10.14-
}
-diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/version_check.cpp 10.14-1/FreeFileSync/Source/ui/version_check.cpp
---- 10.9-0/FreeFileSync/Source/ui/version_check.cpp 2019-02-10 22:01:42.126160041 -0500
-+++ 10.14-1/FreeFileSync/Source/ui/version_check.cpp 2019-07-16 11:45:36.113848111 -0400
-@@ -69,6 +69,8 @@
+diff -x '*.orig' -x '*.rej' -Naur 11.1-0/FreeFileSync/Source/ui/version_check.cpp 11.1-1/FreeFileSync/Source/ui/version_check.cpp
+--- 11.1-0/FreeFileSync/Source/ui/version_check.cpp 2020-08-31 20:04:21.573862614 -0400
++++ 11.1-1/FreeFileSync/Source/ui/version_check.cpp 2020-08-31 20:48:08.102811585 -0400
+@@ -70,6 +70,8 @@
bool fff::shouldRunAutomaticUpdateCheck(time_t lastUpdateCheck)
{
@@ -47,7 +46,7 @@ diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/version_check.cpp 1
if (lastUpdateCheck == getVersionCheckInactiveId())
return false;
-@@ -156,8 +158,7 @@
+@@ -155,8 +157,7 @@
{
try
{
@@ -56,32 +55,32 @@ diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/version_check.cpp 1
+ const std::string buf = "";
updateDetailsMsg = utfTo<std::wstring>(buf);
}
- catch (const zen::SysError& e) { throw FileError(_("Failed to retrieve update information."), e.toString()); }
-@@ -187,8 +188,7 @@
- //access is thread-safe on Windows (WinInet), but not on Linux/OS X (wxWidgets)
+ catch (const SysError& e) { throw FileError(_("Failed to retrieve update information."), e.toString()); }
+@@ -185,8 +186,7 @@
+
std::string getOnlineVersion(const std::vector<std::pair<std::string, std::string>>& postParams) //throw SysError
{
-- const std::string buffer = sendHttpPost(Zstr("https://api.freefilesync.org/latest_version"), postParams,
-- ffsUpdateCheckUserAgent, nullptr /*caCertFilePath*/, nullptr /*notifyUnbufferedIO*/).readAll(); //throw SysError
-+ const std::string buffer = "";
- return trimCpy(buffer);
+- const std::string response = sendHttpPost(Zstr("https://api.freefilesync.org/latest_version"), postParams,
+- ffsUpdateCheckUserAgent, nullptr /*caCertFilePath*/, nullptr /*notifyUnbufferedIO*/).readAll(); //throw SysError
++ const std::string response = "";
+ return trimCpy(response);
}
-@@ -235,13 +235,13 @@
- const std::string onlineVersion = getOnlineVersion(geHttpPostParameters()); //throw SysError
+@@ -233,13 +233,13 @@
+ const std::string onlineVersion = getOnlineVersion(geHttpPostParameters(parent)); //throw SysError
lastOnlineVersion = onlineVersion;
- if (haveNewerVersionOnline(onlineVersion))
-- showUpdateAvailableDialog(parent, onlineVersion);
+- showUpdateAvailableDialog(&parent, onlineVersion);
- else
+ //if (haveNewerVersionOnline(onlineVersion))
-+ // showUpdateAvailableDialog(parent, onlineVersion);
++ // showUpdateAvailableDialog(&parent, onlineVersion);
+ //else
- showNotificationDialog(parent, DialogInfoType::info, PopupDialogCfg().
- setIcon(getResourceImage(L"update_check")).
+ showNotificationDialog(&parent, DialogInfoType::info, PopupDialogCfg().
+ setIcon(loadImage("update_check")).
setTitle(_("Check for Program Updates")).
- setMainInstructions(_("FreeFileSync is up to date.")));
+ setMainInstructions(_("Use your package manager for any updates to FreeFileSync.")));
}
- catch (const zen::SysError& e)
+ catch (const SysError& e)
{
diff --git a/freefilesync/debian/patches/ffs_no_wx311.patch b/freefilesync/debian/patches/ffs_no_wx311.patch
index e6069d4..22d8260 100644
--- a/freefilesync/debian/patches/ffs_no_wx311.patch
+++ b/freefilesync/debian/patches/ffs_no_wx311.patch
@@ -1,13 +1,22 @@
2019-08-15 just compile.
-diff -Naur -x '*.orig' -x '*.rej' 10.3-0/FreeFileSync/Source/ui/small_dlgs.cpp 10.3-2/FreeFileSync/Source/ui/small_dlgs.cpp
---- 10.3-0/FreeFileSync/Source/ui/small_dlgs.cpp 2018-08-07 05:03:34.000000000 -0400
-+++ 10.3-2/FreeFileSync/Source/ui/small_dlgs.cpp 2018-08-08 19:16:54.026727623 -0400
-@@ -984,7 +984,8 @@
+diff -Naur 10.25-0/FreeFileSync/Source/ui/small_dlgs.cpp 10.25-1/FreeFileSync/Source/ui/small_dlgs.cpp
+--- 10.25-0/FreeFileSync/Source/ui/small_dlgs.cpp 2020-06-19 16:17:15.000000000 -0400
++++ 11.0-1/FreeFileSync/Source/ui/small_dlgs.cpp 2020-07-22 11:39:25.820068366 -0400
+@@ -293,7 +293,8 @@
+ {
+ showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString()));
+ }
+- m_listBoxGdriveUsers->Append(gdriveAccounts);
++ for (const wxString& item : gdriveAccounts) // reverted to pre-wx 3.1.1 logic
++ m_listBoxGdriveUsers->Append(item);
+
+ //set default values for Google Drive: use first item of m_listBoxGdriveUsers
+ if (!gdriveAccounts.empty() && !acceptsItemPathPhraseGdrive(folderPathPhrase))
+@@ -1682,7 +1683,7 @@
//setMainInstructionFont(*m_staticTextMain);
- m_bitmapActivation->SetBitmap(getResourceImage(L"website"));
+ m_bitmapActivation->SetBitmap(loadImage("internet"));
- m_textCtrlOfflineActivationKey->ForceUpper();
-+ // Fedora 27 does not have wxWidgets 3.1.1 yet. https://github.com/wxWidgets/wxWidgets/commit/69b66e9e2e2b8e49e3816acdde079686ce9b0da1
+ //m_textCtrlOfflineActivationKey->ForceUpper();
m_textCtrlLastError ->ChangeValue(lastErrorMsg);
@@ -26,47 +35,43 @@ diff -Naur -x '*.orig' -x '*.rej' 10.3-0/wx+/grid.cpp 10.3-2/wx+/grid.cpp
toScroll += scrollSpeed * deltaSecs;
}
else
-diff -Naur 10.13-0/FreeFileSync/Source/base/ffs_paths.cpp 10.13-1/FreeFileSync/Source/base/ffs_paths.cpp
---- 10.13-0/FreeFileSync/Source/base/ffs_paths.cpp 2019-06-14 20:23:07.615661499 -0400
-+++ 10.13-1/FreeFileSync/Source/base/ffs_paths.cpp 2019-06-14 20:26:56.794422701 -0400
-@@ -75,8 +75,9 @@
- Zstring cfgFolderPath;
- //OS standard path (XDG layout): ~/.config/FreeFileSync
- //wxBug: wxStandardPaths::GetUserDataDir() does not honor FileLayout_XDG flag
-- wxStandardPaths::Get().SetFileLayout(wxStandardPaths::FileLayout_XDG);
-- cfgFolderPath = appendSeparator(utfTo<Zstring>(wxStandardPaths::Get().GetUserConfigDir())) + "FreeFileSync";
-+ // Fedora does not have wxGTK 3.1.1 which is the dev branch.
-+ //wxStandardPaths::Get().SetFileLayout(wxStandardPaths::FileLayout_XDG);
-+ cfgFolderPath = appendSeparator(utfTo<Zstring>(wxStandardPaths::Get().GetUserConfigDir())) + appendSeparator(utfTo<Zstring>(".config")) + "FreeFileSync";
+diff -Naur 10.13-0/FreeFileSync/Source/ffs_paths.cpp 10.13-1/FreeFileSync/Source/ffs_paths.cpp
+--- 10.13-0/FreeFileSync/Source/ffs_paths.cpp 2019-06-14 20:23:07.615661499 -0400
++++ 10.18-1/FreeFileSync/Source/ffs_paths.cpp 2019-11-20 08:55:38.553446634 -0500
+@@ -80,8 +80,8 @@
+
+ //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";
++ // Many distros do not have wxGTK 3.1.1 which is the dev branch.
++ const Zstring cfgFolderPath = appendSeparator(utfTo<Zstring>(wxStandardPaths::Get().GetUserConfigDir())) + appendSeparator(utfTo<Zstring>(".config")) + "FreeFileSync";
+ try //create the config folder if not existing + create "Logs" subfolder while we're at it
+ {
+diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/FreeFileSync/Source/ui/command_box.cpp 10.24-1/FreeFileSync/Source/ui/command_box.cpp
+--- 10.24-0/FreeFileSync/Source/ui/command_box.cpp 2020-05-17 11:01:12.893890567 -0400
++++ 10.24-1/FreeFileSync/Source/ui/command_box.cpp 2020-05-17 11:22:18.069114993 -0400
+@@ -120,7 +120,8 @@
- std::call_once(onceFlagCreateCfgPath, [&]
-diff --git a/FreeFileSync/Source/ui/command_box.cpp b/FreeFileSync/Source/ui/command_box.cpp
-index 6e769bb..ce6110b 100644
---- a/FreeFileSync/Source/ui/command_box.cpp
-+++ b/FreeFileSync/Source/ui/command_box.cpp
-@@ -130,7 +130,9 @@ void CommandBox::setValueAndUpdateList(const wxString& value)
-
//this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!!
wxItemContainer::Clear(); //suffices to clear the selection items only!
-- this->Append(items);
-+ for (const wxString& item : items)
+- this->Append(items); //expensive as fuck! => only call when absolutely needed!
++ for (const wxString& item : items) // reverted to pre-wx 3.1.1 logic
+ this->Append(item);
-+
-
+
//this->SetSelection(wxNOT_FOUND); //don't select anything
ChangeValue(value); //preserve main text!
-diff --git a/FreeFileSync/Source/ui/folder_history_box.cpp b/FreeFileSync/Source/ui/folder_history_box.cpp
-index 2b824b1..a17ea2f 100644
---- a/FreeFileSync/Source/ui/folder_history_box.cpp
-+++ b/FreeFileSync/Source/ui/folder_history_box.cpp
-@@ -90,7 +90,8 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& folderPathPhrase)
-
+diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/FreeFileSync/Source/ui/folder_history_box.cpp 10.24-1/FreeFileSync/Source/ui/folder_history_box.cpp
+--- 10.24-0/FreeFileSync/Source/ui/folder_history_box.cpp 2020-05-17 11:01:12.909890709 -0400
++++ 10.24-1/FreeFileSync/Source/ui/folder_history_box.cpp 2020-05-17 11:21:18.460583251 -0400
+@@ -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(dirList);
-+ for (const wxString& dir : dirList)
-+ this->Append(dir);
-
+- this->Append(items); //expensive as fuck! => only call when absolutely needed!
++ for (const wxString& itemk : items) // reverted to pre-wx 3.1.1 logic
++ this->Append(itemk);
+
//this->SetSelection(wxNOT_FOUND); //don't select anything
ChangeValue(folderPathPhrase); //preserve main text!
diff --git a/freefilesync/debian/patches/ffs_sftp.patch b/freefilesync/debian/patches/ffs_sftp.patch
index c30b09c..09e6655 100644
--- a/freefilesync/debian/patches/ffs_sftp.patch
+++ b/freefilesync/debian/patches/ffs_sftp.patch
@@ -3,20 +3,21 @@ Author: B Stack
Message: The upstream author observed that some of the values he uses are not in the libssh2 public headers. I don't know where he uses them from, but I had to replace them here to get this to compile.
Date: 2019-02-11T12:15:59Z
https://github.com/libssh2/libssh2/issues/90
-diff -x '*.orig' -x '*.swp' -x '*.rej' -Naur 10.9-0/FreeFileSync/Source/afs/sftp.cpp 10.9-1/FreeFileSync/Source/afs/sftp.cpp
---- 10.9-0/FreeFileSync/Source/afs/sftp.cpp 2019-02-10 16:42:29.139040980 -0500
-+++ 10.9-1/FreeFileSync/Source/afs/sftp.cpp 2019-02-10 21:28:00.030732089 -0500
-@@ -56,9 +56,10 @@
-
+diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/FreeFileSync/Source/afs/sftp.cpp 10.24-1/FreeFileSync/Source/afs/sftp.cpp
+--- 10.24-0/FreeFileSync/Source/afs/sftp.cpp 2020-05-17 11:01:12.821889929 -0400
++++ 10.24-1/FreeFileSync/Source/afs/sftp.cpp 2020-05-17 11:37:50.229446467 -0400
+@@ -63,10 +63,10 @@
+ LIBSSH2_SFTP_S_IROTH | LIBSSH2_SFTP_S_IXOTH;
+
//attention: if operation fails due to time out, e.g. file copy, the cleanup code may hang, too => total delay = 2 x time out interval
-
--const size_t SFTP_OPTIMAL_BLOCK_SIZE_READ = 4 * MAX_SFTP_READ_SIZE; //https://github.com/libssh2/libssh2/issues/90
--const size_t SFTP_OPTIMAL_BLOCK_SIZE_WRITE = 4 * MAX_SFTP_OUTGOING_SIZE; //
+-
+-const size_t SFTP_OPTIMAL_BLOCK_SIZE_READ = 8 * MAX_SFTP_READ_SIZE; //https://github.com/libssh2/libssh2/issues/90
+-const size_t SFTP_OPTIMAL_BLOCK_SIZE_WRITE = 8 * MAX_SFTP_OUTGOING_SIZE; //
-static_assert(MAX_SFTP_READ_SIZE == 30000 && MAX_SFTP_OUTGOING_SIZE == 30000, "reevaluate optimal block sizes if these constants change!");
+// these values are all manually derived from https://github.com/libssh2/libssh2/blob/master/src/sftp.h which for some weak reason are not included in the libssh2-devel headers.
-+const size_t SFTP_OPTIMAL_BLOCK_SIZE_READ = 4 * 30000; //https://github.com/libssh2/libssh2/issues/90
-+const size_t SFTP_OPTIMAL_BLOCK_SIZE_WRITE = 4 * 30000; //
++const size_t SFTP_OPTIMAL_BLOCK_SIZE_READ = 8 * 30000; //https://github.com/libssh2/libssh2/issues/90
++const size_t SFTP_OPTIMAL_BLOCK_SIZE_WRITE = 8 * 30000; //
+//static_assert(MAX_SFTP_READ_SIZE == 30000 && MAX_SFTP_OUTGOING_SIZE == 30000, "reevaluate optimal block sizes if these constants change!");
- /*
- Perf Test, Sourceforge frs, SFTP upload, compressed 25 MB test file:
-
+
+ /* Perf Test, Sourceforge frs, SFTP upload, compressed 25 MB test file:
+
diff --git a/freefilesync/debian/patches/ffs_traditional_view.patch b/freefilesync/debian/patches/ffs_traditional_view.patch
new file mode 100644
index 0000000..e602033
--- /dev/null
+++ b/freefilesync/debian/patches/ffs_traditional_view.patch
@@ -0,0 +1,275 @@
+diff --git a/FreeFileSync/Source/ui/file_grid.cpp b/FreeFileSync/Source/ui/file_grid.cpp
+index 4ee72b97..d9b9a4c7 100644
+--- a/FreeFileSync/Source/ui/file_grid.cpp
++++ b/FreeFileSync/Source/ui/file_grid.cpp
+@@ -437,6 +437,7 @@ private:
+ case ItemPathFormat::relative:
+ return utfTo<std::wstring>(fsObj->getRelativePath<side>());
+ case ItemPathFormat::full:
++ case ItemPathFormat::traditional:
+ return AFS::getDisplayPath(fsObj->getAbstractPath<side>());
+ }
+ assert(false);
+@@ -615,6 +616,16 @@ private:
+ else //=> BaseFolderPair
+ groupParentFolder = AFS::getDisplayPath(pdi.fsObj->base().getAbstractPath<side>());
+ break;
++ case ItemPathFormat::traditional:
++ if (auto groupFolder = dynamic_cast<const FolderPair*>(pdi.folderGroupObj))
++ {
++ groupName = utfTo<std::wstring>(groupFolder->template getItemName<side>());
++ groupParentFolder = AFS::getDisplayPath(groupFolder->parent().template getAbstractPath<side>()) + \
++ FILE_NAME_SEPARATOR + utfTo<std::wstring>(groupFolder->template getItemName<side>());
++ }
++ else //=> BaseFolderPair
++ groupParentFolder = AFS::getDisplayPath(pdi.fsObj->base().getAbstractPath<side>());
++ break;
+ }
+ //add slashes for better readability
+ assert(!contains(groupParentFolder, L'/') || !contains(groupParentFolder, L'\\'));
+@@ -650,72 +661,84 @@ private:
+ int widthGroupName = groupName .empty() ? 0 : ((iconMgr ? iconSize + gridGap_ : 0) + getTextExtentBuffered(dc, groupName).x + (iconMgr ? gridGap_ : 0));
+ int widthGroupItems = (iconMgr ? iconSize + gridGap_ : 0) + groupItemNamesWidth;
+
+- //not enough space? => collapse
+- if (int excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth;
+- excessWidth > 0)
++ switch (itemPathFormat_)
+ {
+- if (multiItemGroup && !groupParentFolder.empty() && !groupName.empty())
+- {
+- //1. render group components on two rows
+- stackedGroupRender = true;
+-
+- if (!endsWith(groupParentFolder, L'/' ) &&
+- !endsWith(groupParentFolder, L'\\'))
+- groupParentFolder += groupParentSep;
+- groupParentFolder += ELLIPSIS;
+-
+- widthGroupParent = getTextExtentBuffered(dc, groupParentFolder).x + gridGap_;
+-
+- int widthGroupStack = std::max(widthGroupParent, widthGroupName);
+- excessWidth = gridGap_ + widthGroupStack + widthGroupItems - maxWidth;
+-
+- if (excessWidth > 0)
+- {
+- //2. shrink group stack (group parent only)
+- if (widthGroupParent > widthGroupName)
+- {
+- widthGroupStack = widthGroupParent = std::max(widthGroupParent - excessWidth, widthGroupName);
+- excessWidth = gridGap_ + widthGroupStack + widthGroupItems - maxWidth;
+- }
+- if (excessWidth > 0)
+- {
+- //3. shrink item rendering
+- widthGroupItems = std::max(widthGroupItems - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth);
+- excessWidth = gridGap_ + widthGroupStack + widthGroupItems - maxWidth;
+-
+- if (excessWidth > 0)
+- {
+- //4. shrink group stack
+- widthGroupStack = std::max(widthGroupStack - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth + (iconMgr ? gridGap_ : 0));
+-
+- widthGroupParent = std::min(widthGroupParent, widthGroupStack);
+- widthGroupName = std::min(widthGroupName, widthGroupStack);
+- }
+- }
+- }
+- }
+- else //group details on single row
+- {
+- //1. shrink group parent
+- if (!groupParentFolder.empty())
+- {
+- widthGroupParent = std::max(widthGroupParent - excessWidth, ellipsisWidth + (iconMgr ? gridGap_ : 0));
+- excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth;
+- }
+- if (excessWidth > 0)
+- {
+- //2. shrink item rendering
+- widthGroupItems = std::max(widthGroupItems - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth);
+- excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth;
+-
+- if (excessWidth > 0)
+- //3. shrink group name
+- if (!groupName.empty())
+- widthGroupName = std::max(widthGroupName - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth + (iconMgr ? gridGap_ : 0));
+- }
+- }
++ case ItemPathFormat::traditional:
++ //widthGroupName = 0;
++ widthGroupParent -= widthGroupName ;
++ break;
++ case ItemPathFormat::name:
++ case ItemPathFormat::relative:
++ case ItemPathFormat::full:
++ default:
++ // the insane logic of the new views
++ //not enough space? => collapse
++ if (int excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth;
++ excessWidth > 0)
++ {
++ if (multiItemGroup && !groupParentFolder.empty() && !groupName.empty())
++ {
++ //1. render group components on two rows
++ stackedGroupRender = true;
++
++ if (!endsWith(groupParentFolder, L'/' ) &&
++ !endsWith(groupParentFolder, L'\\'))
++ groupParentFolder += groupParentSep;
++ groupParentFolder += ELLIPSIS;
++
++ widthGroupParent = getTextExtentBuffered(dc, groupParentFolder).x + gridGap_;
++
++ int widthGroupStack = std::max(widthGroupParent, widthGroupName);
++ excessWidth = gridGap_ + widthGroupStack + widthGroupItems - maxWidth;
++
++ if (excessWidth > 0)
++ {
++ //2. shrink group stack (group parent only)
++ if (widthGroupParent > widthGroupName)
++ {
++ widthGroupStack = widthGroupParent = std::max(widthGroupParent - excessWidth, widthGroupName);
++ excessWidth = gridGap_ + widthGroupStack + widthGroupItems - maxWidth;
++ }
++ if (excessWidth > 0)
++ {
++ //3. shrink item rendering
++ widthGroupItems = std::max(widthGroupItems - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth);
++ excessWidth = gridGap_ + widthGroupStack + widthGroupItems - maxWidth;
++
++ if (excessWidth > 0)
++ {
++ //4. shrink group stack
++ widthGroupStack = std::max(widthGroupStack - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth + (iconMgr ? gridGap_ : 0));
++
++ widthGroupParent = std::min(widthGroupParent, widthGroupStack);
++ widthGroupName = std::min(widthGroupName, widthGroupStack);
++ }
++ }
++ }
++ }
++ else //group details on single row
++ {
++ //1. shrink group parent
++ if (!groupParentFolder.empty())
++ {
++ widthGroupParent = std::max(widthGroupParent - excessWidth, ellipsisWidth + (iconMgr ? gridGap_ : 0));
++ excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth;
++ }
++ if (excessWidth > 0)
++ {
++ //2. shrink item rendering
++ widthGroupItems = std::max(widthGroupItems - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth);
++ excessWidth = gridGap_ + widthGroupParent + widthGroupName + widthGroupItems - maxWidth;
++
++ if (excessWidth > 0)
++ //3. shrink group name
++ if (!groupName.empty())
++ widthGroupName = std::max(widthGroupName - excessWidth, (iconMgr ? iconSize + gridGap_ : 0) + ellipsisWidth + (iconMgr ? gridGap_ : 0));
++ }
++ }
++ }
++ break;
+ }
+-
+ return
+ {
+ itemName,
+@@ -786,6 +809,9 @@ private:
+ rectGroup = rectGroupParent = rectGroupName = rectTmp;
+
+ rectGroupParent.width = widthGroupParent;
++ // re-add back the width of groupname so that the directory name is clickable
++ if (itemPathFormat_ == ItemPathFormat::traditional)
++ rectGroupParent.width += widthGroupName;
+ rectGroupName .width = widthGroupName;
+
+ if (stackedGroupRender)
+@@ -837,7 +863,7 @@ private:
+ dc.GradientFillLinear(rectNav, getColorSelectionGradientFrom(), backCol, wxEAST);
+ }
+
+- if (!groupName.empty() && row == groupBeginRow)
++ if (!(itemPathFormat_ == ItemPathFormat::traditional) && !groupName.empty() && row == groupBeginRow)
+ {
+ wxDCTextColourChanger textColorGroupName(dc);
+ if (static_cast<HoverAreaGroup>(rowHover) == HoverAreaGroup::groupName)
+@@ -855,9 +881,9 @@ private:
+ drawCellText(dc, rectGroupName, groupName, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupName));
+ }
+
+- if (!groupParentFolder.empty() &&
++ if (itemPathFormat_ == ItemPathFormat::traditional || (!groupParentFolder.empty() &&
+ ((stackedGroupRender && row == groupBeginRow + 1) ||
+- (!stackedGroupRender && row == groupBeginRow)))
++ (!stackedGroupRender && row == groupBeginRow))))
+ {
+ drawCellText(dc, rectGroupParent, groupParentFolder, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, &getTextExtentBuffered(dc, groupParentFolder));
+ }
+@@ -1020,6 +1046,8 @@ private:
+ return _("Relative path");
+ case ItemPathFormat::full:
+ return _("Full path");
++ case ItemPathFormat::traditional:
++ return _("Traditional");
+ }
+ assert(false);
+ break;
+diff --git a/FreeFileSync/Source/ui/file_grid_attr.h b/FreeFileSync/Source/ui/file_grid_attr.h
+index 324619c1..7511a1ab 100644
+--- a/FreeFileSync/Source/ui/file_grid_attr.h
++++ b/FreeFileSync/Source/ui/file_grid_attr.h
+@@ -79,6 +79,7 @@ enum class ItemPathFormat
+ name,
+ relative,
+ full,
++ traditional,
+ };
+
+ const ItemPathFormat defaultItemPathFormatLeftGrid = ItemPathFormat::relative;
+diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp
+index 491b7321..2d5c20c3 100644
+--- a/FreeFileSync/Source/ui/main_dlg.cpp
++++ b/FreeFileSync/Source/ui/main_dlg.cpp
+@@ -2716,6 +2716,7 @@ void MainDialog::onGridLabelContextRim(bool leftSide)
+ addFormatEntry(_("Item name" ), ItemPathFormat::name);
+ addFormatEntry(_("Relative path"), ItemPathFormat::relative);
+ addFormatEntry(_("Full path" ), ItemPathFormat::full);
++ addFormatEntry(_("Traditional" ), ItemPathFormat::traditional);
+
+ //----------------------------------------------------------------------------------------------
+ menu.addSeparator();
+diff -x .git -Naur 11.1-1/FreeFileSync/Source/config.cpp 11.1-2/FreeFileSync/Source/config.cpp
+--- 11.1-1/FreeFileSync/Source/config.cpp 2020-09-01 19:07:43.715122167 -0400
++++ 11.1-2/FreeFileSync/Source/config.cpp 2020-09-10 09:38:14.539542699 -0400
+@@ -528,6 +528,9 @@
+ case ItemPathFormat::full:
+ output = "Full";
+ break;
++ case ItemPathFormat::traditional:
++ output = "Traditional";
++ break;
+ }
+ }
+
+@@ -541,6 +545,8 @@
+ value = ItemPathFormat::relative;
+ else if (tmp == "Full")
+ value = ItemPathFormat::full;
++ else if (tmp == "Traditional")
++ value = ItemPathFormat::traditional;
+ else
+ return false;
+ return true;
+diff -x .git -Naur 11.1-1/FreeFileSync/Source/ui/file_view.cpp 11.1-2/FreeFileSync/Source/ui/file_view.cpp
+--- 11.1-1/FreeFileSync/Source/ui/file_view.cpp 2020-09-01 19:07:43.719122215 -0400
++++ 11.1-2/FreeFileSync/Source/ui/file_view.cpp 2020-09-10 09:40:11.609044834 -0400
+@@ -798,6 +798,7 @@
+ break;
+
+ case ItemPathFormat::full:
++ case ItemPathFormat::traditional:
+ if ( ascending && onLeft) std::sort(sortedRef_.begin(), sortedRef_.end(), LessFullPath<true, LEFT_SIDE>(folderPairs_));
+ else if ( ascending && !onLeft) std::sort(sortedRef_.begin(), sortedRef_.end(), LessFullPath<true, RIGHT_SIDE>(folderPairs_));
+ else if (!ascending && onLeft) std::sort(sortedRef_.begin(), sortedRef_.end(), LessFullPath<false, LEFT_SIDE>(folderPairs_));
diff --git a/freefilesync/debian/patches/revert_zenju_aggressive_upstreamisms.patch b/freefilesync/debian/patches/revert_zenju_aggressive_upstreamisms.patch
new file mode 100644
index 0000000..12a1b43
--- /dev/null
+++ b/freefilesync/debian/patches/revert_zenju_aggressive_upstreamisms.patch
@@ -0,0 +1,314 @@
+diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/wx+/choice_enum.h 10.24-1/wx+/choice_enum.h
+--- 10.24-0/wx+/choice_enum.h 2020-05-17 18:30:59.441499418 -0400
++++ 10.24-1/wx+/choice_enum.h 2020-05-17 18:53:59.893685507 -0400
+@@ -7,7 +7,6 @@
+ #ifndef CHOICE_ENUM_H_132413545345687
+ #define CHOICE_ENUM_H_132413545345687
+
+-#include <unordered_map>
+ #include <vector>
+ #include <wx/choice.h>
+
+@@ -44,11 +43,8 @@
+ descrList.push_back({ value, { text, tooltip } });
+ return *this;
+ }
+-
+ using DescrList = std::vector<std::pair<Enum, std::pair<wxString, wxString>>>;
+ DescrList descrList;
+-
+- std::unordered_map<const wxChoice*, std::vector<wxString>> itemsSetLast;
+ };
+ template <class Enum> void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value);
+ template <class Enum> Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl);
+@@ -69,34 +65,26 @@
+
+ //--------------- impelementation -------------------------------------------
+ template <class Enum>
+-void setEnumVal(EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value)
++void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value)
+ {
+- auto& itemsSetLast = mapping.itemsSetLast[&ctrl];
++ ctrl.Clear();
+
+- std::vector<wxString> items;
++ int selectedPos = 0;
+ for (auto it = mapping.descrList.begin(); it != mapping.descrList.end(); ++it)
+- items.push_back(it->second.first);
+-
+- if (items != itemsSetLast)
+ {
+- ctrl.Set(items); //expensive as fuck! => only call when absolutely needed!
+- itemsSetLast = std::move(items);
++ ctrl.Append(it->second.first);
++ if (it->first == value)
++ {
++ selectedPos = it - mapping.descrList.begin();
++
++ if (it->second.second.empty())
++ ctrl.UnsetToolTip();
++ else
++ ctrl.SetToolTip(it->second.second);
++ }
+ }
+- //-----------------------------------------------------------------
+-
+- const auto it = std::find_if(mapping.descrList.begin(), mapping.descrList.end(), [&](const auto& mapItem) { return mapItem.first == value; });
+- if (it != mapping.descrList.end())
+- {
+- if (const wxString& tooltip = it->second.second;
+- !tooltip.empty())
+- ctrl.SetToolTip(tooltip);
+- else
+- ctrl.UnsetToolTip();
+
+- const int selectedPos = it - mapping.descrList.begin();
+- ctrl.SetSelection(selectedPos);
+- }
+- else assert(false);
++ ctrl.SetSelection(selectedPos);
+ }
+
+ template <class Enum>
+@@ -115,17 +103,11 @@
+
+ template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl)
+ {
+- const int selectedPos = ctrl.GetSelection();
++ const Enum currentValue = getEnumVal(mapping, ctrl);
+
+- if (0 <= selectedPos && selectedPos < std::ssize(mapping.descrList))
+- {
+- if (const auto& [text, tooltip] = mapping.descrList[selectedPos].second;
+- !tooltip.empty())
+- ctrl.SetToolTip(tooltip);
+- else
+- ctrl.UnsetToolTip();
+- }
+- else assert(false);
++ for (const auto& [enumValue, textAndTooltip] : mapping.descrList)
++ if (currentValue == enumValue)
++ ctrl.SetToolTip(textAndTooltip.second);
+ }
+ }
+
+
+Version: 11.1
+Message: this one is really just a fix of Zenju's sloppy Makefile. He'll figure it out on his own for v11.2. If I tell him now, he'll replace the source tarball for 11.1 which will mess up everyone's checksums.
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/FreeFileSync/Source/Makefile 11.1-2/FreeFileSync/Source/Makefile
+--- 11.1-1/FreeFileSync/Source/Makefile 2020-09-01 20:07:26.751011466 -0400
++++ 11.1-2/FreeFileSync/Source/Makefile 2020-09-01 20:17:31.030611773 -0400
+@@ -95,6 +95,7 @@
+ cppFiles+=../../zen/shutdown.cpp
+ cppFiles+=../../zen/sys_error.cpp
+ cppFiles+=../../zen/sys_info.cpp
++cppFiles+=../../zen/sys_version.cpp
+ cppFiles+=../../zen/thread.cpp
+ cppFiles+=../../zen/zlib_wrap.cpp
+ cppFiles+=../../wx+/file_drop.cpp
+Message: Now have to revert wxWidgets 3.1.4 upstreamisms
+cd 11.1-0 ; git diff HEAD~1 -- $( grep -l -rIE 'wxASCII_STR' ) > ~/foo1 ; ( cd ../11.1-2 ; vi ~/foo1 $( grep -l -rIE 'wxASCII_STR' ) ; )
+cd 11.1-0 ; git diff HEAD~1 -- $( grep -l -rIE 'wxDD_SHOW_HIDDEN' ) > ~/foo1 ; ( cd ../11.1-2 ; vi ~/foo1 $( grep -l -rIE 'wxDD_SHOW_HIDDEN' ) ; )
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp 11.1-2/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp
+--- 11.1-1/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp 2020-09-01 19:07:43.703122022 -0400
++++ 11.1-2/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp 2020-09-01 20:13:16.679447647 -0400
+@@ -145,7 +145,7 @@
+ }
+
+ Zstring newFolderPath;
+- wxDirDialog dirPicker(parent_, _("Select a folder"), utfTo<wxString>(defaultFolderPath), wxDD_DEFAULT_STYLE | wxDD_SHOW_HIDDEN);
++ wxDirDialog dirPicker(parent_, _("Select a folder"), utfTo<wxString>(defaultFolderPath)); //put modal wxWidgets dialogs on stack: creating on freestore leads to memleak!
+ if (dirPicker.ShowModal() != wxID_OK)
+ return;
+ newFolderPath = utfTo<Zstring>(dirPicker.GetPath());
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/FreeFileSync/Source/ui/command_box.h 11.1-2/FreeFileSync/Source/ui/command_box.h
+--- 11.1-1/FreeFileSync/Source/ui/command_box.h 2020-09-01 19:07:43.719122215 -0400
++++ 11.1-2/FreeFileSync/Source/ui/command_box.h 2020-09-01 20:09:56.840929352 -0400
+@@ -30,7 +30,7 @@
+ const wxString choices[] = nullptr,
+ long style = 0,
+ const wxValidator& validator = wxDefaultValidator,
+- const wxString& name = wxASCII_STR(wxComboBoxNameStr));
++ const wxString& name = wxComboBoxNameStr);
+
+ void setHistory(const std::vector<Zstring>& history, size_t historyMax) { history_ = history; historyMax_ = historyMax; }
+ std::vector<Zstring> getHistory() const { return history_; }
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/FreeFileSync/Source/ui/folder_history_box.h 11.1-2/FreeFileSync/Source/ui/folder_history_box.h
+--- 11.1-1/FreeFileSync/Source/ui/folder_history_box.h 2020-09-01 19:07:43.719122215 -0400
++++ 11.1-2/FreeFileSync/Source/ui/folder_history_box.h 2020-09-01 20:09:50.624849989 -0400
+@@ -68,7 +68,7 @@
+ const wxString choices[] = nullptr,
+ long style = 0,
+ const wxValidator& validator = wxDefaultValidator,
+- const wxString& name = wxASCII_STR(wxComboBoxNameStr));
++ const wxString& name = wxComboBoxNameStr);
+
+ void setHistory(std::shared_ptr<HistoryList> sharedHistory) { sharedHistory_ = std::move(sharedHistory); }
+ std::shared_ptr<HistoryList> getHistory() { return sharedHistory_; }
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/FreeFileSync/Source/ui/folder_selector.cpp 11.1-2/FreeFileSync/Source/ui/folder_selector.cpp
+--- 11.1-1/FreeFileSync/Source/ui/folder_selector.cpp 2020-09-01 20:07:25.907000676 -0400
++++ 11.1-2/FreeFileSync/Source/ui/folder_selector.cpp 2020-09-01 20:13:48.791852316 -0400
+@@ -227,9 +227,10 @@
+ }
+
+ Zstring shellItemPath;
+- wxDirDialog dirPicker(parent_, _("Select a folder"), utfTo<wxString>(defaultFolderPath), wxDD_DEFAULT_STYLE | wxDD_SHOW_HIDDEN);
+- //GTK2: "Show hidden" is also available as a context menu option in the folder picker!
+- //It looks like wxDD_SHOW_HIDDEN only sets the default when opening for the first time!?
++ wxDirDialog dirPicker(parent_, _("Select a folder"), utfTo<wxString>(defaultFolderPath)); //put modal wxWidgets dialogs on stack: creating on freestore leads to memleak!
++
++ //-> following doesn't seem to do anything at all! still "Show hidden" is available as a context menu option:
++ //::gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dirPicker.m_widget), true /*show_hidden*/);
+
+ if (dirPicker.ShowModal() != wxID_OK)
+ return;
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/wx+/bitmap_button.h 11.1-2/wx+/bitmap_button.h
+--- 11.1-1/wx+/bitmap_button.h 2020-09-01 19:07:43.727122311 -0400
++++ 11.1-2/wx+/bitmap_button.h 2020-09-01 20:10:31.385364671 -0400
+@@ -26,7 +26,7 @@
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxValidator& validator = wxDefaultValidator,
+- const wxString& name = wxASCII_STR(wxButtonNameStr)) :
++ const wxString& name = wxButtonNameStr) :
+ wxBitmapButton(parent, id, wxNullBitmap, pos, size, style, validator, name)
+ {
+ SetLabel(label);
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/wx+/dc.h 11.1-2/wx+/dc.h
+--- 11.1-1/wx+/dc.h 2020-09-01 19:09:33.652448178 -0400
++++ 11.1-2/wx+/dc.h 2020-09-01 20:08:43.183988180 -0400
+@@ -68,9 +68,6 @@
+ inline
+ int fastFromDIP(int d) //like wxWindow::FromDIP (but tied to primary monitor and buffered)
+ {
+-#ifndef wxHAVE_DPI_INDEPENDENT_PIXELS
+-#error why is wxHAVE_DPI_INDEPENDENT_PIXELS not defined?
+-#endif
+ //GTK2 doesn't properly support high DPI: https://freefilesync.org/forum/viewtopic.php?t=6114
+ //=> requires general fix at wxWidgets-level
+
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/wx+/graph.h 11.1-2/wx+/graph.h
+--- 11.1-1/wx+/graph.h 2020-09-01 19:07:43.731122359 -0400
++++ 11.1-2/wx+/graph.h 2020-09-01 20:10:36.541429649 -0400
+@@ -153,7 +153,7 @@
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL | wxNO_BORDER,
+- const wxString& name = wxASCII_STR(wxPanelNameStr));
++ const wxString& name = wxPanelNameStr);
+
+ class CurveAttributes
+ {
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/wx+/grid.cpp 11.1-2/wx+/grid.cpp
+--- 11.1-1/wx+/grid.cpp 2020-09-01 20:07:24.418981662 -0400
++++ 11.1-2/wx+/grid.cpp 2020-09-01 20:10:23.745268393 -0400
+@@ -268,7 +268,7 @@
+ {
+ public:
+ SubWindow(Grid& parent) :
+- wxWindow(&parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxBORDER_NONE, wxASCII_STR(wxPanelNameStr)),
++ wxWindow(&parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxBORDER_NONE, wxPanelNameStr),
+ parent_(parent)
+ {
+ Bind(wxEVT_PAINT, [this](wxPaintEvent& event) { onPaintEvent(event); });
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/wx+/grid.h 11.1-2/wx+/grid.h
+--- 11.1-1/wx+/grid.h 2020-09-01 19:07:43.731122359 -0400
++++ 11.1-2/wx+/grid.h 2020-09-01 20:10:48.817584344 -0400
+@@ -149,7 +149,7 @@
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL | wxNO_BORDER,
+- const wxString& name = wxASCII_STR(wxPanelNameStr));
++ const wxString& name = wxPanelNameStr);
+
+ size_t getRowCount() const;
+
+diff -x '*.orig' -x '*.rej' -aur 11.1-1/wx+/toggle_button.h 11.1-2/wx+/toggle_button.h
+--- 11.1-1/wx+/toggle_button.h 2020-09-01 19:07:43.731122359 -0400
++++ 11.1-2/wx+/toggle_button.h 2020-09-01 20:10:44.629531569 -0400
+@@ -24,7 +24,7 @@
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxValidator& validator = wxDefaultValidator,
+- const wxString& name = wxASCII_STR(wxButtonNameStr)) :
++ const wxString& name = wxButtonNameStr) :
+ wxBitmapButton(parent, id, bitmap, pos, size, style, validator, name) {}
+
+ //wxButton constructor
+@@ -35,7 +35,7 @@
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxValidator& validator = wxDefaultValidator,
+- const wxString& name = wxASCII_STR(wxButtonNameStr)) :
++ const wxString& name = wxButtonNameStr) :
+ wxBitmapButton(parent, id, wxNullBitmap, pos, size, style, validator, name)
+ {
+ SetLabel(label);
+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/freefilesync/debian/patches/series b/freefilesync/debian/patches/series
index 51b0191..7896b6e 100644
--- a/freefilesync/debian/patches/series
+++ b/freefilesync/debian/patches/series
@@ -1,7 +1,11 @@
ffs_allow_parallel_ops.patch
ffs_devuan.patch
+ffs_devuan_gtk3.patch
ffs_no_check_updates.patch
ffs_no_wx311.patch
ffs_sftp.patch
ffs_libssh2.patch
ffs_curl.patch
+revert_zenju_aggressive_upstreamisms.patch
+ffs_gcc.patch
+ffs_traditional_view.patch
bgstack15