Blob Blame History Raw
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()
 };