/** * Updates our command to @a new_command. */ void wml_menu_item::update_command(const config & new_command) { // If there is an old command, remove it from the event handlers. if ( !command_.empty() ) { manager::iteration iter(event_name_); while ( handler_ptr hand = *iter ) { if ( hand->is_menu_item() ) { LOG_NG << "Removing command for " << event_name_ << ".\n"; remove_event_handler(command_["id"].str()); } ++iter; } } // Update our stored command. if ( new_command.empty() ) command_.clear(); else { command_ = new_command; // Set some fields required by event processing. config::attribute_value & event_id = command_["id"]; if ( event_id.empty() && !item_id_.empty() ) { event_id = item_id_; } command_["name"] = event_name_; command_["first_time_only"] = false; // Register the event. LOG_NG << "Setting command for " << event_name_ << " to:\n" << command_; add_event_handler(command_, true); } }
/** * Removes the implicit event handler for an inlined [command]. */ void wml_menu_item::finish_handler() const { if ( !command_.empty() ) remove_event_handler(command_["id"]); // Hotkey support if ( use_hotkey_ ) hotkey::remove_wml_hotkey(hotkey_id_); }
HRESULT set_event_handler(EventTarget *event_target, eventid_t eid, VARIANT *var) { switch(V_VT(var)) { case VT_NULL: remove_event_handler(event_target, eid); return S_OK; case VT_DISPATCH: return set_event_handler_disp(event_target, eid, V_DISPATCH(var)); case VT_BSTR: { VARIANT *v; HRESULT hres; /* * Setting event handler to string is a rare case and we don't want to * complicate nor increase memory of event_target_t for that. Instead, * we store the value in DispatchEx, which can already handle custom * properties. */ remove_event_handler(event_target, eid); hres = dispex_get_dprop_ref(&event_target->dispex, event_info[eid].attr_name, TRUE, &v); if(FAILED(hres)) return hres; V_BSTR(v) = SysAllocString(V_BSTR(var)); if(!V_BSTR(v)) return E_OUTOFMEMORY; V_VT(v) = VT_BSTR; return S_OK; } default: FIXME("not handler %s\n", debugstr_variant(var)); /* fall through */ case VT_EMPTY: return E_NOTIMPL; } return S_OK; }
HRESULT set_event_handler(event_target_t **event_target, nsIDOMNode *nsnode, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var) { switch(V_VT(var)) { case VT_NULL: return remove_event_handler(event_target, eid); case VT_DISPATCH: return set_event_handler_disp(event_target, nsnode, doc, eid, V_DISPATCH(var)); default: FIXME("not supported vt=%d\n", V_VT(var)); case VT_EMPTY: return E_NOTIMPL; } return S_OK; }
HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var) { switch(V_VT(var)) { case VT_NULL: return remove_event_handler(event_target, eid); case VT_DISPATCH: return set_event_handler_disp(event_target, doc, eid, V_DISPATCH(var)); default: FIXME("not handler %s\n", debugstr_variant(var)); /* fall through */ case VT_EMPTY: return E_NOTIMPL; } return S_OK; }
static HRESULT set_event_handler_disp(EventTarget *event_target, eventid_t eid, IDispatch *disp) { event_target_t *data; remove_event_handler(event_target, eid); if(!disp) return S_OK; data = get_event_target_data(event_target, TRUE); if(!data) return E_OUTOFMEMORY; if(!alloc_handler_vector(data, eid, 0)) return E_OUTOFMEMORY; data->event_table[eid]->handler_prop = disp; IDispatch_AddRef(disp); bind_event(event_target, eid); return S_OK; }
static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDocumentNode *doc, eventid_t eid, IDispatch *disp) { event_target_t *event_target; if(!disp) return remove_event_handler(event_target_ptr, eid); event_target = get_event_target(event_target_ptr); if(!event_target) return E_OUTOFMEMORY; if(!alloc_handler_vector(event_target, eid, 0)) return E_OUTOFMEMORY; if(event_target->event_table[eid]->handler_prop) IDispatch_Release(event_target->event_table[eid]->handler_prop); event_target->event_table[eid]->handler_prop = disp; IDispatch_AddRef(disp); return ensure_nsevent_handler(doc, event_target, eid); }