Compare commits

..

No commits in common. "rawhide" and "f30" have entirely different histories.

5 changed files with 290 additions and 134 deletions

4
.gitignore vendored
View file

@ -1 +1,3 @@
/4pane-*.tar.gz
/4pane-3.0.tar.gz
/4pane-4.0.tar.gz
/4pane-5.0.tar.gz

View file

@ -0,0 +1,267 @@
diff --git a/MyFiles.cpp b/MyFiles.cpp
index fdd6b50..fa088eb 100644
--- a/MyFiles.cpp
+++ b/MyFiles.cpp
@@ -249,6 +249,7 @@ CreateAcceleratorTable(); // Make a new one, w
void FileGenericDirCtrl::DoSize()
{
int w, h; GetClientSize(&w, &h);
+if (w==0 || h==0) return; // Not yet ready for sizing
GetTreeCtrl()->SetSize(0, HEADER_HEIGHT + 1, w, h - HEADER_HEIGHT - 1); // Set the treectrl 'body' size
headerwindow->SetSize(0, 0, w, HEADER_HEIGHT); // Set the header-window size
diff --git a/MyFrame.cpp b/MyFrame.cpp
index 889feb4..074572c 100644
--- a/MyFrame.cpp
+++ b/MyFrame.cpp
@@ -619,6 +619,15 @@ Connect(wxID_ANY, PasteThreadType, PasteThreadEventHandler(MyFrame::OnPasteThrea
#if defined __WXX11__
Connect(wxEVT_IDLE, (wxObjectEventFunction)&MyFrame::OnIdle);
#endif
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ // Workarounds for display glitches with gtk+3.20
+ m_resizetimer.SetOwner(this, 10000);
+ Connect(10000, wxEVT_TIMER, wxTimerEventHandler(MyFrame::OnResizeTimer), NULL, this);
+ m_resizetimer.Start(10);
+
+ Layout->m_notebook->StartTimer();
+#endif
}
#ifdef __WXX11__
@@ -631,6 +640,21 @@ Disconnect(wxID_ANY);
}
#endif
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+void MyFrame::OnResizeTimer(wxTimerEvent& WXUNUSED(event))
+{
+int x, y; GetSize(&x,&y);
+if (y > 50)
+ { static int count(0);
+ if (++count < 10) return;
+ if (count % 2) SetSize(x-1, y);
+ else SetSize(x+1, y);
+
+ if (count > 11 && !(count % 2)) m_resizetimer.Stop();
+ }
+}
+#endif
+
MyFrame::~MyFrame()
{
m_DragMutex.Unlock();
@@ -1850,6 +1874,10 @@ MyTab* tab = GetActiveTab();
if (tab == NULL) return;
tab->PerformSplit(horizontal);
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ m_resizetimer.Start(10);
+#endif
}
void MyFrame::SplitVertical(wxCommandEvent& WXUNUSED(event))
@@ -1858,6 +1886,10 @@ MyTab* tab = GetActiveTab();
if (tab == NULL) return;
tab->PerformSplit(vertical);
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ m_resizetimer.Start(10);
+#endif
}
void MyFrame::Unsplit(wxCommandEvent& WXUNUSED(event))
@@ -1866,11 +1898,19 @@ MyTab* tab = GetActiveTab();
if (tab == NULL) return;
tab->PerformSplit(unsplit);
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ m_resizetimer.Start(10);
+#endif
}
void MyFrame::OnTabTemplateLoadMenu(wxCommandEvent& event)
{
Layout->m_notebook->LoadTemplate(event.GetId() - SHCUT_TABTEMPLATERANGE_START);
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ m_resizetimer.Start(10);
+#endif
}
void MyFrame::OnConfigureShortcuts(wxCommandEvent& WXUNUSED(event))
@@ -2053,6 +2093,10 @@ void LayoutWindows::UnShowBottom() // If bottompanel is visible, unsplit it
if (!m_splitterMain->IsSplit()) return; // Can't unsplit it if it's not split
m_splitterMain->Unsplit(bottompanel);
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ m_frame->m_resizetimer.Start(10);
+#endif
}
void LayoutWindows::DoTool(enum toolchoice whichtool) // Invoke the requested tool in the bottom panel
diff --git a/MyFrame.h b/MyFrame.h
index a54d089..85e4ec0 100644
--- a/MyFrame.h
+++ b/MyFrame.h
@@ -458,6 +458,13 @@ void OnIdle( wxIdleEvent& event ); // One-off to make the toolbar textctrl sh
void OnMouseCaptureLost(wxMouseCaptureLostEvent& event) {OnEndDrag((wxMouseEvent&)event); } // If the mouse escapes, try and do something sensible
#endif
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ void OnResizeTimer(wxTimerEvent& event);
+ public:
+ wxTimer m_resizetimer;
+#endif
+
+protected:
void OnTextFilepathEnter(wxCommandEvent& WXUNUSED(event)){ TextFilepathEnter(); }
void DoMiscUI(wxUpdateUIEvent& event); // UpdateUI for misc items
diff --git a/MyNotebook.cpp b/MyNotebook.cpp
index b628627..71faa53 100644
--- a/MyNotebook.cpp
+++ b/MyNotebook.cpp
@@ -27,6 +27,13 @@
#include "MyFiles.h"
#include "MyNotebook.h"
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ void ResizeTimer::Notify()
+ {
+ if (m_nb)
+ m_nb->OnTimerResize();
+ }
+#endif
MyNotebook::MyNotebook(wxSplitterWindow *main, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
: wxNotebook((wxWindow*)main, id, pos, size, style)
@@ -48,6 +55,10 @@ UnRedoManager::frame = MyFrame::mainframe; // Tell UnRedoManager's (static)
DeviceMan = new DeviceAndMountManager; // Organises things to do with mounting partitions & devices
LaunchFromMenu = new LaunchMiscTools; // Launches user-defined external programs & scripts from the Tools menu
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ m_timer = new ResizeTimer(this);
+#endif
}
MyNotebook::~MyNotebook()
@@ -61,6 +72,10 @@ delete DeleteLocation;
delete BookmarkMan;
}
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ void MyNotebook::StartTimer() { if ( m_timer) m_timer->StartOnce(50); }
+#endif
+
void MyNotebook::LoadTabs(int TemplateNo /*=-1*/, const wxString& startdir0 /*=""*/, const wxString& startdir1 /*=""*/) // Load the default tabs, or if TemplateNo > -1, load that tab template
{
wxConfigBase* config = wxConfigBase::Get(); if (config==NULL) return;
@@ -123,6 +138,10 @@ for (tab=0; tab < GetPageCount(); ++tab) // We can now safely unhide
MyFrame::mainframe->GetMenuBar()->Check(SHCUT_SAVETABS_ONEXIT, saveonexit); // Set the menu item check according to bool
DoLoadTemplateMenu(); // Get the correct no of loadable templates listed on the menu
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ StartTimer();
+#endif
}
void MyNotebook::DoLoadTemplateMenu() // Get the correct no of loadable templates listed on the menu
@@ -298,8 +317,13 @@ if (after == -1) // -1 flags to append, not
{ if (InsertPage(after, page, pageName, true)) ++nextpageno;
else return; // If page couldn't be created, bug out
}
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ StartTimer();
+#endif
}
+
void MyNotebook::AppendTab()
{
CreateTab(GetPageCount()); // By passing GetPageCount(), the correct tabdata should be used
@@ -359,8 +383,18 @@ if (InsertPage(page + 1, duppage, pageName, true))
#if defined (__WXGTK__)
ShowTabs(true); // Show the tab heads now, as by definition there must be >1 tab
#endif
+
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ StartTimer();
+#endif
}
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ void MyNotebook::OnTimerResize()
+ {
+ int x, y; GetSize(&x,&y); SetSize(x-1, y-1); wxSafeYield(); SetSize(x, y);
+ }
+#endif
void MyNotebook::OnSelChange(wxNotebookEvent& event)
{
diff --git a/MyNotebook.h b/MyNotebook.h
index 8fc36db..0287530 100644
--- a/MyNotebook.h
+++ b/MyNotebook.h
@@ -17,6 +17,23 @@ class DeviceAndMountManager;
class Bookmarks;
class LaunchMiscTools;
+#if defined __WXGTK__
+ #include <gtk/gtk.h>
+#endif
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ class MyNotebook;
+
+ class ResizeTimer : public wxTimer
+ {
+ public:
+ ResizeTimer(MyNotebook* nb) : wxTimer(), m_nb(nb) {}
+ void Notify();
+
+ protected:
+ MyNotebook* m_nb;
+ };
+#endif
+
class MyNotebook : public wxNotebook
{
public:
@@ -38,11 +55,19 @@ void OnAdvanceSelection(wxCommandEvent& event){AdvanceSelection(event.GetId() ==
void OnSameTabSize(wxCommandEvent& event){ EqualSizedTabs = ! EqualSizedTabs; EqualWidthTabs(EqualSizedTabs); }
#endif
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ void OnTimerResize();
+#endif
+
void LoadTemplate(int TemplateNo); // Triggered by a menu event, loads the selected tab template
void SaveDefaults(int TemplateNo = -1, const wxString& title = wxT(""));// Save current tab setup. If TemplateNo > -1 save as a template; otherwise just do a 'normal' save
void SaveAsTemplate(); // Save the current tab setup as a template
void DeleteTemplate(); // Delete an existing template
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ void StartTimer();
+#endif
+
DirectoryForDeletions* DeleteLocation; // Organises unique dirnames for deleted/trashed files
UnRedoManager* UnRedoMan; // The sole instance of UnRedoManager
DeviceAndMountManager* DeviceMan; // Find where floppy, cds are
@@ -76,6 +101,9 @@ void RenameTab();
void EqualWidthTabs(bool equal_tabs);
#endif
int nextpageno;
+#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,20,0)
+ ResizeTimer* m_timer;
+#endif
private:
DECLARE_EVENT_TABLE()
};

View file

@ -1,36 +0,0 @@
commit d8b74e4df86fb526ee9caad284b9eb3efe528ac5
Author: dghart <dghart@users.sourceforge.net>
Date: Thu Jan 9 14:14:10 2025 +0000
When previewing an svg file, make the string name unguessable; see https://sourceforge.net/p/fourpane/bugs/22/
Previewing an svg called foo.svg was creating (briefly) in /tmp a file predictably called foo.png. This might have allowed an attacker to overwrite genuine files. Prevent this by prepending a random string to each name.
diff --git a/MyTreeCtrl.cpp b/MyTreeCtrl.cpp
index fd19465..d82cfc8 100644
--- a/MyTreeCtrl.cpp
+++ b/MyTreeCtrl.cpp
@@ -1890,15 +1890,20 @@ void PreviewPopup::DisplayImage(const wxString& fpath)
{
wxLogNull NoErrorMessages;
wxString filepath(fpath);
-wxString pngfilepath;
+wxString pngfilepath, rndstr;
wxImage image;
if (filepath.Right(4) == ".svg")
{ void* handle = wxGetApp().GetRsvgHandle();
if (!handle) return; // Presumably librsvg is not available at present
- wxFileName fn(filepath); // Create a filepath in /tmp/ to store the .png
- pngfilepath = "/tmp/" + fn.GetName() + ".png";
+ // Create a filepath in /tmp/ to store the .png
+ rndstr = ""; srand(time(NULL));
+ wxString allowedchars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ for (size_t n=0; n < 9; ++n) // Make the string name unguessable; see https://sourceforge.net/p/fourpane/bugs/22/
+ rndstr << wxString::Format("%c", allowedchars[(char)(rand() % 52)]);
+ wxFileName fn(filepath);
+ pngfilepath = "/tmp/" + rndstr + fn.GetName() + ".png";
if (SvgToPng(filepath, pngfilepath, handle))
image = wxImage(pngfilepath);
wxRemoveFile(pngfilepath);

View file

@ -7,32 +7,25 @@
%define _docdir_fmt %{NAME}
Name: 4Pane
Version: 8.0
Release: 14%{?dist}
Version: 5.0
Release: 7%{?dist}
Summary: Multi-pane, detailed-list file manager
# Overall GPL-3.0-only
# 4Pane.appdata.xml CC0-1.0
# Accelerators.cpp and etc LGPL-2.0-or-later (wxWindows)
# sdk/bzip/LICENSE bzip2-1.0.6 (unused)
# SPDX confirmed
License: GPL-3.0-only AND LGPL-2.0-or-later AND CC0-1.0
License: GPLv3
URL: http://www.4pane.co.uk/
Source0: http://downloads.sourceforge.net/fourpane/4pane-%{version}.tar.gz
# https://sourceforge.net/p/fourpane/bugs/22/
# https://sourceforge.net/p/fourpane/git4pane/ci/d8b74e4df86fb526ee9caad284b9eb3efe528ac5/
# Make files under /tmp unpredictable
Patch0: 4Pane-d8b74e4-tmp-file-name.patch
# Patch from the upstream to fix sizing and color issue with
# GTK 3.20 (bug 1345924)
#Patch0: 4Pane-4.0-gtk320-sizing.patch
BuildRequires: gcc-c++
BuildRequires: bzip2-devel
BuildRequires: xz-devel
BuildRequires: wxGTK-devel
BuildRequires: /usr/bin/desktop-file-install
BuildRequires: /usr/bin/appstream-util
BuildRequires: wxGTK3-devel
BuildRequires: %{_bindir}/desktop-file-install
BuildRequires: %{_bindir}/appstream-util
BuildRequires: gettext
BuildRequires: git
BuildRequires: make
%description
4Pane is a multi-pane, detailed-list file manager. It is designed
@ -46,7 +39,6 @@ tools.
%prep
%setup -q -n 4pane-%{version}
%patch -P0 -p1 -b .tmpfile
%if 0
cat > .gitignore <<EOF
@ -58,7 +50,7 @@ config.h.in
EOF
git init
git config user.email "4Pane-maintainers@fedoraproject.org"
git config user.email "4Pane-owner@fedoraproject.org"
git config user.name "4Pane owners"
git add .
git commit -m "base" -q
@ -68,7 +60,7 @@ sed -i.cflags configure \
-e '\@[ \t]\{5,\}C.*FLAGS[ \t]*=[ \t]*$@d'
%build
export WX_CONFIG_NAME=$(ls -1 %{_bindir}/wx-config-3.* | sort | tail -n 1)
export WX_CONFIG_NAME=wx-config-3.0
export EXTRA_CXXFLAGS="%{optflags}"
# --without-builtin_bzip2 means using system bzip2
@ -76,10 +68,11 @@ export EXTRA_CXXFLAGS="%{optflags}"
--disable-desktop \
--without-builtin_bzip2 || \
{ sleep 5 ; cat config.log ; sleep 10 ; exit 1; }
%make_build
make %{?_smp_mflags}
%install
%make_install
%make_install \
INSTALL="install -p"
# Some manual installation
mkdir -p %{buildroot}%{_datadir}/applications
@ -92,16 +85,15 @@ install -cpm 644 bitmaps/%{name}Icon48.png %{buildroot}%{_datadir}/icons/hicolor
mkdir -p %{buildroot}%{_mandir}/man1
install -cpm 644 4Pane.1 %{buildroot}%{_mandir}/man1/
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
appstream-util validate-relax --nonet \
%{buildroot}%{_datadir}/appdata/%{name}.appdata.xml
%find_lang %{name}
# Once remove document and let %%doc re-install them
rm -rf %{buildroot}%{_docdir}/%{name}
%check
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
appstream-util validate-relax --nonet \
%{buildroot}%{_datadir}/metainfo/%{name}.appdata.xml
%files -f %{name}.lang
%license LICENCE
%doc doc/*
@ -112,82 +104,13 @@ appstream-util validate-relax --nonet \
%{_bindir}/%{name}
%{_mandir}/man1/%{name}.1*
%{_datadir}/metainfo/%{name}.appdata.xml
%{_datadir}/appdata/%{name}.appdata.xml
%{_datadir}/%{name}/
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/*/apps/%{name}*
%changelog
* Fri Jan 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-14
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
* Wed Jul 23 2025 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-13
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Mon Jan 20 2025 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-12
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Thu Jan 16 2025 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-11
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Fri Jan 10 2025 Mamoru TASAKA <mtasaka@fedoraproject.org> - 8.0-10
- Upstream fix to make files under /tmp unpredictable
* Wed Jul 17 2024 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Fri Jan 26 2024 Mamoru TASAKA <mtasaka@fedoraproject.org> - 8.0-8
- SPDX migration
* Mon Jan 22 2024 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Fri Jan 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Thu Jan 18 2024 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Wed Jul 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Wed Jan 18 2023 Fedora Release Engineering <releng@fedoraproject.org> - 8.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Fri Nov 25 2022 Mamoru TASAKA <mtasaka@fedoraproject.org> - 8.0-2
- 8.0
* Thu Aug 04 2022 Scott Talbert <swt@techie.net> - 7.0-6
- Rebuild with wxWidgets 3.2
* Wed Jul 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 7.0-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Wed Jan 19 2022 Fedora Release Engineering <releng@fedoraproject.org> - 7.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org> - 7.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Mon Jan 25 2021 Fedora Release Engineering <releng@fedoraproject.org> - 7.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Dec 8 2020 Mamoru TASAKA <mtasaka@fedoraproject.org> - 7.0-1
- 7.0
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 6.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 6.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Mon Dec 30 2010 Mamoru TASAKA <mtasaka@fedoraproject.org> - 6.0-1
- 6.0
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 5.0-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 5.0-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild

View file

@ -1 +1 @@
SHA512 (4pane-8.0.tar.gz) = 65c7575a08b9dad28c86a71c30c7671ebaf80cd7f89a81b94402ea3a522f0d9922221ac0f0714b851839d51cca70b8905fb109469aab254f2b574863be537fa8
SHA512 (4pane-5.0.tar.gz) = 45e9b135f1d394f3050366997b0057929e6726dfc764f40346e9bae0ad279b66d843c2d72a6f6ec4cf0e8a188ca787ab073a9671ebb79cc06b28a8819bc4b95b