diff --git a/ChangeLog b/ChangeLog index 3baa21ffe..b989f46d0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2002-09-04 Mike Kestner + + * generator/ObjectGen.cs : generate dtors. + * glib/Object.cs : Implement IDisposable. Add a new DisposeNative + method. Implement default dtor. + * glue/object.c : new gtksharp_object_unref_if_floating method. + * gtk/Object.custom : override DisposeNative to check float bit. + 2002-09-03 Juli Mallett * parser/Makefile.in: Use $(CC) instead of 'cc'. diff --git a/generator/ObjectGen.cs b/generator/ObjectGen.cs index 6155c6bd2..95633b87f 100644 --- a/generator/ObjectGen.cs +++ b/generator/ObjectGen.cs @@ -185,6 +185,11 @@ namespace GtkSharp.Generation { if (!Elem.HasAttribute("parent")) return; + sw.WriteLine("\t\t~" + Name + "()"); + sw.WriteLine("\t\t{"); + sw.WriteLine("\t\t\tDispose();"); + sw.WriteLine("\t\t}"); + sw.WriteLine(); sw.WriteLine("\t\tpublic " + Name + "(IntPtr raw) : base(raw) {}"); sw.WriteLine(); diff --git a/glib/Object.cs b/glib/Object.cs index d304e69b8..09d4ff1c1 100644 --- a/glib/Object.cs +++ b/glib/Object.cs @@ -20,14 +20,50 @@ namespace GLib { /// Wrapper class for GObject. /// - public class Object : IWrapper { + public class Object : IWrapper, IDisposable { // Private class and instance members IntPtr _obj; EventHandlerList _events; + bool disposed = false; Hashtable Data; static Hashtable Objects = new Hashtable(); + ~Object () + { + Dispose (); + } + + /// + /// Dispose Method + /// + /// + /// + /// Disposes of the raw object. Only override this if + /// the Raw object should not be unref'd when the object + /// is garbage collected. + /// + + public void Dispose () + { + if (disposed) + return; + + DisposeNative (); + disposed = true; + } + + [DllImport("gobject-2.0")] + static extern void g_object_unref (IntPtr raw); + + protected virtual void DisposeNative () + { + if (_obj == IntPtr.Zero) + return; + + g_object_unref (_obj); + } + /// /// GetObject Shared Method /// diff --git a/glue/Makefile.am b/glue/Makefile.am index 00b465204..934401fa5 100644 --- a/glue/Makefile.am +++ b/glue/Makefile.am @@ -9,6 +9,7 @@ BASESOURCES = \ error.c \ event.c \ slist.c \ + object.c \ paned.c \ style.c \ type.c \ diff --git a/glue/object.c b/glue/object.c new file mode 100644 index 000000000..cecc68644 --- /dev/null +++ b/glue/object.c @@ -0,0 +1,17 @@ +/* object.c : Glue to clean up GtkObject references. + * + * Author: Mike Kestner + * + * 2002 Mike Kestner + */ + +#include +#include + +void +gtksharp_object_unref_if_floating (GObject *obj) +{ + if (GTK_OBJECT_FLOATING (obj)) + g_object_unref (obj); +} + diff --git a/gtk/Object.custom b/gtk/Object.custom new file mode 100755 index 000000000..d53d9a960 --- /dev/null +++ b/gtk/Object.custom @@ -0,0 +1,17 @@ +// Gtk.Object.custom - Gtk Window class customizations +// +// Author: Mike Kestner +// +// (c) 2002 Mike Kestner +// +// This code is inserted after the automatically generated code. + + + [DllImport("gtksharpglue")] + static extern void gtksharp_object_unref_if_floating (IntPtr raw); + + protected override void DisposeNative () + { + gtksharp_object_unref_if_floating (Handle); + } +