void MCInternalObjectListenerListListeners(MCExecPoint &ep) { ep . clear(); MCObjectHandle *t_current_object; t_current_object = ep . getobj() -> gethandle(); bool t_first; t_first = true; MCObjectListener *t_prev_listener; t_prev_listener = nil; MCObjectListener *t_listener; t_listener = s_object_listeners; while(t_listener != nil) { if (!t_listener -> object -> Exists()) remove_object_listener_from_list(t_listener, t_prev_listener); else { MCObjectListenerTarget *t_target; t_target = nil; MCObjectListenerTarget *t_prev_target; t_prev_target = nil; MCExecPoint ep1(ep); t_listener -> object -> Get() -> getprop(0, P_LONG_ID, ep1, false); for (t_target = t_listener -> targets; t_target != nil; t_target = t_target -> next) { if (!t_target -> target -> Exists()) remove_object_listener_target_from_list(t_target, t_prev_target, t_listener, t_prev_listener); else if (t_target -> target == t_current_object) { ep . concatmcstring(ep1 . getsvalue(), EC_RETURN, t_first); t_first = false; } } t_prev_listener = t_listener; } if (t_listener != nil) t_listener = t_listener -> next; else t_listener = s_object_listeners; } }
void MCInternalObjectListenerGetListeners(MCExecContext& ctxt, MCStringRef*& r_listeners, uindex_t& r_count) { MCObjectHandle *t_current_object; t_current_object = ctxt . GetObject() -> gethandle(); MCObjectListener *t_prev_listener; t_prev_listener = nil; MCObjectListener *t_listener; t_listener = s_object_listeners; MCAutoArray<MCStringRef> t_listeners; while(t_listener != nil) { MCStringRef t_string; if (!t_listener -> object -> Exists()) remove_object_listener_from_list(t_listener, t_prev_listener); else { MCObjectListenerTarget *t_target; t_target = nil; MCObjectListenerTarget *t_prev_target; t_prev_target = nil; MCAutoValueRef t_long_id; t_listener -> object -> Get() -> names(P_LONG_ID, &t_long_id); for (t_target = t_listener -> targets; t_target != nil; t_target = t_target -> next) { if (!t_target -> target -> Exists()) remove_object_listener_target_from_list(t_target, t_prev_target, t_listener, t_prev_listener); else if (t_target -> target == t_current_object) { ctxt . ConvertToString(*t_long_id, t_string); t_listeners . Push(t_string); } } t_prev_listener = t_listener; } if (t_listener != nil) t_listener = t_listener -> next; else t_listener = s_object_listeners; } t_listeners . Take(r_listeners, r_count); }
void exec_ctxt(MCExecContext &ctxt) { MCObject *t_object; uint4 parid; if (!m_object -> getobj(ctxt, t_object, parid, True)) { // Was formerly returning ES_NORMAL ctxt . IgnoreLastError(); return; } MCObjectListener *t_prev_listener; t_prev_listener = nil; MCObjectListener *t_listener; t_listener = nil; MCObjectHandle *t_object_handle; t_object_handle = t_object -> gethandle(); for (t_listener = s_object_listeners; t_listener != nil; t_listener = t_listener -> next) { if (t_listener -> object == t_object_handle) break; t_prev_listener = t_listener; } if (t_listener != nil) { MCObjectListenerTarget *t_target; t_target = nil; MCObjectListenerTarget *t_prev_target; t_prev_target = nil; MCObjectHandle *t_target_object; t_target_object = ctxt . GetObjectHandle(); for (t_target = t_listener -> targets; t_target != nil; t_target = t_target -> next) { if (t_target -> target == t_target_object) { remove_object_listener_target_from_list(t_target, t_prev_target, t_listener, t_prev_listener); return; } t_prev_target = t_target; } } }
Exec_stat exec(MCExecPoint& ep) { MCObject *t_object; uint4 parid; if (m_object -> getobj(ep, t_object, parid, True) != ES_NORMAL) return ES_NORMAL; MCObjectListener *t_prev_listener; t_prev_listener = nil; MCObjectListener *t_listener; t_listener = nil; MCObjectHandle *t_object_handle; t_object_handle = t_object -> gethandle(); for (t_listener = s_object_listeners; t_listener != nil; t_listener = t_listener -> next) { if (t_listener -> object == t_object_handle) break; t_prev_listener = t_listener; } if (t_listener != nil) { MCObjectListenerTarget *t_target; t_target = nil; MCObjectListenerTarget *t_prev_target; t_prev_target = nil; MCObjectHandle *t_target_object; t_target_object = ep . getobj() -> gethandle(); for (t_target = t_listener -> targets; t_target != nil; t_target = t_target -> next) { if (t_target -> target == t_target_object) { remove_object_listener_target_from_list(t_target, t_prev_target, t_listener, t_prev_listener); return ES_NORMAL; } t_prev_target = t_target; } } return ES_NORMAL; }
void MCInternalObjectListenerMessagePendingListeners(void) { if (MCobjectpropertieschanged) { MCobjectpropertieschanged = False; MCObjectListener *t_prev_listener; t_prev_listener = nil; MCObjectListener *t_listener; t_listener = s_object_listeners; while(t_listener != nil) { // MW-2013-08-27: [[ Bug 11126 ]] This static is updated by the remove_* functions // to ensure we don't get any dangling pointers. s_next_listener_to_process = t_listener -> next; if (!t_listener -> object -> Exists()) remove_object_listener_from_list(t_listener, t_prev_listener); else { uint8_t t_properties_changed; t_properties_changed = t_listener -> object -> Get() -> propertieschanged(); if (t_properties_changed != kMCPropertyChangedMessageTypeNone) { MCExecPoint ep(nil, nil, nil); t_listener -> object -> Get() -> getprop(0, P_LONG_ID, ep, False); MCObjectListenerTarget *t_target; t_target = nil; MCObjectListenerTarget *t_prev_target; t_prev_target = nil; double t_new_time; t_new_time = MCS_time(); if (t_listener -> last_update_time + MCpropertylistenerthrottletime / 1000.0 < t_new_time) { t_listener -> last_update_time = t_new_time; t_target = t_listener->targets; while (t_target != nil) { // MW-2013-08-27: [[ Bug 11126 ]] This static is updated by the remove_* functions // to ensure we don't get any dangling pointers. s_next_listener_target_to_process = t_target -> next; if (!t_target -> target -> Exists()) remove_object_listener_target_from_list(t_target, t_prev_target, t_listener, t_prev_listener); else { // MM-2012-11-06: Added resizeControl(Started/Ended) and gradientEdit(Started/Ended) messages. if (t_properties_changed & kMCPropertyChangedMessageTypePropertyChanged) t_target -> target -> Get() -> message_with_args(MCM_property_changed, ep . getsvalue()); if (t_properties_changed & kMCPropertyChangedMessageTypeResizeControlStarted) t_target -> target -> Get() -> message_with_args(MCM_resize_control_started, ep . getsvalue()); if (t_properties_changed & kMCPropertyChangedMessageTypeResizeControlEnded) t_target -> target -> Get() -> message_with_args(MCM_resize_control_ended, ep . getsvalue()); if (t_properties_changed & kMCPropertyChangedMessageTypeGradientEditStarted) t_target -> target -> Get() -> message_with_args(MCM_gradient_edit_started, ep . getsvalue()); if (t_properties_changed & kMCPropertyChangedMessageTypeGradientEditEnded) t_target -> target -> Get() -> message_with_args(MCM_gradient_edit_ended, ep . getsvalue()); t_prev_target = t_target; } t_target = s_next_listener_target_to_process; } } else t_listener -> object -> Get() -> signallistenerswithmessage(t_properties_changed); } t_prev_listener = t_listener; } // MW-2013-08-27: [[ Bug 11126 ]] Use the static as the next in the chain. t_listener = s_next_listener_to_process; } } }