diff --git a/ChangeLog b/ChangeLog index 85ee94a75..7062214bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-02-25 Mike Kestner + + * glib/Source.cs : remove from the hash by key. + * glib/Idle.cs : remove from the hash by key. + 2005-02-23 Dan Winship * sources/gnomedb.patch: Patch over a bug in gnome-db-editor.h diff --git a/glib/Idle.cs b/glib/Idle.cs index 85ddfc33e..735837f67 100755 --- a/glib/Idle.cs +++ b/glib/Idle.cs @@ -24,6 +24,7 @@ namespace GLib { using System; + using System.Collections; using System.Runtime.InteropServices; public delegate bool IdleHandler (); @@ -65,17 +66,26 @@ namespace GLib { } [DllImport("libglib-2.0-0.dll")] - static extern bool g_source_remove_by_funcs_user_data (IdleHandler d, IntPtr data); + static extern bool g_source_remove_by_funcs_user_data (Delegate d, IntPtr data); public static bool Remove (IdleHandler hndlr) { + bool result = false; + ArrayList keys = new ArrayList (); + foreach (uint code in Source.source_handlers.Keys){ - IdleProxy p = (IdleProxy) Source.source_handlers [code]; + IdleProxy p = Source.source_handlers [code] as IdleProxy; - if (p.real_handler == hndlr) - Source.source_handlers.Remove (p); + if (p != null && p.real_handler == hndlr) { + keys.Add (code); + result = g_source_remove_by_funcs_user_data (p.proxy_handler, IntPtr.Zero); + } } - return g_source_remove_by_funcs_user_data (hndlr, IntPtr.Zero); + + foreach (object key in keys) + Source.source_handlers.Remove (key); + + return result; } } } diff --git a/glib/Source.cs b/glib/Source.cs index 76b3295c2..9b44261dd 100644 --- a/glib/Source.cs +++ b/glib/Source.cs @@ -34,7 +34,12 @@ namespace GLib { internal void Remove () { - Source.source_handlers.Remove (this); + ArrayList keys = new ArrayList (); + foreach (uint code in Source.source_handlers.Keys) + if (Source.source_handlers [code] == this) + keys.Add (code); + foreach (object key in keys) + Source.source_handlers.Remove (key); real_handler = null; proxy_handler = null; } @@ -50,9 +55,7 @@ namespace GLib { public static bool Remove (uint tag) { - if (source_handlers.Contains (tag)) - source_handlers.Remove (tag); - + source_handlers.Remove (tag); return g_source_remove (tag); } }