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()
};