diff --git a/include/nana/gui/detail/events_operation.hpp b/include/nana/gui/detail/events_operation.hpp index 025ef5b1..e28b9af3 100644 --- a/include/nana/gui/detail/events_operation.hpp +++ b/include/nana/gui/detail/events_operation.hpp @@ -3,8 +3,6 @@ #include #include -#include -#include #if defined(STD_THREAD_NOT_SUPPORTED) #include @@ -19,15 +17,12 @@ namespace nana class events_operation { public: - void make(window, const std::shared_ptr &); - void umake(window); void register_evt(event_handle); void cancel(event_handle); void erase(event_handle); private: std::recursive_mutex mutex_; std::unordered_set handles_; - std::unordered_map> evt_table_; }; }//end namespace detail }//end namespace nana diff --git a/include/nana/gui/detail/general_events.hpp b/include/nana/gui/detail/general_events.hpp index c49cab98..8986ee73 100644 --- a/include/nana/gui/detail/general_events.hpp +++ b/include/nana/gui/detail/general_events.hpp @@ -23,8 +23,8 @@ namespace nana { namespace detail { + bool check_window(window); void events_operation_register(event_handle); - void events_operation_cancel(event_handle); class event_interface { @@ -161,7 +161,7 @@ namespace nana return _m_emplace(new docker(this, factory::value>::build(std::forward(fn)), true), in_front); } - void emit(arg_reference& arg) + void emit(arg_reference& arg, window window_handle) { internal_scope_guard lock; if (nullptr == dockers_) @@ -181,6 +181,10 @@ namespace nana continue; static_cast(*i)->invoke(arg); + + if (window_handle && (!detail::check_window(window_handle))) + break; + if (arg.propagation_stopped()) { for (++i; i != end; ++i) @@ -189,6 +193,9 @@ namespace nana continue; static_cast(*i)->invoke(arg); + + if (window_handle && (!detail::check_window(window_handle))) + break; } break; } diff --git a/include/nana/gui/widgets/categorize.hpp b/include/nana/gui/widgets/categorize.hpp index 3b8f5b3c..d2a19141 100644 --- a/include/nana/gui/widgets/categorize.hpp +++ b/include/nana/gui/widgets/categorize.hpp @@ -66,7 +66,7 @@ namespace nana T null_val; arg_categorize arg(widget_, vp ? *vp : null_val); - widget_.events().selected.emit(arg); + widget_.events().selected.emit(arg, widget_.handle()); } private: ::nana::categorize & widget_; diff --git a/include/nana/gui/widgets/scroll.hpp b/include/nana/gui/widgets/scroll.hpp index 96d1b023..1cf5bb83 100644 --- a/include/nana/gui/widgets/scroll.hpp +++ b/include/nana/gui/widgets/scroll.hpp @@ -314,7 +314,7 @@ namespace nana private: void _m_emit_value_changed() { - widget_->events().value_changed.emit({ widget_->handle() }); + widget_->events().value_changed.emit({ widget_->handle() }, widget_->handle()); } void _m_tick() diff --git a/include/nana/gui/widgets/tabbar.hpp b/include/nana/gui/widgets/tabbar.hpp index b7a88789..ac009ee7 100644 --- a/include/nana/gui/widgets/tabbar.hpp +++ b/include/nana/gui/widgets/tabbar.hpp @@ -111,14 +111,14 @@ namespace nana if(pos != npos) { drawer_trigger_.at_no_bound_check(pos) = T(); - tabbar_.events().added.emit(arg_tabbar({ tabbar_, tabbar_[pos] })); + tabbar_.events().added.emit(arg_tabbar({ tabbar_, tabbar_[pos] }), tabbar_); } } void activated(std::size_t pos) override { if(pos != npos) - tabbar_.events().activated.emit(arg_tabbar({ tabbar_, tabbar_[pos]})); + tabbar_.events().activated.emit(arg_tabbar({ tabbar_, tabbar_[pos]}), tabbar_); } bool removed(std::size_t pos, bool & close_attach) override @@ -126,7 +126,7 @@ namespace nana if (pos != npos) { ::nana::arg_tabbar_removed arg(tabbar_, tabbar_[pos]); - tabbar_.events().removed.emit(arg); + tabbar_.events().removed.emit(arg, tabbar_); close_attach = arg.close_attach_window; return arg.remove; } diff --git a/source/gui/detail/bedrock_pi.cpp b/source/gui/detail/bedrock_pi.cpp index 7c7472bb..e8166cf6 100644 --- a/source/gui/detail/bedrock_pi.cpp +++ b/source/gui/detail/bedrock_pi.cpp @@ -51,16 +51,16 @@ namespace nana namespace detail { + bool check_window(window wd) + { + return bedrock::instance().wd_manager().available(reinterpret_cast(wd)); + } + void events_operation_register(event_handle evt) { bedrock::instance().evt_operation().register_evt(evt); } - void events_operation_cancel(event_handle evt) - { - bedrock::instance().evt_operation().cancel(evt); - } - class bedrock::flag_guard { public: @@ -213,21 +213,21 @@ namespace nana auto retain = wd->together.events_ptr; auto evts_ptr = retain.get(); - switch (evt_code) { case event_code::click: { auto arg = dynamic_cast(&event_arg); - if (nullptr == arg) - return; + if (arg) { - //enable refreshing flag, this is a RAII class for exception-safe - flag_guard fguard(this, wd); - 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, reinterpret_cast(wd)); } - if (!draw_only) - evts_ptr->click.emit(*arg); } break; case event_code::dbl_click: @@ -281,7 +281,7 @@ namespace nana } if (!draw_only) - evt_addr->emit(*arg); + evt_addr->emit(*arg, reinterpret_cast(wd)); break; } case event_code::mouse_wheel: @@ -296,7 +296,7 @@ namespace nana } if (!draw_only) - evts_ptr->mouse_wheel.emit(*arg); + evts_ptr->mouse_wheel.emit(*arg, reinterpret_cast(wd)); } break; } @@ -340,7 +340,7 @@ namespace nana } if (!draw_only) - evt_addr->emit(*arg); + evt_addr->emit(*arg, reinterpret_cast(wd)); break; } case event_code::expose: @@ -348,7 +348,7 @@ namespace nana { auto arg = dynamic_cast(&event_arg); if (arg) - evts_ptr->expose.emit(*arg); + evts_ptr->expose.emit(*arg, reinterpret_cast(wd)); } break; case event_code::focus: @@ -362,7 +362,7 @@ namespace nana wd->drawer.focus(*arg); } if (!draw_only) - evts_ptr->focus.emit(*arg); + evts_ptr->focus.emit(*arg, reinterpret_cast(wd)); } break; } @@ -377,7 +377,7 @@ namespace nana wd->drawer.move(*arg); } if (!draw_only) - evts_ptr->move.emit(*arg); + evts_ptr->move.emit(*arg, reinterpret_cast(wd)); } break; } @@ -392,7 +392,7 @@ namespace nana wd->drawer.resizing(*arg); } if (!draw_only) - evts_ptr->resizing.emit(*arg); + evts_ptr->resizing.emit(*arg, reinterpret_cast(wd)); } break; } @@ -407,7 +407,7 @@ namespace nana wd->drawer.resized(*arg); } if (!draw_only) - evts_ptr->resized.emit(*arg); + evts_ptr->resized.emit(*arg, reinterpret_cast(wd)); } break; } @@ -419,7 +419,7 @@ namespace nana { auto evt_root = dynamic_cast(evts_ptr); if (evt_root) - evt_root->unload.emit(*arg); + evt_root->unload.emit(*arg, reinterpret_cast(wd)); } } break; @@ -428,7 +428,7 @@ namespace nana { auto arg = dynamic_cast(&event_arg); if (arg) - evts_ptr->destroy.emit(*arg); + evts_ptr->destroy.emit(*arg, reinterpret_cast(wd)); } break; default: diff --git a/source/gui/detail/bedrock_posix.cpp b/source/gui/detail/bedrock_posix.cpp index 2fe3b4ba..071623ee 100644 --- a/source/gui/detail/bedrock_posix.cpp +++ b/source/gui/detail/bedrock_posix.cpp @@ -520,7 +520,7 @@ namespace detail delete msg.u.mouse_drop.files; arg.pos.x = msg.u.mouse_drop.x - msgwd->pos_root.x; arg.pos.y = msg.u.mouse_drop.y - msgwd->pos_root.y; - msgwd->together.events_ptr->mouse_dropfiles.emit(arg); + msgwd->together.events_ptr->mouse_dropfiles.emit(arg, reinterpret_cast(msgwd)); brock.wd_manager().do_lazy_refresh(msgwd, false); } break; @@ -842,16 +842,16 @@ namespace detail draw_invoker(&drawer::mouse_up, msgwnd, arg, &context); if(click_arg.window_handle) - evt_ptr->click.emit(click_arg); + evt_ptr->click.emit(click_arg, reinterpret_cast(msgwnd)); if (brock.wd_manager().available(msgwnd)) { arg.evt_code = event_code::mouse_up; - evt_ptr->mouse_up.emit(arg); + evt_ptr->mouse_up.emit(arg, reinterpret_cast(msgwnd)); } } else if(click_arg.window_handle) - msgwnd->together.events_ptr->click.emit(click_arg); + msgwnd->together.events_ptr->click.emit(click_arg, reinterpret_cast(msgwnd)); brock.wd_manager().do_lazy_refresh(msgwnd, false); } @@ -1143,7 +1143,7 @@ namespace detail arg.evt_code = event_code::key_char; arg.window_handle = reinterpret_cast(msgwnd); brock.get_key_state(arg); - msgwnd->together.events_ptr->key_char.emit(arg); + msgwnd->together.events_ptr->key_char.emit(arg, reinterpret_cast(msgwnd)); if(arg.ignore == false && wd_manager.available(msgwnd)) draw_invoker(&drawer::key_char, msgwnd, arg, &context); } diff --git a/source/gui/detail/bedrock_windows.cpp b/source/gui/detail/bedrock_windows.cpp index 37ec28a0..949d34ae 100644 --- a/source/gui/detail/bedrock_windows.cpp +++ b/source/gui/detail/bedrock_windows.cpp @@ -931,10 +931,7 @@ namespace detail arg_mouse arg; assign_arg(arg, msgwnd, message, pmdec); if (brock.emit(arg.evt_code, msgwnd, arg, true, &context)) - { - if (brock.wd_manager().available(msgwnd)) - pressed_wd = msgwnd; - } + pressed_wd = msgwnd; } break; case WM_NCLBUTTONDOWN: case WM_NCMBUTTONDOWN: case WM_NCRBUTTONDOWN: @@ -1042,16 +1039,16 @@ namespace detail draw_invoker(&drawer::mouse_up, msgwnd, arg, &context); if (click_arg.window_handle) - retain->click.emit(click_arg); + retain->click.emit(click_arg, reinterpret_cast(msgwnd)); if (brock.wd_manager().available(msgwnd)) { arg.evt_code = event_code::mouse_up; - retain->mouse_up.emit(arg); + retain->mouse_up.emit(arg, reinterpret_cast(msgwnd)); } } else if (click_arg.window_handle) - retain->click.emit(click_arg); + retain->click.emit(click_arg, reinterpret_cast(msgwnd)); brock.wd_manager().do_lazy_refresh(msgwnd, false); } @@ -1119,8 +1116,11 @@ namespace detail brock.emit(event_code::mouse_enter, msgwnd, arg, true, &context); } - arg.evt_code = event_code::mouse_move; - brock.emit(event_code::mouse_move, msgwnd, arg, true, &context); + if (hovered_wd) + { + arg.evt_code = event_code::mouse_move; + brock.emit(event_code::mouse_move, msgwnd, arg, true, &context); + } track.hwndTrack = native_window; restrict::track_mouse_event(&track); } @@ -1223,7 +1223,7 @@ namespace detail brock.wd_manager().calc_window_point(msgwnd, dropfiles.pos); dropfiles.window_handle = reinterpret_cast(msgwnd); - msgwnd->together.events_ptr->mouse_dropfiles.emit(dropfiles); + msgwnd->together.events_ptr->mouse_dropfiles.emit(dropfiles, reinterpret_cast(msgwnd)); brock.wd_manager().do_lazy_refresh(msgwnd, false); } } @@ -1495,7 +1495,7 @@ namespace detail brock.get_key_state(arg); arg.ignore = false; - msgwnd->together.events_ptr->key_char.emit(arg); + msgwnd->together.events_ptr->key_char.emit(arg, reinterpret_cast(msgwnd)); if ((false == arg.ignore) && wd_manager.available(msgwnd)) draw_invoker(&drawer::key_char, msgwnd, arg, &context); @@ -1785,13 +1785,19 @@ namespace detail _m_emit_core(evt_code, wd, false, arg); - if (ask_update) - wd_manager().do_lazy_refresh(wd, false); - else if (wd_manager().available(wd)) - wd->other.upd_state = basic_window::update_state::none; + bool good_wd = false; + if (wd_manager().available(wd)) + { + if (ask_update) + wd_manager().do_lazy_refresh(wd, false); + else + wd->other.upd_state = basic_window::update_state::none; + + good_wd = true; + } if (thrd) thrd->event_window = prev_event_wd; - return true; + return good_wd; } const wchar_t* translate(cursor id) diff --git a/source/gui/detail/events_operation.cpp b/source/gui/detail/events_operation.cpp index bff546ca..bcafd688 100644 --- a/source/gui/detail/events_operation.cpp +++ b/source/gui/detail/events_operation.cpp @@ -1,4 +1,5 @@ #include +#include namespace nana { @@ -7,18 +8,6 @@ namespace nana //class events_operation using lock_guard = std::lock_guard; - void events_operation::make(window wd, const std::shared_ptr& sp) - { - lock_guard lock(mutex_); - evt_table_[wd] = sp; - } - - void events_operation::umake(window wd) - { - lock_guard lock(mutex_); - evt_table_.erase(wd); - } - void events_operation::register_evt(event_handle evt) { lock_guard lock(mutex_); @@ -72,9 +61,11 @@ namespace nana internal_scope_guard lock; if (dockers_) { + auto & evt_operation = bedrock::instance().evt_operation(); + for (auto p : *dockers_) { - detail::events_operation_cancel(reinterpret_cast(p)); + evt_operation.cancel(reinterpret_cast(p)); delete p; } dockers_->clear(); diff --git a/source/gui/detail/window_manager.cpp b/source/gui/detail/window_manager.cpp index fa81d30d..5e1ee247 100644 --- a/source/gui/detail/window_manager.cpp +++ b/source/gui/detail/window_manager.cpp @@ -86,13 +86,12 @@ namespace detail private: std::vector table_; }; - //class window_manager + //class window_manager struct window_handle_deleter { void operator()(basic_window* wd) const { - bedrock::instance().evt_operation().umake(reinterpret_cast(wd)); delete wd; } }; @@ -399,7 +398,7 @@ namespace detail if (wd->flags.destroying) return; - if(wd->other.category == category::root_tag::value) + if(category::flags::root == wd->other.category) { auto &brock = bedrock::instance(); arg_unload arg; @@ -844,10 +843,10 @@ namespace detail //Thread-Safe Required! std::lock_guard lock(mutex_); - //It's not worthy to redraw if visible is false if (false == impl_->wd_register.available(wd)) return false; + //It's not worthy to redraw if visible is false if(wd->visible && (!wd->is_draw_through())) { if (wd->visible_parents()) @@ -1573,7 +1572,7 @@ namespace detail wd->drawer.detached(); wd->widget_notifier->destroy(); - if(wd->other.category == category::frame_tag::value) + if(category::flags::frame == wd->other.category) { //The frame widget does not have an owner, and close their element windows without activating owner. //close the frame container window, it's a native window. diff --git a/source/gui/notifier.cpp b/source/gui/notifier.cpp index 4e98e037..3aa9cca9 100644 --- a/source/gui/notifier.cpp +++ b/source/gui/notifier.cpp @@ -169,19 +169,19 @@ namespace nana switch (arg.evt_code) { case event_code::mouse_down: - evt_ptr->mouse_down.emit(arg); + evt_ptr->mouse_down.emit(arg, nullptr); break; case event_code::mouse_up: - evt_ptr->mouse_up.emit(arg); + evt_ptr->mouse_up.emit(arg, nullptr); break; case event_code::mouse_leave: - evt_ptr->mouse_leave.emit(arg); + evt_ptr->mouse_leave.emit(arg, nullptr); break; case event_code::mouse_move: - evt_ptr->mouse_move.emit(arg); + evt_ptr->mouse_move.emit(arg, nullptr); break; case event_code::dbl_click: - evt_ptr->dbl_click.emit(arg); + evt_ptr->dbl_click.emit(arg, nullptr); break; default: break; diff --git a/source/gui/programming_interface.cpp b/source/gui/programming_interface.cpp index c645de9a..a13e81cd 100644 --- a/source/gui/programming_interface.cpp +++ b/source/gui/programming_interface.cpp @@ -184,12 +184,11 @@ namespace API { auto iwd = reinterpret_cast(wd); internal_scope_guard lock; - if (restrict::wd_manager().available(iwd) && iwd->set_events(gep)) - { - restrict::bedrock.evt_operation().make(wd, gep); - return true; - } + + if (restrict::wd_manager().available(iwd)) + iwd->set_events(gep); return false; + } void set_scheme(window wd, widget_colors* wdg_colors) diff --git a/source/gui/timer.cpp b/source/gui/timer.cpp index 58a6700e..589d0107 100644 --- a/source/gui/timer.cpp +++ b/source/gui/timer.cpp @@ -135,7 +135,7 @@ namespace nana void emit(const arg_elapse& arg) { - evt_elapse_.emit(arg); + evt_elapse_.emit(arg, nullptr); } private: const timer_identifier timer_; diff --git a/source/gui/widgets/checkbox.cpp b/source/gui/widgets/checkbox.cpp index 4a14a7fc..a99d02f4 100644 --- a/source/gui/widgets/checkbox.cpp +++ b/source/gui/widgets/checkbox.cpp @@ -94,7 +94,7 @@ namespace nana{ namespace drawerbase { impl_->crook.reverse(); arg_checkbox arg{ static_cast(impl_->widget_ptr) }; - API::events(impl_->widget_ptr->handle()).checked.emit(arg); + API::events(impl_->widget_ptr->handle()).checked.emit(arg, impl_->widget_ptr->handle()); } refresh(graph); API::lazy_refresh(); @@ -172,7 +172,7 @@ namespace nana{ namespace drawerbase API::refresh_window(handle()); arg_checkbox arg(this); - this->events().checked.emit(arg); + this->events().checked.emit(arg, this->handle()); } } diff --git a/source/gui/widgets/combox.cpp b/source/gui/widgets/combox.cpp index 6d803e18..ed39ba8e 100644 --- a/source/gui/widgets/combox.cpp +++ b/source/gui/widgets/combox.cpp @@ -41,7 +41,7 @@ namespace nana void text_changed() override { - widget_.events().text_changed.emit(::nana::arg_combox{ widget_ }); + widget_.events().text_changed.emit(::nana::arg_combox{ widget_ }, widget_); } private: ::nana::combox & widget_; @@ -355,7 +355,7 @@ namespace nana _m_draw_push_button(widget_->enabled()); _m_draw_image(); - widget_->events().selected.emit(::nana::arg_combox(*widget_)); + widget_->events().selected.emit(::nana::arg_combox(*widget_), widget_->handle()); } } diff --git a/source/gui/widgets/date_chooser.cpp b/source/gui/widgets/date_chooser.cpp index 817f8acf..3c8a1fb6 100644 --- a/source/gui/widgets/date_chooser.cpp +++ b/source/gui/widgets/date_chooser.cpp @@ -480,7 +480,7 @@ namespace nana chose_ = true; arg_datechooser evt_arg{ static_cast(API::get_widget(window_handle)) }; - API::events(window_handle).date_changed.emit(evt_arg); + API::events(window_handle).date_changed.emit(evt_arg, window_handle); } bool chose() const diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index 96b423e3..007615cd 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -1208,7 +1208,7 @@ namespace nana m.flags.checked = ck; arg_listbox arg{ item_proxy{ess_, pos}, ck}; - wd_ptr()->events().checked.emit(arg); + wd_ptr()->events().checked.emit(arg, wd_ptr()->handle()); } ++pos.item; } @@ -1279,7 +1279,7 @@ namespace nana m.flags.selected = sel; arg_listbox arg{ item_proxy(ess_, i), sel }; - wd_ptr()->events().selected.emit(arg); + wd_ptr()->events().selected.emit(arg, wd_ptr()->handle()); if (m.flags.selected) last_selected_abs = i; @@ -1371,12 +1371,12 @@ namespace nana if (for_selection) { m.flags.selected = false; - widget_->events().selected.emit(arg); + widget_->events().selected.emit(arg, widget_->handle()); } else { m.flags.checked = false; - widget_->events().checked.emit(arg); + widget_->events().checked.emit(arg, widget_->handle()); } }; @@ -1454,12 +1454,12 @@ namespace nana if (for_selection) { m.flags.selected = false; - widget_->events().selected.emit(arg); + widget_->events().selected.emit(arg, widget_->handle()); } else { m.flags.checked = false; - widget_->events().checked.emit(arg); + widget_->events().checked.emit(arg, widget_->handle()); } }; @@ -1554,7 +1554,7 @@ namespace nana m.flags.checked = ck; arg_listbox arg{ item_proxy(ess_, index_pair(cat, index)), ck}; - wd_ptr()->events().checked.emit(arg); + wd_ptr()->events().checked.emit(arg, widget_->handle()); changed = true; } @@ -3456,7 +3456,7 @@ namespace nana index_pair last_selected(item_pos.cat, lister.absolute(item_pos)); arg_listbox arg{item_proxy{essence_, last_selected}, sel}; - lister.wd_ptr()->events().selected.emit(arg); + lister.wd_ptr()->events().selected.emit(arg, lister.wd_ptr()->handle()); if (item_ptr->flags.selected) { @@ -3478,7 +3478,7 @@ namespace nana index_pair abs_pos{ item_pos.cat, lister.absolute(item_pos) }; arg_listbox arg{ item_proxy{ essence_, abs_pos }, item_ptr->flags.checked }; - lister.wd_ptr()->events().checked.emit(arg); + lister.wd_ptr()->events().checked.emit(arg, lister.wd_ptr()->handle()); if (item_ptr->flags.checked) lister.cancel_others_if_single_enabled(false, abs_pos); @@ -3572,7 +3572,7 @@ namespace nana return; arg_listbox_category arg_cat(cat_proxy(essence_, item_pos.cat)); - lister.wd_ptr()->events().category_dbl_click.emit(arg_cat); + lister.wd_ptr()->events().category_dbl_click.emit(arg_cat, lister.wd_ptr()->handle()); if (!arg_cat.category_change_blocked()){ bool do_expand = (lister.expand(item_pos.cat) == false); @@ -3741,7 +3741,7 @@ namespace nana { m.flags.checked = ck; arg_listbox arg{*this, ck}; - ess_->lister.wd_ptr()->events().checked.emit(arg); + ess_->lister.wd_ptr()->events().checked.emit(arg, ess_->lister.wd_ptr()->handle()); ess_->update(); } return *this; @@ -3760,7 +3760,7 @@ namespace nana m.flags.selected = s; // actually change selection arg_listbox arg{*this, s}; - ess_->lister.wd_ptr()->events().selected.emit(arg); + ess_->lister.wd_ptr()->events().selected.emit(arg, ess_->lister.wd_ptr()->handle()); if (m.flags.selected) { diff --git a/source/gui/widgets/slider.cpp b/source/gui/widgets/slider.cpp index 72fb50ca..45fbd122 100644 --- a/source/gui/widgets/slider.cpp +++ b/source/gui/widgets/slider.cpp @@ -385,7 +385,7 @@ namespace nana private: void _m_emit_value_changed() const { - other_.widget->events().value_changed.emit(::nana::arg_slider{ *other_.widget }); + other_.widget->events().value_changed.emit(::nana::arg_slider{ *other_.widget }, other_.widget->handle()); } nana::rectangle _m_bar_area() const diff --git a/source/gui/widgets/spinbox.cpp b/source/gui/widgets/spinbox.cpp index 880fa7f1..90397d41 100644 --- a/source/gui/widgets/spinbox.cpp +++ b/source/gui/widgets/spinbox.cpp @@ -38,7 +38,7 @@ namespace nana void text_changed() override { - widget_.events().text_changed.emit(::nana::arg_spinbox{ widget_ }); + widget_.events().text_changed.emit(::nana::arg_spinbox{ widget_ }, widget_.handle()); } private: ::nana::spinbox & widget_; diff --git a/source/gui/widgets/tabbar.cpp b/source/gui/widgets/tabbar.cpp index 8aa7037e..796fe2af 100644 --- a/source/gui/widgets/tabbar.cpp +++ b/source/gui/widgets/tabbar.cpp @@ -1562,7 +1562,7 @@ namespace nana API::lazy_refresh(); event_arg arg; - model_->widget_ptr()->events().selected.emit(arg); + model_->widget_ptr()->events().selected.emit(arg, model_->widget_ptr()->handle()); } } //end class driver @@ -1701,7 +1701,7 @@ namespace nana if (selection_changed && (active_pos != npos)) { event_arg arg; - events().selected.emit(arg); + events().selected.emit(arg, handle()); } } //end class tabbar diff --git a/source/gui/widgets/textbox.cpp b/source/gui/widgets/textbox.cpp index 3567d87e..f2a168ef 100644 --- a/source/gui/widgets/textbox.cpp +++ b/source/gui/widgets/textbox.cpp @@ -30,18 +30,18 @@ namespace drawerbase { void event_agent::first_change() { - widget_.events().first_change.emit(::nana::arg_textbox{ widget_, text_position_ }); + widget_.events().first_change.emit(::nana::arg_textbox{ widget_, text_position_ }, widget_); } void event_agent::text_changed() { - widget_.events().text_changed.emit(::nana::arg_textbox{ widget_, text_position_ }); + widget_.events().text_changed.emit(::nana::arg_textbox{ widget_, text_position_ }, widget_); } void event_agent::text_exposed(const std::vector& text_pos) { ::nana::arg_textbox arg(widget_, text_pos); - widget_.events().text_exposed.emit(arg); + widget_.events().text_exposed.emit(arg, widget_); } //end class event_agent diff --git a/source/gui/widgets/toolbar.cpp b/source/gui/widgets/toolbar.cpp index 6cf81234..728e5f2f 100644 --- a/source/gui/widgets/toolbar.cpp +++ b/source/gui/widgets/toolbar.cpp @@ -308,7 +308,7 @@ namespace nana if (impl_->which != npos && container.at(impl_->which)->enable) { ::nana::arg_toolbar arg{ *widget_, impl_->which }; - widget_->events().leave.emit(arg); + widget_->events().leave.emit(arg, widget_->handle()); } impl_->which = which; @@ -322,7 +322,7 @@ namespace nana if (impl_->state == item_renderer::state_t::highlighted) { ::nana::arg_toolbar arg{ *widget_, which }; - widget_->events().enter.emit(arg); + widget_->events().enter.emit(arg, widget_->handle()); } } @@ -346,7 +346,7 @@ namespace nana if (which != npos && impl_->items.at(which)->enable) { ::nana::arg_toolbar arg{ *widget_, which }; - widget_->events().leave.emit(arg); + widget_->events().leave.emit(arg, widget_->handle()); } } impl_->tooltip.close(); @@ -371,7 +371,7 @@ namespace nana if(impl_->which == which) { ::nana::arg_toolbar arg{ *widget_, which }; - widget_->events().selected.emit(arg); + widget_->events().selected.emit(arg, widget_->handle()); impl_->state = item_renderer::state_t::highlighted; } diff --git a/source/gui/widgets/treebox.cpp b/source/gui/widgets/treebox.cpp index 73913ba3..3f3b55ee 100644 --- a/source/gui/widgets/treebox.cpp +++ b/source/gui/widgets/treebox.cpp @@ -496,7 +496,7 @@ namespace nana { data.stop_drawing = true; item_proxy iprx(data.trigger_ptr, node); - data.widget_ptr->events().checked.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, (checkstate::unchecked != cs) }); + data.widget_ptr->events().checked.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, (checkstate::unchecked != cs) }, data.widget_ptr->handle()); data.stop_drawing = false; } return true; @@ -512,14 +512,14 @@ namespace nana if (node_state.selected) { item_proxy iprx(data.trigger_ptr, node_state.selected); - data.widget_ptr->events().selected.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, false }); + data.widget_ptr->events().selected.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, false }, data.widget_ptr->handle()); } node_state.selected = node; if (node) { item_proxy iprx(data.trigger_ptr, node_state.selected); - data.widget_ptr->events().selected.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, true }); + data.widget_ptr->events().selected.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, true }, data.widget_ptr->handle()); } data.stop_drawing = false; return true; @@ -544,7 +544,7 @@ namespace nana data.stop_drawing = true; //attr.ext_event.expand(data.widget_ptr->handle(), item_proxy(data.trigger_ptr, node), value); item_proxy iprx(data.trigger_ptr, node); - data.widget_ptr->events().expanded.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, value }); + data.widget_ptr->events().expanded.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, value }, data.widget_ptr->handle()); data.stop_drawing = false; } return true; @@ -682,7 +682,7 @@ namespace nana if (node_state.pointed) { item_proxy iprx(data.trigger_ptr, node_state.pointed); - data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, false }); + data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, false }, data.widget_ptr->handle()); if (nl.node() != node_state.pointed) close_tooltip_window(); @@ -691,7 +691,7 @@ namespace nana node_state.pointed = nl.node(); item_proxy iprx(data.trigger_ptr, node_state.pointed); - data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, true }); + data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, true }, data.widget_ptr->handle()); redraw = (node_state.comp_pointed != component::end); @@ -709,7 +709,7 @@ namespace nana redraw = true; node_state.comp_pointed = component::end; item_proxy iprx(data.trigger_ptr, node_state.pointed); - data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, false }); + data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, false }, data.widget_ptr->handle()); close_tooltip_window(); node_state.pointed = nullptr; @@ -1995,7 +1995,7 @@ namespace nana if (impl_->node_state.pointed && (!impl_->node_state.tooltip)) { item_proxy iprx(impl_->data.trigger_ptr, impl_->node_state.pointed); - impl_->data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *impl_->data.widget_ptr, iprx, false }); + impl_->data.widget_ptr->events().hovered.emit(::nana::arg_treebox{ *impl_->data.widget_ptr, iprx, false }, impl_->data.widget_ptr->handle()); impl_->node_state.pointed = nullptr; impl_->draw(false); API::lazy_refresh();