diff --git a/.gitignore b/.gitignore index bd1a2bc..4acf94d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -/4pane-*.tar.gz +/4pane-3.0.tar.gz +/4pane-4.0.tar.gz +/4pane-5.0.tar.gz diff --git a/4Pane-4.0-gtk320-sizing.patch b/4Pane-4.0-gtk320-sizing.patch new file mode 100644 index 0000000..e25188d --- /dev/null +++ b/4Pane-4.0-gtk320-sizing.patch @@ -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 ++#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() + }; diff --git a/4Pane-d8b74e4-tmp-file-name.patch b/4Pane-d8b74e4-tmp-file-name.patch deleted file mode 100644 index 2a6d152..0000000 --- a/4Pane-d8b74e4-tmp-file-name.patch +++ /dev/null @@ -1,36 +0,0 @@ -commit d8b74e4df86fb526ee9caad284b9eb3efe528ac5 -Author: dghart -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); diff --git a/4Pane.spec b/4Pane.spec index 0d951c8..6c5efa4 100644 --- a/4Pane.spec +++ b/4Pane.spec @@ -7,32 +7,25 @@ %define _docdir_fmt %{NAME} Name: 4Pane -Version: 8.0 -Release: 14%{?dist} +Version: 5.0 +Release: 6%{?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 < - 8.0-14 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild - -* Wed Jul 23 2025 Fedora Release Engineering - 8.0-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Mon Jan 20 2025 Fedora Release Engineering - 8.0-12 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Thu Jan 16 2025 Fedora Release Engineering - 8.0-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Fri Jan 10 2025 Mamoru TASAKA - 8.0-10 -- Upstream fix to make files under /tmp unpredictable - -* Wed Jul 17 2024 Fedora Release Engineering - 8.0-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Fri Jan 26 2024 Mamoru TASAKA - 8.0-8 -- SPDX migration - -* Mon Jan 22 2024 Fedora Release Engineering - 8.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Fri Jan 19 2024 Fedora Release Engineering - 8.0-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Thu Jan 18 2024 Fedora Release Engineering - 8.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Wed Jul 19 2023 Fedora Release Engineering - 8.0-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Wed Jan 18 2023 Fedora Release Engineering - 8.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Fri Nov 25 2022 Mamoru TASAKA - 8.0-2 -- 8.0 - -* Thu Aug 04 2022 Scott Talbert - 7.0-6 -- Rebuild with wxWidgets 3.2 - -* Wed Jul 20 2022 Fedora Release Engineering - 7.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Wed Jan 19 2022 Fedora Release Engineering - 7.0-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Wed Jul 21 2021 Fedora Release Engineering - 7.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Mon Jan 25 2021 Fedora Release Engineering - 7.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Tue Dec 8 2020 Mamoru TASAKA - 7.0-1 -- 7.0 - -* Mon Jul 27 2020 Fedora Release Engineering - 6.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Tue Jan 28 2020 Fedora Release Engineering - 6.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Mon Dec 30 2010 Mamoru TASAKA - 6.0-1 -- 6.0 - -* Wed Jul 24 2019 Fedora Release Engineering - 5.0-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Thu Jan 31 2019 Fedora Release Engineering - 5.0-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - * Thu Jul 12 2018 Fedora Release Engineering - 5.0-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild diff --git a/sources b/sources index 06a96ed..8d4ac1a 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (4pane-8.0.tar.gz) = 65c7575a08b9dad28c86a71c30c7671ebaf80cd7f89a81b94402ea3a522f0d9922221ac0f0714b851839d51cca70b8905fb109469aab254f2b574863be537fa8 +SHA512 (4pane-5.0.tar.gz) = 45e9b135f1d394f3050366997b0057929e6726dfc764f40346e9bae0ad279b66d843c2d72a6f6ec4cf0e8a188ca787ab073a9671ebb79cc06b28a8819bc4b95b