From 8364dd2be1aef3b0bcf5b07423b8c94fd7450e6f Mon Sep 17 00:00:00 2001
From: Mike Kestner <mkestner@gmail.com>
Date: Fri, 28 Jan 2005 20:24:14 +0000
Subject: [PATCH] 2005-01-28  Mike Kestner  <mkestner@novell.com>

	* generator/ReturnValue.cs : use ToNativeReturnType for ToNativeType
	instead of MarshalType.
	* generator/Signal.cs : deal with boxed return values. beef up return
	handling in the default handler generation code.
	* generator/SignalHandler.cs : use ToNative return types for native
	callbacks. Remove redundant casting/conversion in callback impl.
	[Fixes #71899]

svn path=/trunk/gtk-sharp/; revision=39724
---
 ChangeLog                  | 12 ++++++++++--
 generator/ReturnValue.cs   |  2 +-
 generator/Signal.cs        |  6 +++++-
 generator/SignalHandler.cs |  6 +++---
 4 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3abe6d506..5c4a82a29 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,19 @@
+2005-01-28  Mike Kestner  <mkestner@novell.com>
+
+	* generator/ReturnValue.cs : use ToNativeReturnType for ToNativeType
+	instead of MarshalType.
+	* generator/Signal.cs : deal with boxed return values. beef up return
+	handling in the default handler generation code.
+	* generator/SignalHandler.cs : use ToNative return types for native 
+	callbacks. Remove redundant casting/conversion in callback impl.
+	[Fixes #71899]
+
 2005-01-28  Dan Winship  <danw@novell.com>
 
 	* glib/Object.cs (AddNotification, RemoveNotification): methods to
 	subscribe to the "notify" signal (with property details). [#71684]
-
 	* glib/GLibSharp.voidObjectIntPtrSignal.cs: autogenerated, for
 	notifications
-
 	* glib/NotifyHandler.cs: sort of autogenerated
 
 2005-01-28  Mike Kestner  <mkestner@novell.com>
diff --git a/generator/ReturnValue.cs b/generator/ReturnValue.cs
index 702d3c277..bf4d062c2 100644
--- a/generator/ReturnValue.cs
+++ b/generator/ReturnValue.cs
@@ -71,7 +71,7 @@ namespace GtkSharp.Generation {
 
 		public string ToNativeType {
 			get {
-				return SymbolTable.Table.GetMarshalType (CType) + (IsArray ? "[]" : String.Empty);
+				return SymbolTable.Table.GetToNativeReturnType (CType) + (IsArray ? "[]" : String.Empty);
 			}
 		}
 
diff --git a/generator/Signal.cs b/generator/Signal.cs
index 56977059b..50cccccdd 100644
--- a/generator/Signal.cs
+++ b/generator/Signal.cs
@@ -130,6 +130,8 @@ namespace GtkSharp.Generation {
 
 				if (igen is ObjectGen)
 					return "GLib.GType.Object";
+				if (igen is BoxedGen)
+					return retval.CSType + ".GType";
 
 				switch (retval.CSType) {
 				case "bool":
@@ -237,9 +239,11 @@ namespace GtkSharp.Generation {
 			sw.WriteLine ("\t\t{");
 			sw.WriteLine ("\t\t\t{0} obj = GLib.Object.GetObject ({1}, false) as {0};", implementor != null ? implementor.Name : container_type.Name, parms[0].Name);
 			sw.Write (call.Setup ("\t\t\t"));
-			sw.Write ("\t\t\t{0}", IsVoid ? "" : "return ");
+			sw.Write ("\t\t\t{0}", IsVoid ? "" : retval.CSType == retval.ToNativeType ? "return " : retval.CSType + " raw_ret = ");
 			sw.WriteLine ("obj.{0} ({1});", "On" + Name, call.ToString ());
 			sw.Write (call.Finish ("\t\t\t"));
+			if (!IsVoid && retval.CSType != retval.ToNativeType)
+				sw.WriteLine ("\t\t\treturn {0};", SymbolTable.Table.ToNativeReturn (retval.CType, "raw_ret"));
 			sw.WriteLine ("\t\t}\n");
 			string cname = "\"" + elem.GetAttribute("cname") + "\"";
 			sw.WriteLine ("\t\tprivate static void Override" + Name + " (GLib.GType gtype)");
diff --git a/generator/SignalHandler.cs b/generator/SignalHandler.cs
index 7bd5b5039..d1630aa37 100644
--- a/generator/SignalHandler.cs
+++ b/generator/SignalHandler.cs
@@ -120,14 +120,14 @@ namespace GtkSharp.Generation {
 			sw.WriteLine("\tusing System;");
 			sw.WriteLine("\tusing System.Runtime.InteropServices;");
 			sw.WriteLine();
-			sw.Write("\tinternal delegate " + retval.MarshalType + " ");
+			sw.Write("\tinternal delegate " + retval.ToNativeType + " ");
 			sw.WriteLine(DelegateName + "(" + ISig + ", int key);");
 			sw.WriteLine();
 			sw.WriteLine("\tinternal class " + Name + " : GLib.SignalCallback {");
 			sw.WriteLine();
 			sw.WriteLine("\t\tprivate static " + DelegateName + " _Delegate;");
 			sw.WriteLine();
-			sw.Write("\t\tprivate static " + retval.MarshalType + " ");
+			sw.Write("\t\tprivate static " + retval.ToNativeType + " ");
 			sw.WriteLine(CallbackName + "(" + ISig + ", int key)");
 			sw.WriteLine("\t\t{");
 			sw.WriteLine("\t\t\tif (!_Instances.Contains(key))");
@@ -179,7 +179,7 @@ namespace GtkSharp.Generation {
 					else
 						sw.WriteLine ("\t\t\t\tthrow new Exception(\"args.RetVal unset in callback\");");
 
-					sw.WriteLine("\t\t\treturn (" + retval.MarshalType + ") " + table.ToNativeReturn (retval.CType, "((" + retval.CSType + ")args.RetVal)") + ";");
+					sw.WriteLine("\t\t\treturn " + table.ToNativeReturn (retval.CType, "((" + retval.CSType + ")args.RetVal)") + ";");
 				}
 				sw.WriteLine("\t\t}");
 				sw.WriteLine();