From 15cf27b0dd68f2c9a9190627c6c47018d28df510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20G=2E=20Aragoneses?= Date: Fri, 6 Jun 2008 14:56:01 +0000 Subject: [PATCH] * atk/Object.custom: * atk/glue/object.c: Implement virtual method OnRefStateSet(). svn path=/trunk/gtk-sharp/; revision=105160 --- ChangeLog | 5 +++++ atk/Object.custom | 44 ++++++++++++++++++++++++++++++++++++++++++-- atk/glue/object.c | 23 +++++++++++++++++++++++ 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 99c28af60..55fbec715 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-06-06 Andres G. Aragoneses + + * atk/Object.custom: + * atk/glue/object.c: Implement virtual method OnRefStateSet(). + 2008-05-30 Mike Kestner * gdk/Pixbuf.custom: don't use the autogenerated PixbufDestroyNative diff --git a/atk/Object.custom b/atk/Object.custom index 3989c20c3..d46f9884e 100644 --- a/atk/Object.custom +++ b/atk/Object.custom @@ -33,7 +33,7 @@ { try { Atk.Object obj = GLib.Object.GetObject (raw, false) as Atk.Object; - return obj.OnGetNChildren(); + return obj.OnGetNChildren (); } catch (Exception e) { GLib.ExceptionManager.RaiseUnhandledException (e, false); } @@ -88,7 +88,7 @@ } [GLib.DefaultSignalHandler (Type=typeof(Atk.Object), ConnectionMethod="OverrideRefChild")] - protected virtual Atk.Object OnRefChild(int i) { + protected virtual Atk.Object OnRefChild (int i) { return null; } @@ -104,4 +104,44 @@ Add, Remove } + + + [DllImport("atksharpglue-2")] + static extern void atksharp_object_override_ref_state_set (IntPtr type, RefStateSetDelegate cb); + + [DllImport("atksharpglue-2")] + static extern IntPtr atksharp_object_base_ref_state_set (IntPtr atk_obj); + + [GLib.CDeclCallback] + delegate IntPtr RefStateSetDelegate (IntPtr raw); + + static RefStateSetDelegate RefStateSetCallback; + + static IntPtr RefStateSet_cb (IntPtr raw) + { + try { + Atk.Object obj = GLib.Object.GetObject (raw, false) as Atk.Object; + Atk.StateSet state_set = obj.OnRefStateSet (); + if (state_set != null) + g_object_ref (state_set.Handle); + return state_set == null ? IntPtr.Zero : state_set.Handle; + } catch (Exception e) { + GLib.ExceptionManager.RaiseUnhandledException (e, false); + } + + return IntPtr.Zero; + } + + static void OverrideRefStateSet (GLib.GType gtype) + { + if (RefStateSetCallback == null) + RefStateSetCallback = new RefStateSetDelegate (RefStateSet_cb); + atksharp_object_override_ref_state_set (gtype.Val, RefStateSetCallback); + } + + [GLib.DefaultSignalHandler (Type=typeof(Atk.Object), ConnectionMethod="OverrideRefStateSet")] + protected virtual Atk.StateSet OnRefStateSet () { + IntPtr raw = atksharp_object_base_ref_state_set (Handle); + return (Atk.StateSet) GLib.Object.GetObject(raw, true); + } \ No newline at end of file diff --git a/atk/glue/object.c b/atk/glue/object.c index 59b7039d4..f528dd102 100644 --- a/atk/glue/object.c +++ b/atk/glue/object.c @@ -26,6 +26,11 @@ void atksharp_object_override_get_n_children (GType gtype, gpointer cb); void atksharp_object_override_ref_child (GType gtype, gpointer cb); +void atksharp_object_override_ref_state_set (GType gtype, gpointer cb); + +AtkStateSet* atksharp_object_base_ref_state_set (AtkObject *base); + + void atksharp_object_override_get_n_children (GType gtype, gpointer cb) { @@ -43,3 +48,21 @@ atksharp_object_override_ref_child (GType gtype, gpointer cb) klass = g_type_class_ref (gtype); ((AtkObjectClass *) klass)->ref_child = cb; } + +void +atksharp_object_override_ref_state_set (GType gtype, gpointer cb) +{ + AtkObjectClass *klass = g_type_class_peek (gtype); + if (!klass) + klass = g_type_class_ref (gtype); + ((AtkObjectClass *) klass)->ref_state_set = cb; +} + +AtkStateSet* +atksharp_object_base_ref_state_set (AtkObject *atk_obj) +{ + AtkObjectClass *parent = g_type_class_peek_parent (G_OBJECT_GET_CLASS (atk_obj)); + if (parent->ref_state_set) + return (*parent->ref_state_set) (atk_obj); + return NULL; +}