diff --git a/include/nana/gui/detail/general_events.hpp b/include/nana/gui/detail/general_events.hpp index c2595fe5..2171cb7a 100644 --- a/include/nana/gui/detail/general_events.hpp +++ b/include/nana/gui/detail/general_events.hpp @@ -47,12 +47,11 @@ namespace nana struct docker_base : public docker_interface { - event_interface * event_ptr; - bool flag_deleted{ false }; + event_interface * const event_ptr; + bool flag_deleted; const bool unignorable; docker_base(event_interface*, bool unignorable_flag); - detail::event_interface * get_event() const override; }; @@ -118,7 +117,7 @@ namespace nana private: struct docker : public detail::docker_base - { + { /// the callback/response function taking the typed argument std::function invoke; @@ -221,33 +220,16 @@ namespace nana //The dockers may resize when a new event handler is created by a calling handler. //Traverses with position can avaid crash error which caused by a iterator which becomes invalid. - - auto i = dockers_->data(); - auto const end = i + dockers_->size(); - - for (; i != end; ++i) + for (std::size_t i = 0; i < dockers_->size(); ++i) { - if (static_cast(*i)->flag_deleted) + auto d = static_cast(dockers_->data()[i]); + if (d->flag_deleted || (arg.propagation_stopped() && !d->unignorable)) continue; - static_cast(*i)->invoke(arg); + d->invoke(arg); if (window_handle && (!detail::check_window(window_handle))) break; - - if (arg.propagation_stopped()) - { - for (++i; i != end; ++i) - { - if (!static_cast(*i)->unignorable || static_cast(*i)->flag_deleted) - continue; - - static_cast(*i)->invoke(arg); - if (window_handle && (!detail::check_window(window_handle))) - break; - } - break; - } } } private: diff --git a/source/gui/detail/events_operation.cpp b/source/gui/detail/events_operation.cpp index 40fe338e..a278bc96 100644 --- a/source/gui/detail/events_operation.cpp +++ b/source/gui/detail/events_operation.cpp @@ -34,8 +34,10 @@ namespace nana //class docker_base - docker_base::docker_base(event_interface* evt, bool unignorable_flag) - : event_ptr(evt), unignorable(unignorable_flag) + docker_base::docker_base(event_interface* evt, bool unignorable_flag): + event_ptr(evt), + flag_deleted(false), + unignorable(unignorable_flag) {} detail::event_interface * docker_base::get_event() const