Merge branch 'hotfix-1.1.2' into develop
This commit is contained in:
@@ -189,8 +189,6 @@ namespace nana
|
||||
auto retain = wd->together.events_ptr;
|
||||
auto evts_ptr = retain.get();
|
||||
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
|
||||
switch (evt_code)
|
||||
{
|
||||
@@ -199,8 +197,11 @@ namespace nana
|
||||
auto arg = dynamic_cast<const arg_click*>(&event_arg);
|
||||
if (nullptr == arg)
|
||||
return;
|
||||
|
||||
wd->drawer.click(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
wd->drawer.click(*arg);
|
||||
}
|
||||
if (!draw_only)
|
||||
evts_ptr->click.emit(*arg);
|
||||
}
|
||||
@@ -249,7 +250,11 @@ namespace nana
|
||||
throw std::runtime_error("Invalid mouse event code");
|
||||
}
|
||||
|
||||
(wd->drawer.*drawer_event_fn)(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
(wd->drawer.*drawer_event_fn)(*arg);
|
||||
}
|
||||
|
||||
if (!draw_only)
|
||||
evt_addr->emit(*arg);
|
||||
@@ -260,7 +265,12 @@ namespace nana
|
||||
auto arg = dynamic_cast<const arg_wheel*>(&event_arg);
|
||||
if (arg)
|
||||
{
|
||||
wd->drawer.mouse_wheel(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
wd->drawer.mouse_wheel(*arg);
|
||||
}
|
||||
|
||||
if (!draw_only)
|
||||
evts_ptr->mouse_wheel.emit(*arg);
|
||||
}
|
||||
@@ -299,7 +309,12 @@ namespace nana
|
||||
default:
|
||||
throw std::runtime_error("Invalid keyboard event code");
|
||||
}
|
||||
(wd->drawer.*drawer_event_fn)(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
(wd->drawer.*drawer_event_fn)(*arg);
|
||||
}
|
||||
|
||||
if (!draw_only)
|
||||
evt_addr->emit(*arg);
|
||||
break;
|
||||
@@ -317,7 +332,11 @@ namespace nana
|
||||
auto arg = dynamic_cast<const arg_focus*>(&event_arg);
|
||||
if (arg)
|
||||
{
|
||||
wd->drawer.focus(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
wd->drawer.focus(*arg);
|
||||
}
|
||||
if (!draw_only)
|
||||
evts_ptr->focus.emit(*arg);
|
||||
}
|
||||
@@ -328,7 +347,11 @@ namespace nana
|
||||
auto arg = dynamic_cast<const arg_move*>(&event_arg);
|
||||
if (arg)
|
||||
{
|
||||
wd->drawer.move(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
wd->drawer.move(*arg);
|
||||
}
|
||||
if (!draw_only)
|
||||
evts_ptr->move.emit(*arg);
|
||||
}
|
||||
@@ -339,7 +362,11 @@ namespace nana
|
||||
auto arg = dynamic_cast<const arg_resizing*>(&event_arg);
|
||||
if (arg)
|
||||
{
|
||||
wd->drawer.resizing(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
wd->drawer.resizing(*arg);
|
||||
}
|
||||
if (!draw_only)
|
||||
evts_ptr->resizing.emit(*arg);
|
||||
}
|
||||
@@ -350,7 +377,11 @@ namespace nana
|
||||
auto arg = dynamic_cast<const arg_resized*>(&event_arg);
|
||||
if (arg)
|
||||
{
|
||||
wd->drawer.resized(*arg);
|
||||
{
|
||||
//enable refreshing flag, this is a RAII class for exception-safe
|
||||
flag_guard fguard(this, wd);
|
||||
wd->drawer.resized(*arg);
|
||||
}
|
||||
if (!draw_only)
|
||||
evts_ptr->resized.emit(*arg);
|
||||
}
|
||||
|
||||
@@ -326,6 +326,9 @@ namespace detail
|
||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||
if (impl_->wd_register.available(wd) == false) return;
|
||||
|
||||
if (wd->flags.destroying)
|
||||
return;
|
||||
|
||||
if(wd->other.category == category::root_tag::value)
|
||||
{
|
||||
auto &brock = bedrock::instance();
|
||||
@@ -340,13 +343,15 @@ namespace detail
|
||||
if(wd->flags.modal || (wd->owner == nullptr) || wd->owner->flags.take_active)
|
||||
native_interface::activate_owner(wd->root);
|
||||
|
||||
//Close should detach the drawer and send destroy signal to widget object.
|
||||
//Otherwise, when a widget object is been deleting in other thread by delete operator, the object will be destroyed
|
||||
//before the window_manager destroyes the window, and then, window_manager detaches the
|
||||
//non-existing drawer_trigger which is destroyed by destruction of widget. Crash!
|
||||
wd->drawer.detached();
|
||||
|
||||
wd->widget_notifier->destroy();
|
||||
if (!wd->flags.destroying)
|
||||
{
|
||||
//Close should detach the drawer and send destroy signal to widget object.
|
||||
//Otherwise, when a widget object is been deleting in other thread by delete operator, the object will be destroyed
|
||||
//before the window_manager destroyes the window, and then, window_manager detaches the
|
||||
//non-existing drawer_trigger which is destroyed by destruction of widget. Crash!
|
||||
wd->drawer.detached();
|
||||
wd->widget_notifier->destroy();
|
||||
}
|
||||
|
||||
native_interface::close_window(wd->root);
|
||||
}
|
||||
|
||||
@@ -1440,7 +1440,6 @@ namespace nana
|
||||
private:
|
||||
void _m_calc_metrics(graph_reference graph, std::forward_list<item>& items)
|
||||
{
|
||||
const auto height_px = graph.height();
|
||||
std::vector<unsigned> pxs;
|
||||
|
||||
unsigned pixels = 0;
|
||||
|
||||
@@ -22,10 +22,10 @@ namespace nana
|
||||
|
||||
//class widget
|
||||
//@brief:The definition of class widget
|
||||
class widget::notifier: public detail::widget_notifier_interface
|
||||
class widget::inner_widget_notifier : public detail::widget_notifier_interface
|
||||
{
|
||||
public:
|
||||
notifier(widget& wdg)
|
||||
inner_widget_notifier(widget& wdg)
|
||||
: wdg_(wdg)
|
||||
{}
|
||||
|
||||
@@ -246,7 +246,7 @@ namespace nana
|
||||
|
||||
std::unique_ptr<::nana::detail::widget_notifier_interface> widget::_m_wdg_notifier()
|
||||
{
|
||||
return std::unique_ptr<::nana::detail::widget_notifier_interface>(new notifier(*this));
|
||||
return std::unique_ptr<::nana::detail::widget_notifier_interface>(new inner_widget_notifier(*this));
|
||||
}
|
||||
|
||||
void widget::_m_complete_creation()
|
||||
@@ -348,7 +348,7 @@ namespace nana
|
||||
{
|
||||
std::unique_ptr<widget_notifier_interface> widget_notifier_interface::get_notifier(widget* wdg)
|
||||
{
|
||||
return std::unique_ptr<widget_notifier_interface>(new widget::notifier(*wdg));
|
||||
return std::unique_ptr<widget_notifier_interface>(new widget::inner_widget_notifier(*wdg));
|
||||
}
|
||||
}
|
||||
}//end namespace nana
|
||||
|
||||
Reference in New Issue
Block a user