summaryrefslogtreecommitdiff
path: root/freefilesync
diff options
context:
space:
mode:
Diffstat (limited to 'freefilesync')
-rw-r--r--freefilesync/debian/changelog32
-rw-r--r--freefilesync/debian/freefilesync+devuan.dsc2
-rw-r--r--freefilesync/debian/patches/ffs_devuan_gtk3.patch17
-rw-r--r--freefilesync/debian/patches/ffs_no_check_updates.patch40
-rw-r--r--freefilesync/debian/patches/ffs_traditional_view.patch275
-rw-r--r--freefilesync/debian/patches/revert_zenju_aggressive_upstreamisms.patch222
-rw-r--r--freefilesync/debian/patches/series1
7 files changed, 551 insertions, 38 deletions
diff --git a/freefilesync/debian/changelog b/freefilesync/debian/changelog
index 4b1a593..fbdcbf7 100644
--- a/freefilesync/debian/changelog
+++ b/freefilesync/debian/changelog
@@ -1,3 +1,35 @@
+freefilesync (11.1-2+devuan) obs; urgency=low
+
+ * add traditional option to main grid view
+
+ -- Ben Stack <bgstack15@gmail.com> Sun, 06 Sep 2020 20:59:36 -0400
+
+freefilesync (11.1-1+devuan) obs; urgency=low
+
+ * [bgstack15] still has the broken file tree layout
+ * New file group layout on main grid (reloaded)
+ * Alternate colors for main grid folder groups
+ * Added file group context menu
+ * Quick selection of items in folder group
+ * Fixed FTP access errors with Explicit SSL/TLS
+ * Fixed Google Drive error when double quotes in file name
+ * Fixed RTL layout bug with number input control
+ * Fixed grid column default sizes
+ * Fixed grid rendering performance during mouse scrolling
+ * Update all config files transactionally
+ * Respect user-preferred number/time format (Linux)
+ * Fixed floating panels not being resizable (Linux)
+ * Instantly open selection context menu on right mouse button down
+ * Further improved high DPI support
+ * Updated deprecated system API calls (requires macOS 10.10 or later)
+ * Fixed crash when accessing Nexis storage (macOS)
+ * Avoid buffer flush when aborting native file output
+ * Clear preview after folder history selection
+ * Pre-allocate target file without setting size
+ * Unified system error message formatting
+
+ -- Ben Stack <bgstack15@gmail.com> Tue, 01 Sep 2020 20:33:42 -0400
+
freefilesync (11.0-1+devuan) obs; urgency=medium
* Revised file layout on main grid
diff --git a/freefilesync/debian/freefilesync+devuan.dsc b/freefilesync/debian/freefilesync+devuan.dsc
index 32c4ba9..e6a707d 100644
--- a/freefilesync/debian/freefilesync+devuan.dsc
+++ b/freefilesync/debian/freefilesync+devuan.dsc
@@ -2,7 +2,7 @@ Format: 3.0 (quilt)
Source: freefilesync
Binary: freefilesync
Architecture: any
-Version: 11.0-1+devuan
+Version: 11.1-2+devuan
Maintainer: B Stack <bgstack15@gmail.com>
Homepage: https://freefilesync.org/
Standards-Version: 4.1.4
diff --git a/freefilesync/debian/patches/ffs_devuan_gtk3.patch b/freefilesync/debian/patches/ffs_devuan_gtk3.patch
index 16268d1..8a5e83e 100644
--- a/freefilesync/debian/patches/ffs_devuan_gtk3.patch
+++ b/freefilesync/debian/patches/ffs_devuan_gtk3.patch
@@ -1,8 +1,7 @@
Author: B Stack
Source: Original research
-Date: 2020-03-18
-Message: Main patch to compile on Devuan using GTK3. BROKEN for FreeFileSync 10.21!
-This reintroduces the gtk-3 usage, because Debian/Devuan stopped packaging libwxgtk3.0-dev (which used gtk2) and only does libwxgtk3.0-gtk3-dev. However, by reintroducing the gtk3, it brings back the old gtk3 instability from my previous packaging effort: https://freefilesync.org/forum/viewtopic.php?t=4918. /mnt/public/packages/old/freefilesync/freefilesync-9.7-1.master.tgz. Upstream never replied, but did note in the source that gtk3 is inherently unstable.
+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
@@ -35,15 +34,3 @@ diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/FreeFileSync/Source/RealTi
cppFiles=
cppFiles+=application.cpp
-diff -x '*.swp' -x '.git*' -x '*.orig' -x '*.rej' -Naur 10.18-0/wx+/dc.h 10.18-1/wx+/dc.h
---- 10.18-0/wx+/dc.h 2019-11-21 08:24:23.967769384 -0500
-+++ 10.18-1/wx+/dc.h 2019-11-21 09:42:12.779786504 -0500
-@@ -54,7 +54,7 @@
- #ifdef wxHAVE_DPI_INDEPENDENT_PIXELS //pulled from wx/window.h: https://github.com/wxWidgets/wxWidgets/blob/master/include/wx/window.h#L2029
- return d; //e.g. macOS, GTK3
- #else //https://github.com/wxWidgets/wxWidgets/blob/master/src/common/wincmn.cpp#L2865
-- static_assert(GTK_MAJOR_VERSION == 2);
-+ static_assert(GTK_MAJOR_VERSION == 3);
- //GTK2 doesn't properly support high DPI: https://freefilesync.org/forum/viewtopic.php?t=6114
- //=> requires general fix at wxWidgets-level
- assert(wxTheApp); //only call after wxWidgets was initalized!
diff --git a/freefilesync/debian/patches/ffs_no_check_updates.patch b/freefilesync/debian/patches/ffs_no_check_updates.patch
index 62f4e7e..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
-+++ 11.0-1/FreeFileSync/Source/ui/main_dlg.cpp 2020-07-22 11:49:13.747407290 -0400
-@@ -5538,7 +5538,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,7 +10,7 @@ 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..."));
-@@ -5546,6 +5546,7 @@
+@@ -5614,6 +5614,7 @@
automaticUpdateCheckEval(this, globalCfg_.gui.lastUpdateCheck, globalCfg_.gui.lastOnlineVersion,
automaticUpdateCheckRunAsync(automaticUpdateCheckPrepare(*this).get()).get());
}
@@ -18,16 +18,15 @@ diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/main_dlg.cpp 10.14-
}
-@@ -5553,7 +5554,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..."));
-@@ -5567,6 +5568,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
-+++ 11.0-1/FreeFileSync/Source/ui/version_check.cpp 2020-07-22 11:43:36.895201090 -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;
-@@ -159,8 +161,7 @@
+@@ -155,8 +157,7 @@
{
try
{
@@ -56,8 +55,8 @@ 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()); }
-@@ -189,8 +190,7 @@
+ 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
{
@@ -67,7 +66,7 @@ diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/version_check.cpp 1
return trimCpy(response);
}
-@@ -237,13 +237,13 @@
+@@ -233,13 +233,13 @@
const std::string onlineVersion = getOnlineVersion(geHttpPostParameters(parent)); //throw SysError
lastOnlineVersion = onlineVersion;
@@ -83,6 +82,5 @@ diff --exclude '*.orig' -Naur 10.14-0/FreeFileSync/Source/ui/version_check.cpp 1
- 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_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
index 8ca60c2..12a1b43 100644
--- a/freefilesync/debian/patches/revert_zenju_aggressive_upstreamisms.patch
+++ b/freefilesync/debian/patches/revert_zenju_aggressive_upstreamisms.patch
@@ -77,7 +77,7 @@ diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/wx+/choice_enum.h 10.24-1/
- const int selectedPos = ctrl.GetSelection();
+ const Enum currentValue = getEnumVal(mapping, ctrl);
-- if (0 <= selectedPos && selectedPos < static_cast<int>(mapping.descrList.size()))
+- if (0 <= selectedPos && selectedPos < std::ssize(mapping.descrList))
- {
- if (const auto& [text, tooltip] = mapping.descrList[selectedPos].second;
- !tooltip.empty())
@@ -92,3 +92,223 @@ diff -x '*.rej' -x '*.orig' -x '*.git*' -Naur 10.24-0/wx+/choice_enum.h 10.24-1/
}
}
+
+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 7ce7a97..7896b6e 100644
--- a/freefilesync/debian/patches/series
+++ b/freefilesync/debian/patches/series
@@ -8,3 +8,4 @@ ffs_libssh2.patch
ffs_curl.patch
revert_zenju_aggressive_upstreamisms.patch
ffs_gcc.patch
+ffs_traditional_view.patch
bgstack15