fix a crash

a crash caused by a splitbar would be created by place when the window is
destorying; add some checks whether the parent is destorying in create
widget functions
This commit is contained in:
Jinhao 2015-08-08 08:25:55 +08:00
parent 1600d73856
commit ff7a1f9510
2 changed files with 14 additions and 2 deletions

View File

@ -213,6 +213,9 @@ namespace detail
if (impl_->wd_register.available(owner))
{
if (owner->flags.destroying)
throw std::logic_error("the specified owner is destory");
native = (owner->other.category == category::frame_tag::value ?
owner->other.attribute.frame->container : owner->root_widget->root);
r.x += owner->pos_root.x;
@ -303,6 +306,9 @@ namespace detail
if (impl_->wd_register.available(parent) == false)
throw std::invalid_argument("invalid parent/owner handle");
if (parent->flags.destroying)
throw std::logic_error("the specified parent is destory");
auto wdg_notifier = widget_notifier_interface::get_notifier(wdg);
core_window_t * wd;

View File

@ -776,10 +776,13 @@ namespace nana
//It will delete the element and recollocate when the window destroyed.
event_handle _m_make_destroy(window wd)
{
return API::events(wd).destroy.connect([this](const arg_destroy& arg)
return API::events(wd).destroy.connect([this, wd](const arg_destroy& arg)
{
if (erase_element(elements, arg.window_handle))
{
if (!API::is_destroying(API::get_parent_window(wd)))
place_ptr_->collocate();
}
});
}
@ -1524,6 +1527,9 @@ namespace nana
private:
void collocate(window wd) override
{
if (API::is_destroying(wd))
return;
if (splitter_.empty())
{
splitter_.create(wd);