diff --git a/ChangeLog b/ChangeLog index 20e367272..38367931c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-02-16 Mike Kestner + + * glib/TypeConverter.cs : check for GType prop on all types, + not just value types, before we fall back to managed values. + * glib/Value.cs : use handle to set_boxed for IWrappers. + 2004-02-16 Mike Kestner * gdk/EventKey.cs : add a Key prop to return casted KeyVals. diff --git a/glib/TypeConverter.cs b/glib/TypeConverter.cs index aec2ad1c8..9910e1990 100644 --- a/glib/TypeConverter.cs +++ b/glib/TypeConverter.cs @@ -39,13 +39,11 @@ namespace GLibSharp { return GType.UInt; if (type.IsSubclassOf (typeof (GLib.Object))) return GType.Object; - if (type.IsValueType) { - PropertyInfo pi = type.GetProperty ("GType"); - if (pi == null) - return GType.Pointer; - else - return (GType) pi.GetValue (null, null); - } + PropertyInfo pi = type.GetProperty ("GType", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); + if (pi != null) + return (GType) pi.GetValue (null, null); + if (type.IsValueType) + return GType.Pointer; return GType.None; } diff --git a/glib/Value.cs b/glib/Value.cs index 129a2ce9f..a7460272a 100755 --- a/glib/Value.cs +++ b/glib/Value.cs @@ -372,7 +372,7 @@ namespace GLib { } else { _val = gtksharp_value_create (type.Val); } - + if (type == GType.None) g_value_set_boxed (_val, ManagedValue.WrapObject (obj)); else if (type == GType.String) @@ -396,6 +396,10 @@ namespace GLib { Marshal.StructureToPtr (obj, buf, false); g_value_set_pointer (_val, buf); } else if (g_type_is_a (type.Val, GLib.GType.Boxed.Val)) { + if (obj is IWrapper) { + g_value_set_boxed (_val, ((IWrapper)obj).Handle); + return; + } buf = Marshal.AllocHGlobal (Marshal.SizeOf (obj.GetType())); Marshal.StructureToPtr (obj, buf, false); g_value_set_boxed (_val, buf);