diff --git a/ChangeLog b/ChangeLog index d8f45f52f..b97096faf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2004-11-08 Dan Winship + * glib/Object.cs (CreateNativeObject): virtualize + + * gtk/Gtk.metadata: disable the generated GType ctor on Gtk.Widget + + * gtk/Widget.custom (Widget, CreateNativeObject, + Widget_ParentSet): Connect to our own ParentSet event from + CreateNativeObject and the GType ctor, and keep a static Hashtable + of parented widgets, so that adding a managed widget to a + container keeps both the GObject and the managed object alive. + + * generator/ObjectGen.cs (GenCtors): handle the disable_gtype_ctor + flag. Also, mark GType ctors [Obsolete] + * generator/ChildProperty.cs: * generator/Property.cs: Fix child property names. diff --git a/generator/ObjectGen.cs b/generator/ObjectGen.cs index adf3b7302..f8ac8b10a 100644 --- a/generator/ObjectGen.cs +++ b/generator/ObjectGen.cs @@ -69,6 +69,12 @@ namespace GtkSharp.Generation { } } + private bool DisableGTypeCtor { + get { + return Elem.HasAttribute ("disable_gtype_ctor"); + } + } + private class DirectoryInfo { public string assembly_name; public Hashtable objects; @@ -223,7 +229,10 @@ namespace GtkSharp.Generation { gen_info.Writer.WriteLine("\t\t\tDispose();"); gen_info.Writer.WriteLine("\t\t}"); gen_info.Writer.WriteLine(); - gen_info.Writer.WriteLine("\t\tprotected " + Name + "(GLib.GType gtype) : base(gtype) {}"); + if (!DisableGTypeCtor) { + gen_info.Writer.WriteLine("\t\t[Obsolete]"); + gen_info.Writer.WriteLine("\t\tprotected " + Name + "(GLib.GType gtype) : base(gtype) {}"); + } gen_info.Writer.WriteLine("\t\tpublic " + Name + "(IntPtr raw) : base(raw) {}"); if (ctors.Count == 0 && !DisableVoidCtor) { gen_info.Writer.WriteLine(); diff --git a/glib/Object.cs b/glib/Object.cs index eefcf95cd..da479f6ce 100644 --- a/glib/Object.cs +++ b/glib/Object.cs @@ -179,6 +179,7 @@ namespace GLib { [DllImport("libgobject-2.0-0.dll")] static extern IntPtr g_object_new (IntPtr gtype, IntPtr dummy); + [Obsolete] protected Object (GType gtype) { Raw = g_object_new (gtype.Val, IntPtr.Zero); @@ -187,7 +188,7 @@ namespace GLib { [DllImport("glibsharpglue-2.0")] static extern IntPtr gtksharp_object_newv (IntPtr gtype, int n_params, string[] names, GLib.Value[] vals); - protected void CreateNativeObject (string[] names, GLib.Value[] vals) + protected virtual void CreateNativeObject (string[] names, GLib.Value[] vals) { Raw = gtksharp_object_newv (LookupGType ().Val, names.Length, names, vals); } diff --git a/gtk/Gtk.metadata b/gtk/Gtk.metadata index e68c29134..4bc39d0f0 100644 --- a/gtk/Gtk.metadata +++ b/gtk/Gtk.metadata @@ -336,6 +336,7 @@ 1 1 1 + 1 1 out 1 diff --git a/gtk/Widget.custom b/gtk/Widget.custom index 14f9a09d4..c6f777a21 100644 --- a/gtk/Widget.custom +++ b/gtk/Widget.custom @@ -22,7 +22,28 @@ // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. - +[Obsolete] +protected Widget (GLib.GType gtype) : base(gtype) +{ + ParentSet += new ParentSetHandler (Widget_ParentSet); +} + +protected override void CreateNativeObject (string[] names, GLib.Value[] vals) +{ + base.CreateNativeObject (names, vals); + ParentSet += new ParentSetHandler (Widget_ParentSet); +} + +private static Hashtable ParentedWidgets = new Hashtable (); + +private void Widget_ParentSet (object o, ParentSetArgs args) +{ + if (Parent != null && args.PreviousParent == null) + ParentedWidgets[this] = this; + else if (Parent == null && args.PreviousParent != null) + ParentedWidgets.Remove (this); +} + [DllImport("gtksharpglue-2.0")] static extern IntPtr gtksharp_gtk_widget_get_allocation (IntPtr style);