// GLib.Signals.Simple.cs - GLib Simple Signal implementation // // Authors: Bob Smith // Mike Kestner // // (c) 2001 Bob Smith & Mike Kestner namespace GLib { using System; using System.Runtime.InteropServices; using GLib; /// /// SimpleDelegate Delegate /// /// /// /// Used to connect to simple signals which contain no signal- /// specific data. /// public delegate void SimpleDelegate (IntPtr obj, String name); /// /// SimpleSignal Class /// /// /// /// Wraps a simple signal which contains no single-specific data. /// public class SimpleSignal { private static int _RefCount = 0; private static SimpleDelegate _Delegate; private static GCHandle _GCHandle; private static void SimpleCallback(IntPtr obj, String name) { Object o = Object.GetObject(obj); EventHandler eh = (EventHandler) o.Events[name]; if (eh != null) { eh(o, EventArgs.Empty); } } public static SimpleDelegate Delegate { get { if (_Delegate == null) { _Delegate = new SimpleDelegate(SimpleCallback); /* FIXME: Can't do this until a layout attribute is defined for SimpleCallback * apparently, since this throws an ArgumentException:Type does not have a * layout attribute. * * _GCHandle = GCHandle.Alloc (_Delegate, GCHandleType.Pinned); */ } _RefCount++; return _Delegate; } } public static void Unref() { _RefCount--; if (_RefCount < 1) { _RefCount = 0; _GCHandle.Free(); _Delegate = null; } } } }