Esempio n. 1
0
        static void MarshalCallback(IntPtr raw_closure, IntPtr return_val, uint n_param_vals, IntPtr param_values, IntPtr invocation_hint, IntPtr marshal_data)
        {
            string message = String.Empty;

            try {
                SignalClosure closure = closures [raw_closure] as SignalClosure;
                message = "Marshaling " + closure.name + " signal";
                Value objval = (Value) Marshal.PtrToStructure (param_values, typeof (Value));
                GObject.Object __obj = objval.Val as GObject.Object;
                if (__obj == null)
                    return;

                if (closure.args_type == typeof (EventArgs)) {
                    closure.Invoke (new ClosureInvokedArgs (__obj, EventArgs.Empty));
                    return;
                }

                SignalArgs args = Activator.CreateInstance (closure.args_type, new object [0]) as SignalArgs;
                args.Args = new object [n_param_vals - 1];
                GObject.Value[] vals = new GObject.Value [n_param_vals - 1];
                for (int i = 1; i < n_param_vals; i++) {
                    IntPtr ptr = new IntPtr (param_values.ToInt64 () + i * Marshal.SizeOf (typeof (Value)));
                    vals [i - 1] = (Value) Marshal.PtrToStructure (ptr, typeof (Value));
                    args.Args [i - 1] = vals [i - 1].Val;
                }
                ClosureInvokedArgs ci_args = new ClosureInvokedArgs (__obj, args);
                closure.Invoke (ci_args);
                for (int i = 1; i < n_param_vals; i++) {
                    vals [i - 1].Update (args.Args [i - 1]);
                    IntPtr ptr = new IntPtr (param_values.ToInt64 () + i * Marshal.SizeOf (typeof (Value)));
                    Marshal.StructureToPtr (vals [i - 1], ptr, false);
                }
                if (return_val == IntPtr.Zero || args.RetVal == null)
                    return;

                Value ret = (Value) Marshal.PtrToStructure (return_val, typeof (Value));
                ret.Val = args.RetVal;
                Marshal.StructureToPtr (ret, return_val, false);
            } catch (Exception e) {
                Console.WriteLine (message);
                ExceptionManager.RaiseUnhandledException (e, false);
            }
        }
Esempio n. 2
0
        public static object Emit(GObject.Object instance, string detailed_signal, params object[] args)
        {
            uint gquark, signal_id;
            string signal_name;
            ParseSignalDetail (detailed_signal, out signal_name, out gquark);
            signal_id = GetSignalId (signal_name, instance);
            if (signal_id <= 0)
                throw new ArgumentException ("Invalid signal name: " + signal_name);
            GObject.Value[] vals = new GObject.Value [args.Length + 1];
            GObject.ValueArray inst_and_params = new GObject.ValueArray ((uint) args.Length + 1);

            vals [0] = new GObject.Value (instance);
            inst_and_params.Append (vals [0]);
            for (int i = 1; i < vals.Length; i++) {
                vals [i] = new GObject.Value (args [i - 1]);
                inst_and_params.Append (vals [i]);
            }

            object ret_obj = null;
            Query query;
            g_signal_query (signal_id, out query);
            if (query.return_type != GType.None.Val) {
                GObject.Value ret = GObject.Value.Empty;
                g_signal_emitv (inst_and_params.ArrayPtr, signal_id, gquark, ref ret);
                ret_obj = ret.Val;
                ret.Dispose ();
            } else
                g_signal_emitv (inst_and_params.ArrayPtr, signal_id, gquark, IntPtr.Zero);

            foreach (GObject.Value val in vals)
                val.Dispose ();

            return ret_obj;
        }