reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 80b8b306db1db2ad19b1866758b7c9527cbd53af
parent cc6c1780ddd78f50c20a4ea392d3d4a5ef934aba
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Sun, 12 Jan 2020 17:53:06 -0500

refactor modeless dialog close handlers

Diffstat:
Msrc/dialog.cpp | 14++++++++------
Msrc/dialog.hpp | 6+++---
Msrc/reapack.cpp | 15++++++++-------
3 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/src/dialog.cpp b/src/dialog.cpp @@ -30,6 +30,12 @@ WDL_DLGRET Dialog::Proc(HWND handle, UINT msg, WPARAM wParam, LPARAM lParam) { + // On Windows WM_DESTROY is emitted in place of WM_INITDIALOG + // if the dialog resource is invalid (eg. because of an unloaded dll). + // + // When this happens neither lParam nor GWLP_USERDATA will contain + // a pointer to the Dialog instance, so there is nothing we can do. + Dialog *dlg = reinterpret_cast<Dialog *>( msg == WM_INITDIALOG ? lParam : GetWindowLongPtr(handle, GWLP_USERDATA) ); @@ -67,11 +73,6 @@ WDL_DLGRET Dialog::Proc(HWND handle, UINT msg, WPARAM wParam, LPARAM lParam) dlg->onResize(); break; case WM_DESTROY: - // On Windows, WM_DESTROY is emitted in place of WM_INITDIALOG - // if the dialog resource is invalid (eg. because of an unloaded dll). - // - // When this happens, neither lParam nor GWLP_USERDATA will contain - // a pointer to the Dialog instance, so there is nothing we can do. dlg->onClose(); break; }; @@ -167,7 +168,8 @@ void Dialog::close(const INT_PTR result) break; case Modeless: onClose(); - m_closeHandler(result); + if(m_closeHandler) + m_closeHandler(result); break; } } diff --git a/src/dialog.hpp b/src/dialog.hpp @@ -53,9 +53,11 @@ public: }; template<class T, class... Args> - static std::unique_ptr<T> Create(REAPER_PLUGIN_HINSTANCE instance, HWND parent, Args&&... args) + static std::unique_ptr<T> Create(REAPER_PLUGIN_HINSTANCE instance, + HWND parent, const CloseHandler &closeHandler, Args&&... args) { auto dlg = std::make_unique<T>(args...); + dlg->m_closeHandler = closeHandler; dlg->init(instance, parent, Dialog::Modeless); return dlg; @@ -106,8 +108,6 @@ public: void restoreState(Serializer::Data &); void saveState(Serializer::Data &) const; - void setCloseHandler(const CloseHandler &cb) { m_closeHandler = cb; } - protected: enum Modifiers { AltModifier = 1<<0, diff --git a/src/reapack.cpp b/src/reapack.cpp @@ -211,9 +211,9 @@ void ReaPack::manageRemotes() return; } - m_manager = Dialog::Create<Manager>(m_instance, m_mainWindow); + m_manager = Dialog::Create<Manager>(m_instance, m_mainWindow, + [=](INT_PTR) { m_manager.reset(); }); m_manager->show(); - m_manager->setCloseHandler([=](INT_PTR) { m_manager.reset(); }); } Remote ReaPack::remote(const std::string &name) const @@ -250,8 +250,8 @@ About *ReaPack::about(const bool instantiate) else if(!instantiate) return nullptr; - m_about = Dialog::Create<About>(m_instance, m_mainWindow); - m_about->setCloseHandler([=](INT_PTR) { m_about.reset(); }); + m_about = Dialog::Create<About>(m_instance, m_mainWindow, + [=](INT_PTR) { m_about.reset(); }); return m_about.get(); } @@ -261,9 +261,9 @@ Browser *ReaPack::browsePackages() if(m_browser) m_browser->setFocus(); else { - m_browser = Dialog::Create<Browser>(m_instance, m_mainWindow); + m_browser = Dialog::Create<Browser>(m_instance, m_mainWindow, + [=](INT_PTR) { m_browser.reset(); }); m_browser->refresh(); - m_browser->setCloseHandler([=](INT_PTR) { m_browser.reset(); }); } return m_browser.get(); @@ -289,7 +289,8 @@ Transaction *ReaPack::setupTransaction() } assert(!m_progress); - m_progress = Dialog::Create<Progress>(m_instance, m_mainWindow, m_tx->threadPool()); + m_progress = Dialog::Create<Progress>(m_instance, m_mainWindow, + nullptr, m_tx->threadPool()); m_tx->onFinish >> [=] { m_progress.reset();