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); } }
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; }