From bc37b4ff763c8f4ce934a7e56f380268ea7026ef Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Tue, 9 Dec 2003 05:01:22 +0000 Subject: [PATCH] 2003-12-08 Mike Kestner * generator/Signal.cs : add virtual method generation for the default signal handlers. * glib/Object.cs : add g_signal_chain_from_overridden extern svn path=/trunk/gtk-sharp/; revision=20920 --- ChangeLog | 6 +++++ generator/Signal.cs | 55 ++++++++++++++++++++++++++++++++++++++++++++- glib/Object.cs | 3 +++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 5188c8eeb..8c3ce02c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-12-08 Mike Kestner + + * generator/Signal.cs : add virtual method generation for the + default signal handlers. + * glib/Object.cs : add g_signal_chain_from_overridden extern + 2003-12-08 Mike Kestner * generator/VMSignature.cs : new class to generate virtual method diff --git a/generator/Signal.cs b/generator/Signal.cs index 9830d3edd..de22cc157 100644 --- a/generator/Signal.cs +++ b/generator/Signal.cs @@ -2,7 +2,7 @@ // // Author: Mike Kestner // -// (c) 2001-2002 Mike Kestner +// (c) 2001-2003 Mike Kestner, (c) 2003 Novell, Inc. namespace GtkSharp.Generation { @@ -96,6 +96,26 @@ namespace GtkSharp.Generation { } } + private bool IsVoid { + get { + return ReturnType == "void"; + } + } + + private string MarshalReturnType { + get { + string ctype = elem ["return-type"].GetAttribute("type"); + return SymbolTable.Table.GetMarshalType (ctype); + } + } + + private string ReturnType { + get { + string ctype = elem ["return-type"].GetAttribute("type"); + return SymbolTable.Table.GetCSType (ctype); + } + } + public void GenEventHandler (GenerationInfo gen_info) { if (EventHandlerName == "EventHandler") @@ -128,6 +148,38 @@ namespace GtkSharp.Generation { sw.Close (); } + private void GenVirtualMethod (StreamWriter sw) + { + VMSignature vmsig = new VMSignature (parms); + sw.WriteLine ("\t\tprotected virtual {0} {1} ({2})", ReturnType, "On" + Name, vmsig.ToString ()); + sw.WriteLine ("\t\t{"); + if (!IsVoid) + sw.WriteLine ("\t\t\tGLib.Value ret = new GLib.Value ();"); + + sw.WriteLine ("\t\t\tIntPtr[] args = new IntPtr [" + parms.Count + "];"); + sw.WriteLine ("\t\t\targs [0] = Handle;"); + sw.WriteLine ("\t\t\tGLib.Value[] vals = new GLib.Value [" + (parms.Count - 1) + "];"); + string cleanup = ""; + for (int i = 1; i < parms.Count; i++) { + if (parms [i].PassAs == "out") { + sw.WriteLine ("\t\t\tvals [" + (i - 1) + "] = new GLib.Value ();"); + cleanup += "\t\t\t" + parms [i].Name + " = (" + parms [i].CSType + ") vals [" + (i - 1) + "];\n"; + } else if (parms [i].IsLength && parms [i - 1].IsString) + sw.WriteLine ("\t\t\tvals [" + (i - 1) + "] = new GLib.Value (" + parms [i-1].Name + ".Length);"); + else + sw.WriteLine ("\t\t\tvals [" + (i - 1) + "] = new GLib.Value (" + parms [i].Name + ");"); + + sw.WriteLine ("\t\t\targs [" + i + "] = vals [" + (i - 1) + "].Handle;"); + } + + sw.WriteLine ("\t\t\tg_signal_chain_from_overridden (args, " + (IsVoid ? "IntPtr.Zero " : "ret.Handle ") + ");"); + if (cleanup != "") + sw.WriteLine (cleanup); + if (!IsVoid) + sw.WriteLine ("\t\t\treturn (" + ReturnType + ") ret;"); + sw.WriteLine ("\t\t}\n"); + } + public void Generate (GenerationInfo gen_info, ClassBase implementor) { StreamWriter sw = gen_info.Writer; @@ -140,6 +192,7 @@ namespace GtkSharp.Generation { ns = implementor.NS; sig_handler.Generate (ns, gen_info); + GenVirtualMethod (sw); string qual_marsh = ns + "Sharp." + sig_handler.Name; sw.WriteLine("\t\t[GLib.Signal("+ cname + ")]"); diff --git a/glib/Object.cs b/glib/Object.cs index 3c9bc3ad1..839a8d6f0 100644 --- a/glib/Object.cs +++ b/glib/Object.cs @@ -361,6 +361,9 @@ namespace GLib { g_object_set_property (Raw, name, val.Handle); } + [DllImport("libgobject-2.0-0.dll")] + protected static extern void g_signal_chain_from_overridden (IntPtr[] args, IntPtr retval); + [DllImport("gtksharpglue")] static extern bool gtksharp_is_object (IntPtr obj);