Author: mkestner
Date: 2008-01-23 22:52:05 -0500 (Wed, 23 Jan 2008)
New Revision: 93762

Modified:
   branches/gtk-sharp-2-468-branch/gtk-sharp/ChangeLog
   branches/gtk-sharp-2-468-branch/gtk-sharp/bootstrap-2.8
   branches/gtk-sharp-2-468-branch/gtk-sharp/gconf/GConf/Makefile.am
   branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Object.cs
   branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Signal.cs
   branches/gtk-sharp-2-468-branch/gtk-sharp/glib/ToggleRef.cs
Log:

2008-01-23  Mike Kestner  <[EMAIL PROTECTED]>

        * bootstrap-2.8: bump version
        * glib/Object.cs: backport rework from trunk.
        * glib/Signal.cs: backport rework from trunk.
        * glib/ToggleRef.cs: backport rework from trunk.
        * gconf/GConf/Makefile.am: add cleanfile


Modified: branches/gtk-sharp-2-468-branch/gtk-sharp/ChangeLog
===================================================================
--- branches/gtk-sharp-2-468-branch/gtk-sharp/ChangeLog 2008-01-24 03:50:49 UTC 
(rev 93761)
+++ branches/gtk-sharp-2-468-branch/gtk-sharp/ChangeLog 2008-01-24 03:52:05 UTC 
(rev 93762)
@@ -1,3 +1,11 @@
+2008-01-23  Mike Kestner  <[EMAIL PROTECTED]>
+
+       * bootstrap-2.8: bump version
+       * glib/Object.cs: backport rework from trunk.
+       * glib/Signal.cs: backport rework from trunk.
+       * glib/ToggleRef.cs: backport rework from trunk.
+       * gconf/GConf/Makefile.am: add cleanfile
+
 2008-01-24  Lluis Sanchez Gual  <[EMAIL PROTECTED]>
  
        * glade/XML.custom: due to a recent Mono fix (bug #322762),

Modified: branches/gtk-sharp-2-468-branch/gtk-sharp/bootstrap-2.8
===================================================================
--- branches/gtk-sharp-2-468-branch/gtk-sharp/bootstrap-2.8     2008-01-24 
03:50:49 UTC (rev 93761)
+++ branches/gtk-sharp-2-468-branch/gtk-sharp/bootstrap-2.8     2008-01-24 
03:52:05 UTC (rev 93762)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # Run this to set configure.in up for an API version.
 
-GTK_SHARP_VERSION=2.8.4
+GTK_SHARP_VERSION=2.8.5
 ASSEMBLY_VERSION=2.8.0.0
 POLICY_VERSIONS="2.4 2.6"
 GTK_REQUIRED_VERSION=2.8.0

Modified: branches/gtk-sharp-2-468-branch/gtk-sharp/gconf/GConf/Makefile.am
===================================================================
--- branches/gtk-sharp-2-468-branch/gtk-sharp/gconf/GConf/Makefile.am   
2008-01-24 03:50:49 UTC (rev 93761)
+++ branches/gtk-sharp-2-468-branch/gtk-sharp/gconf/GConf/Makefile.am   
2008-01-24 03:52:05 UTC (rev 93762)
@@ -2,7 +2,7 @@
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = gconf-sharp-2.0.pc
 noinst_DATA = $(TARGET) $(POLICY_ASSEMBLIES)
-CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb gtk-sharp.snk $(POLICY_ASSEMBLIES) 
$(POLICY_CONFIGS)
+CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb gtk-sharp.snk $(POLICY_ASSEMBLIES) 
$(POLICY_CONFIGS) AssemblyInfo.cs
 DISTCLEANFILES = gconf-sharp-2.0.pc $(ASSEMBLY).config
 
 POLICY_ASSEMBLIES = $(addsuffix .$(ASSEMBLY), $(addprefix policy., 
$(POLICY_VERSIONS)))

Modified: branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Object.cs
===================================================================
--- branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Object.cs    2008-01-24 
03:50:49 UTC (rev 93761)
+++ branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Object.cs    2008-01-24 
03:52:05 UTC (rev 93762)
@@ -32,6 +32,7 @@
        public class Object : IWrapper, IDisposable {
 
                IntPtr handle;
+               ToggleRef tref;
                bool disposed = false;
                Hashtable data;
                static Hashtable Objects = new Hashtable();
@@ -40,11 +41,11 @@
 
                ~Object ()
                {
-                       lock (PendingDestroys){
+                       lock (PendingDestroys) {
                                lock (Objects) {
                                        if (Objects[Handle] is ToggleRef)
-                                               PendingDestroys.Add 
(Objects[Handle]);
-                                       Objects.Remove(Handle);
+                                               PendingDestroys.Add (Objects 
[Handle]);
+                                       Objects.Remove (Handle);
                                }
                                if (!idle_queued){
                                        Timeout.Add (50, new TimeoutHandler 
(PerformQueuedUnrefs));
@@ -58,7 +59,7 @@
                
                static bool PerformQueuedUnrefs ()
                {
-                       object[] references;
+                       object [] references;
 
                        lock (PendingDestroys){
                                references = new object [PendingDestroys.Count];
@@ -79,15 +80,15 @@
                                return;
 
                        disposed = true;
+                       ToggleRef toggle_ref = Objects [Handle] as ToggleRef;
+                       Objects.Remove (Handle);
                        try {
-                               ToggleRef toggle_ref = Objects [Handle] as 
ToggleRef;
                                if (toggle_ref != null)
                                        toggle_ref.Free ();
                        } catch (Exception e) {
                                Console.WriteLine ("Exception while disposing a 
" + this + " in Gtk#");
                                throw e;
                        }
-                       Objects.Remove (Handle);
                        handle = IntPtr.Zero;
                        GC.SuppressFinalize (this);
                }
@@ -117,7 +118,7 @@
                        if (!owned_ref)
                                g_object_ref (o);
 
-                       obj = GLib.ObjectManager.CreateObject (o); 
+                       obj = GLib.ObjectManager.CreateObject(o); 
                        if (obj == null) {
                                g_object_unref (o);
                                return null;
@@ -161,7 +162,7 @@
                                if (m != null)
                                        m.Invoke (null, parms);
                        }
-                       
+
                        for (Type curr = t; curr != typeof(GLib.Object); curr = 
curr.BaseType) {
 
                                if (curr.Assembly.IsDefined (typeof 
(IgnoreClassInitializersAttribute), false))
@@ -276,14 +277,17 @@
                                        return;
 
                                if (handle != IntPtr.Zero) {
-                                       ToggleRef tref = Objects [handle] as 
ToggleRef;
-                                       if (tref != null)
+                                       Objects.Remove (handle);
+                                       if (tref != null) {
                                                tref.Free ();
-                                       Objects.Remove (handle);
+                                               tref = null;
+                                       }
                                }
                                handle = value;
-                               if (value != IntPtr.Zero)
-                                       Objects [value] = new ToggleRef (this);
+                               if (value != IntPtr.Zero) {
+                                       tref = new ToggleRef (this);
+                                       Objects [value] = tref;
+                               }
                        }
                }       
 
@@ -308,23 +312,19 @@
                        }
                }
 
-               public IntPtr Handle {
+               internal ToggleRef ToggleRef {
                        get {
-                               return handle;
+                               return tref;
                        }
                }
 
-               Hashtable signals;
-               internal Hashtable Signals {
+               public IntPtr Handle {
                        get {
-                               if (signals == null)
-                                       signals = new Hashtable ();
-                               return signals;
+                               return handle;
                        }
                }
 
                Hashtable before_signals;
-
                [Obsolete ("Replaced by GLib.Signal marshaling mechanism.")]
                protected Hashtable BeforeSignals {
                        get {

Modified: branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Signal.cs
===================================================================
--- branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Signal.cs    2008-01-24 
03:50:49 UTC (rev 93761)
+++ branches/gtk-sharp-2-468-branch/gtk-sharp/glib/Signal.cs    2008-01-24 
03:52:05 UTC (rev 93762)
@@ -22,9 +22,16 @@
 namespace GLib {
 
        using System;
+       using System.Collections;
        using System.Runtime.InteropServices;
 
        [Flags]
+       public enum ConnectFlags {
+               After = 1 << 0,
+               Swapped = 1 << 1,
+       }
+
+       [Flags]
        internal enum SignalFlags {
                RunFirst = 1 << 0,
                RunLast = 1 << 1,
@@ -45,7 +52,7 @@
        public class Signal {
 
                GCHandle gc_handle;
-               GLib.Object obj;
+               ToggleRef tref;
                string name;
                uint before_id = UInt32.MaxValue;
                uint after_id = UInt32.MaxValue;
@@ -58,13 +65,22 @@
 
                private Signal (GLib.Object obj, string signal_name, Delegate 
marshaler)
                {
-                       this.obj = obj;
+                       tref = obj.ToggleRef;
                        name = signal_name;
                        this.marshaler = marshaler;
                        gc_handle = GCHandle.Alloc (this, GCHandleType.Weak);
-                       obj.Signals [name] = this;
+                       tref.Signals [name] = this;
                }
 
+               internal void Free ()
+               {
+                       DisconnectHandler (before_id);
+                       DisconnectHandler (after_id);
+                       before_handler = after_handler = marshaler = null;
+                       gc_handle.Free ();
+                       GC.SuppressFinalize (this);
+               }
+
                public static Signal Lookup (GLib.Object obj, string name)
                {
                        return Lookup (obj, name, EventHandlerDelegate);
@@ -72,7 +88,7 @@
 
                public static Signal Lookup (GLib.Object obj, string name, 
Delegate marshaler)
                {
-                       Signal result = obj.Signals [name] as Signal;
+                       Signal result = obj.ToggleRef.Signals [name] as Signal;
                        if (result == null)
                                result = new Signal (obj, name, marshaler);
                        return result as Signal;
@@ -83,7 +99,7 @@
 
                public Delegate Handler {
                        get {
-                               InvocationHint hint = (InvocationHint) 
Marshal.PtrToStructure (g_signal_get_invocation_hint (obj.Handle), typeof 
(InvocationHint));
+                               InvocationHint hint = (InvocationHint) 
Marshal.PtrToStructure (g_signal_get_invocation_hint (tref.Handle), typeof 
(InvocationHint));
                                if (hint.run_type == SignalFlags.RunFirst)
                                        return before_handler;
                                else
@@ -94,7 +110,7 @@
                uint Connect (int flags)
                {
                        IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup 
(name);
-                       uint id = g_signal_connect_data (obj.Handle, 
native_name, marshaler, (IntPtr) gc_handle, IntPtr.Zero, flags);
+                       uint id = g_signal_connect_data (tref.Handle, 
native_name, marshaler, (IntPtr) gc_handle, IntPtr.Zero, flags);
                        GLib.Marshaller.Free (native_name);
                        return id;
                }
@@ -133,13 +149,13 @@
                        }
 
                        if (after_id == UInt32.MaxValue && before_id == 
UInt32.MaxValue)
-                               obj.Signals.Remove (name);
+                               tref.Signals.Remove (name);
                }
 
                void DisconnectHandler (uint handler_id)
                {
-                       if (handler_id != UInt32.MaxValue && 
g_signal_handler_is_connected (obj.Handle, handler_id))
-                               g_signal_handler_disconnect (obj.Handle, 
handler_id);
+                       if (handler_id != UInt32.MaxValue && 
g_signal_handler_is_connected (tref.Handle, handler_id))
+                               g_signal_handler_disconnect (tref.Handle, 
handler_id);
                }
 
                [CDeclCallback]

Modified: branches/gtk-sharp-2-468-branch/gtk-sharp/glib/ToggleRef.cs
===================================================================
--- branches/gtk-sharp-2-468-branch/gtk-sharp/glib/ToggleRef.cs 2008-01-24 
03:50:49 UTC (rev 93761)
+++ branches/gtk-sharp-2-468-branch/gtk-sharp/glib/ToggleRef.cs 2008-01-24 
03:52:05 UTC (rev 93762)
@@ -22,6 +22,7 @@
 namespace GLib {
 
        using System;
+       using System.Collections;
        using System.Runtime.InteropServices;
 
        internal class ToggleRef {
@@ -29,6 +30,7 @@
                IntPtr handle;
                object reference;
                GCHandle gch;
+               Hashtable signals;
 
                public ToggleRef (GLib.Object target)
                {
@@ -44,11 +46,26 @@
                                if (reference is WeakReference) {
                                        WeakReference weak = reference as 
WeakReference;
                                        return weak.IsAlive;
-                               }
+                               } else if (reference == null)
+                                       return false;
                                return true;
                        }
                }
 
+               public IntPtr Handle {
+                       get {
+                               return handle;
+                       }
+               }
+
+               public Hashtable Signals {
+                       get {
+                               if (signals == null)
+                                       signals = new Hashtable ();
+                               return signals;
+                       }
+               }
+
                public GLib.Object Target {
                        get {
                                if (reference is GLib.Object)
@@ -61,6 +78,9 @@
 
                public void Free ()
                {
+                       foreach (Signal s in Signals.Values)
+                               s.Free ();
+                       Signals.Clear ();
                        g_object_remove_toggle_ref (handle, 
ToggleNotifyCallback, (IntPtr) gch);
                        reference = null;
                        gch.Free ();

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to