public void RemoveDelegate(Delegate d) { if (tref.Target == null) return; if (d.Method.IsDefined (typeof (ConnectBeforeAttribute), false)) { tref.Target.BeforeSignals [name] = Delegate.Remove (tref.Target.BeforeSignals [name] as Delegate, d); if (tref.Target.BeforeSignals [name] == null && before_closure != null) { before_closure.Dispose (); before_closure = null; } } else { tref.Target.AfterSignals [name] = Delegate.Remove (tref.Target.AfterSignals [name] as Delegate, d); if (tref.Target.AfterSignals [name] == null && after_closure != null) { after_closure.Dispose (); after_closure = null; } } }
void ClosureDisposedCB(object o, EventArgs args) { if (o == before_closure) { before_closure.Disposed -= new EventHandler (ClosureDisposedHandler); before_closure.Invoked -= new ClosureInvokedHandler (ClosureInvokedCB); if (tref.Target != null) tref.Target.BeforeSignals.Remove (name); before_closure = null; } else if (o == after_closure) { after_closure.Disposed -= new EventHandler (ClosureDisposedHandler); after_closure.Invoked -= new ClosureInvokedHandler (ClosureInvokedCB); if (tref.Target != null) tref.Target.AfterSignals.Remove (name); after_closure = null; } if (before_closure == null && after_closure == null) tref.Signals.Remove (name); }
public void AddDelegate(Delegate d) { if (args_type == null) args_type = d.Method.GetParameters ()[1].ParameterType; if (d.Method.IsDefined (typeof (ConnectBeforeAttribute), false)) { tref.Target.BeforeSignals [name] = Delegate.Combine (tref.Target.BeforeSignals [name] as Delegate, d); if (before_closure == null) { if (marshaler == null) before_closure = new SignalClosure (tref.Handle, name, args_type); else before_closure = new SignalClosure (tref.Handle, name, marshaler, this); before_closure.Disposed += ClosureDisposedHandler; before_closure.Invoked += ClosureInvokedHandler; before_closure.Connect (false); } } else { tref.Target.AfterSignals [name] = Delegate.Combine (tref.Target.AfterSignals [name] as Delegate, d); if (after_closure == null) { if (marshaler == null) after_closure = new SignalClosure (tref.Handle, name, args_type); else after_closure = new SignalClosure (tref.Handle, name, marshaler, this); after_closure.Disposed += ClosureDisposedHandler; after_closure.Invoked += ClosureInvokedHandler; after_closure.Connect (true); } } }