예제 #1
0
        public static void Disconnect(GLib.Object o, string name, DynamicSignalHandler handler)
        {
            Key k = new Key (o, name);

            if (SignalHandlers[k] != null)
            {
                SignalInfo si = (SignalInfo)SignalHandlers[k];
                Delegate newHandler = Delegate.Remove (si.RegisteredHandler, handler);

                if (newHandler == null || handler == null)
                {
                    g_signal_handler_disconnect (o.Handle, si.HandlerId);
                    SignalHandlers.Remove (k);
                }
                else
                    si.RegisteredHandler = newHandler;
            }
        }
예제 #2
0
        static void OnMarshal(IntPtr closure, ref GLib.Value retval, uint argc, IntPtr argsPtr, IntPtr ihint, IntPtr data)
        {
            object [] args = new object[argc - 1];
            object    o    = ((GLib.Value)Marshal.PtrToStructure(argsPtr, typeof(GLib.Value))).Val;

            for (int i = 1; i < argc; i++)
            {
                IntPtr struct_ptr   = (IntPtr)((long)argsPtr + (i * gvalue_struct_size));
                Type   detectedType = GLib.GType.LookupType(Marshal.ReadIntPtr(struct_ptr));

                if (detectedType.IsSubclassOf(typeof(Opaque)))
                {
                    args[i - 1] = (Opaque)Opaque.GetOpaque(g_value_peek_pointer(struct_ptr), detectedType, false);
                }
                else
                {
                    GLib.Value argument = (GLib.Value)Marshal.PtrToStructure(struct_ptr, typeof(GLib.Value));
                    args[i - 1] = argument.Val;
                }
            }

            if (data == IntPtr.Zero)
            {
                Console.Error.WriteLine("No available data");
            }

            Key k = (Key)((GCHandle)data).Target;

            if (k != null)
            {
                SignalArgs arg = new SignalArgs();
                arg.Args = args;
                SignalInfo           si      = (SignalInfo)SignalHandlers[k];
                DynamicSignalHandler handler = (DynamicSignalHandler)si.RegisteredHandler;
                handler(o, arg);

                if (arg.RetVal != null)
                {
                    retval.Val = arg.RetVal;
                }
            }
        }
예제 #3
0
        public static void Connect(GLib.Object o, string name, bool after, DynamicSignalHandler handler)
        {
            Delegate newHandler;

            Key k = new Key(o, name);

            if (SignalHandlers[k] != null)
            {
                SignalInfo si = (SignalInfo)SignalHandlers[k];
                newHandler           = Delegate.Combine(si.RegisteredHandler, handler);
                si.RegisteredHandler = newHandler;
            }
            else
            {
                IntPtr closure = g_closure_new_simple(_closureSize, IntPtr.Zero);
                g_closure_set_meta_marshal(closure, (IntPtr)GCHandle.Alloc(k), marshalHandler);
                uint signalId = g_signal_connect_closure(o.Handle, name, closure, after);
                SignalHandlers.Add(k, new SignalInfo(signalId, closure, handler));
            }
        }
예제 #4
0
        public static void Disconnect(GLib.Object o, string name, DynamicSignalHandler handler)
        {
            Key k = new Key(o, name);

            if (SignalHandlers[k] != null)
            {
                SignalInfo si         = (SignalInfo)SignalHandlers[k];
                Delegate   newHandler = Delegate.Remove(si.RegisteredHandler, handler);

                if (newHandler == null || handler == null)
                {
                    g_signal_handler_disconnect(o.Handle, si.HandlerId);
                    SignalHandlers.Remove(k);
                }
                else
                {
                    si.RegisteredHandler = newHandler;
                }
            }
        }
예제 #5
0
        public static void Connect(GLib.Object o, string name, bool after, DynamicSignalHandler handler)
        {
            Delegate newHandler;

            Key k = new Key (o, name);

            if (SignalHandlers[k] != null)
            {
                SignalInfo si = (SignalInfo) SignalHandlers[k];
                newHandler = Delegate.Combine (si.RegisteredHandler, handler);
                si.RegisteredHandler = newHandler;
            }
            else
            {
                IntPtr closure = g_closure_new_simple (_closureSize, IntPtr.Zero);
                g_closure_set_meta_marshal (closure, (IntPtr)GCHandle.Alloc (k),  marshalHandler);
                uint signalId = g_signal_connect_closure (o.Handle, name, closure, after);
                SignalHandlers.Add (k, new SignalInfo (signalId, closure, handler));
            }
        }
예제 #6
0
 public static void Connect(GLib.Object o, string name, DynamicSignalHandler handler)
 {
     Connect(o, name, false, handler);
 }
예제 #7
0
 public static void Connect(GLib.Object o, string name, DynamicSignalHandler handler)
 {
     Connect (o, name, false, handler);
 }