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