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