2001-09-19 04:04:57 +02:00
// Object.cs - GObject class wrapper implementation
//
2003-07-23 19:19:21 +02:00
// Authors: Mike Kestner <mkestner@speakeasy.net>
2001-09-19 04:04:57 +02:00
//
2004-05-27 18:35:21 +02:00
// Copyright (c) 2001-2003 Mike Kestner
2005-08-15 17:56:16 +02:00
// Copyright (c) 2004-2005 Novell, Inc.
2004-06-25 20:42:19 +02:00
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the Lesser GNU General
// Public License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this program; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
2004-03-16 20:43:04 +01:00
2001-09-19 13:37:15 +02:00
namespace GLib {
2001-09-19 04:04:57 +02:00
using System ;
2001-09-20 06:03:27 +02:00
using System.Collections ;
2001-09-19 13:37:15 +02:00
using System.ComponentModel ;
2002-12-25 01:36:00 +01:00
using System.Reflection ;
2001-09-19 04:04:57 +02:00
using System.Runtime.InteropServices ;
2005-08-24 02:36:57 +02:00
using System.Text ;
2001-09-19 04:04:57 +02:00
2002-09-04 07:25:58 +02:00
public class Object : IWrapper , IDisposable {
2001-09-27 20:39:53 +02:00
2007-11-16 19:35:38 +01:00
IntPtr handle ;
2008-01-22 17:54:44 +01:00
ToggleRef tref ;
2002-09-04 07:25:58 +02:00
bool disposed = false ;
2003-07-04 09:13:19 +02:00
Hashtable data ;
2001-09-27 20:39:53 +02:00
static Hashtable Objects = new Hashtable ( ) ;
2005-05-31 21:22:58 +02:00
static ArrayList PendingDestroys = new ArrayList ( ) ;
2003-03-15 21:49:37 +01:00
static bool idle_queued ;
2001-09-27 20:39:53 +02:00
2002-09-04 07:25:58 +02:00
~ Object ( )
{
2007-11-16 19:35:38 +01:00
lock ( PendingDestroys ) {
lock ( Objects ) {
if ( Objects [ Handle ] is ToggleRef )
PendingDestroys . Add ( Objects [ Handle ] ) ;
Objects . Remove ( Handle ) ;
}
if ( ! idle_queued ) {
Timeout . Add ( 50 , new TimeoutHandler ( PerformQueuedUnrefs ) ) ;
idle_queued = true ;
2007-04-12 20:01:33 +02:00
}
}
2002-09-04 07:25:58 +02:00
}
2003-07-23 19:19:21 +02:00
[DllImport("libgobject-2.0-0.dll")]
static extern void g_object_unref ( IntPtr raw ) ;
2003-03-15 21:49:37 +01:00
static bool PerformQueuedUnrefs ( )
{
2007-11-16 19:35:38 +01:00
object [ ] references ;
2003-03-15 21:49:37 +01:00
lock ( PendingDestroys ) {
2007-11-16 19:35:38 +01:00
references = new object [ PendingDestroys . Count ] ;
PendingDestroys . CopyTo ( references , 0 ) ;
2003-03-15 21:49:37 +01:00
PendingDestroys . Clear ( ) ;
idle_queued = false ;
2007-11-16 19:35:38 +01:00
}
2003-03-15 21:49:37 +01:00
2007-11-16 19:35:38 +01:00
foreach ( ToggleRef r in references )
r . Free ( ) ;
2003-12-03 21:23:25 +01:00
2003-03-15 21:49:37 +01:00
return false ;
}
2005-05-12 02:42:21 +02:00
public virtual void Dispose ( )
2002-09-04 07:25:58 +02:00
{
if ( disposed )
return ;
disposed = true ;
2008-01-17 22:10:25 +01:00
ToggleRef toggle_ref = Objects [ Handle ] as ToggleRef ;
Objects . Remove ( Handle ) ;
2007-04-12 20:01:33 +02:00
try {
2007-11-16 19:35:38 +01:00
if ( toggle_ref ! = null )
2007-04-12 20:01:33 +02:00
toggle_ref . Free ( ) ;
} catch ( Exception e ) {
Console . WriteLine ( "Exception while disposing a " + this + " in Gtk#" ) ;
throw e ;
2003-03-15 21:49:37 +01:00
}
2007-11-16 19:35:38 +01:00
handle = IntPtr . Zero ;
2003-03-15 21:49:37 +01:00
GC . SuppressFinalize ( this ) ;
2002-09-04 07:25:58 +02:00
}
2003-02-22 05:34:56 +01:00
[DllImport("libgobject-2.0-0.dll")]
2008-04-04 18:10:08 +02:00
static extern IntPtr g_object_ref ( IntPtr raw ) ;
2002-09-12 07:21:16 +02:00
2003-07-23 19:19:21 +02:00
public static Object GetObject ( IntPtr o , bool owned_ref )
2001-09-19 06:47:48 +02:00
{
2005-03-03 21:50:46 +01:00
if ( o = = IntPtr . Zero )
return null ;
2005-08-15 17:56:16 +02:00
Object obj = null ;
2007-11-16 19:35:38 +01:00
if ( Objects . Contains ( o ) ) {
ToggleRef toggle_ref = Objects [ o ] as ToggleRef ;
if ( toggle_ref ! = null & & toggle_ref . IsAlive )
2007-02-16 17:18:59 +01:00
obj = toggle_ref . Target ;
}
2005-05-31 21:22:58 +02:00
2007-11-16 19:35:38 +01:00
if ( obj ! = null & & obj . Handle = = o ) {
2003-07-23 19:19:21 +02:00
if ( owned_ref )
2007-11-16 19:35:38 +01:00
g_object_unref ( obj . Handle ) ;
2003-07-23 19:19:21 +02:00
return obj ;
2003-04-09 19:50:51 +02:00
}
2007-11-16 19:35:38 +01:00
if ( ! owned_ref )
2007-11-29 03:02:24 +01:00
g_object_ref ( o ) ;
2007-11-16 19:35:38 +01:00
2004-05-28 18:59:21 +02:00
obj = GLib . ObjectManager . CreateObject ( o ) ;
2007-11-16 19:35:38 +01:00
if ( obj = = null ) {
g_object_unref ( o ) ;
2003-07-23 19:19:21 +02:00
return null ;
2007-11-16 19:35:38 +01:00
}
2003-07-23 19:19:21 +02:00
return obj ;
2001-09-19 04:04:57 +02:00
}
2001-09-20 06:03:27 +02:00
2003-12-10 23:56:49 +01:00
public static Object GetObject ( IntPtr o )
{
return GetObject ( o , false ) ;
}
2003-12-30 23:09:42 +01:00
private static void ConnectDefaultHandlers ( GType gtype , System . Type t )
{
2004-06-05 03:01:07 +02:00
foreach ( MethodInfo minfo in t . GetMethods ( BindingFlags . Instance | BindingFlags . NonPublic | BindingFlags . Public | BindingFlags . DeclaredOnly ) ) {
2003-12-30 23:09:42 +01:00
MethodInfo baseinfo = minfo . GetBaseDefinition ( ) ;
if ( baseinfo = = minfo )
continue ;
2005-01-14 20:54:07 +01:00
foreach ( object attr in baseinfo . GetCustomAttributes ( typeof ( DefaultSignalHandlerAttribute ) , false ) ) {
2003-12-30 23:09:42 +01:00
DefaultSignalHandlerAttribute sigattr = attr as DefaultSignalHandlerAttribute ;
MethodInfo connector = sigattr . Type . GetMethod ( sigattr . ConnectionMethod , BindingFlags . Static | BindingFlags . NonPublic ) ;
object [ ] parms = new object [ 1 ] ;
parms [ 0 ] = gtype ;
connector . Invoke ( null , parms ) ;
break ;
}
}
}
2004-12-23 23:59:59 +01:00
private static void InvokeClassInitializers ( GType gtype , System . Type t )
{
object [ ] parms = { gtype , t } ;
2007-09-07 16:40:46 +02:00
BindingFlags flags = BindingFlags . Static | BindingFlags . NonPublic ;
foreach ( TypeInitializerAttribute tia in t . GetCustomAttributes ( typeof ( TypeInitializerAttribute ) , true ) ) {
MethodInfo m = tia . Type . GetMethod ( tia . MethodName , flags ) ;
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 ) )
continue ;
foreach ( MethodInfo minfo in curr . GetMethods ( flags ) )
if ( minfo . IsDefined ( typeof ( ClassInitializerAttribute ) , true ) )
minfo . Invoke ( null , parms ) ;
}
}
2008-06-06 18:55:00 +02:00
// Key: The pointer to the ParamSpec of the property
// Value: The corresponding PropertyInfo object
static Hashtable properties ;
static Hashtable Properties {
get {
if ( properties = = null )
properties = new Hashtable ( ) ;
return properties ;
}
}
2008-12-19 19:57:42 +01:00
struct GTypeClass {
IntPtr gtype ;
}
struct GObjectClass {
GTypeClass type_class ;
IntPtr construct_props ;
IntPtr constructor_cb ;
public SetPropertyDelegate set_prop_cb ;
public GetPropertyDelegate get_prop_cb ;
IntPtr dispose ;
IntPtr finalize ;
IntPtr dispatch_properties_changed ;
IntPtr notify ;
IntPtr constructed ;
IntPtr dummy1 ;
IntPtr dummy2 ;
IntPtr dummy3 ;
IntPtr dummy4 ;
IntPtr dummy5 ;
IntPtr dummy6 ;
IntPtr dummy7 ;
}
static void OverridePropertyHandlers ( GType gtype , GetPropertyDelegate get_cb , SetPropertyDelegate set_cb )
{
IntPtr class_ptr = gtype . ClassPtr ;
GObjectClass klass = ( GObjectClass ) Marshal . PtrToStructure ( class_ptr , typeof ( GObjectClass ) ) ;
klass . get_prop_cb = get_cb ;
klass . set_prop_cb = set_cb ;
Marshal . StructureToPtr ( klass , class_ptr , false ) ;
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_object_class_install_property ( IntPtr klass , uint prop_id , IntPtr param_spec ) ;
static IntPtr RegisterProperty ( GType type , string name , string nick , string blurb , uint property_id , GType property_type , bool can_read , bool can_write )
{
IntPtr declaring_class = type . ClassPtr ;
ParamSpec pspec = new ParamSpec ( name , nick , blurb , property_type , can_read , can_write ) ;
g_object_class_install_property ( declaring_class , property_id , pspec . Handle ) ;
return pspec . Handle ;
}
2008-06-06 18:55:00 +02:00
static void AddProperties ( GType gtype , System . Type t )
{
uint idx = 1 ;
bool handlers_overridden = false ;
foreach ( PropertyInfo pinfo in t . GetProperties ( BindingFlags . Instance | BindingFlags . Public | BindingFlags . DeclaredOnly ) ) {
foreach ( object attr in pinfo . GetCustomAttributes ( typeof ( PropertyAttribute ) , false ) ) {
if ( pinfo . GetIndexParameters ( ) . Length > 0 )
throw ( new InvalidOperationException ( String . Format ( "GLib.RegisterPropertyAttribute cannot be applied to property {0} of type {1} because the property expects one or more indexed parameters" , pinfo . Name , t . FullName ) ) ) ;
PropertyAttribute property_attr = attr as PropertyAttribute ;
if ( ! handlers_overridden ) {
2008-12-19 19:57:42 +01:00
OverridePropertyHandlers ( gtype , GetPropertyHandler , SetPropertyHandler ) ;
2008-06-06 18:55:00 +02:00
handlers_overridden = true ;
}
2008-12-19 19:57:42 +01:00
try {
IntPtr param_spec = RegisterProperty ( gtype , property_attr . Name , property_attr . Nickname , property_attr . Blurb , idx , ( GType ) pinfo . PropertyType , pinfo . CanRead , pinfo . CanWrite ) ;
Properties . Add ( param_spec , pinfo ) ;
idx + + ;
} catch ( ArgumentException ) {
2008-06-06 18:55:00 +02:00
throw new InvalidOperationException ( String . Format ( "GLib.PropertyAttribute cannot be applied to property {0} of type {1} because the return type of the property is not supported" , pinfo . Name , t . FullName ) ) ;
2008-12-19 19:57:42 +01:00
}
2008-06-06 18:55:00 +02:00
}
}
}
[GLib.CDeclCallback]
delegate void GetPropertyDelegate ( IntPtr GObject , uint property_id , ref GLib . Value value , IntPtr pspec ) ;
static void GetPropertyCallback ( IntPtr handle , uint property_id , ref GLib . Value value , IntPtr param_spec )
{
GLib . Object obj = GLib . Object . GetObject ( handle , false ) ;
value . Val = ( Properties [ param_spec ] as PropertyInfo ) . GetValue ( obj , new object [ 0 ] ) ;
}
static GetPropertyDelegate get_property_handler ;
static GetPropertyDelegate GetPropertyHandler {
get {
if ( get_property_handler = = null )
get_property_handler = new GetPropertyDelegate ( GetPropertyCallback ) ;
return get_property_handler ;
}
}
[GLib.CDeclCallback]
delegate void SetPropertyDelegate ( IntPtr GObject , uint property_id , ref GLib . Value value , IntPtr pspec ) ;
static void SetPropertyCallback ( IntPtr handle , uint property_id , ref GLib . Value value , IntPtr param_spec )
{
GLib . Object obj = GLib . Object . GetObject ( handle , false ) ;
( Properties [ param_spec ] as PropertyInfo ) . SetValue ( obj , value . Val , new object [ 0 ] ) ;
}
static SetPropertyDelegate set_property_handler ;
static SetPropertyDelegate SetPropertyHandler {
get {
if ( set_property_handler = = null )
set_property_handler = new SetPropertyDelegate ( SetPropertyCallback ) ;
return set_property_handler ;
}
}
2004-12-23 23:59:59 +01:00
2007-09-11 22:34:24 +02:00
[DllImport("libgobject-2.0-0.dll")]
static extern void g_type_add_interface_static ( IntPtr gtype , IntPtr iface_type , ref GInterfaceInfo info ) ;
static void AddInterfaces ( GType gtype , Type t )
{
foreach ( Type iface in t . GetInterfaces ( ) ) {
if ( ! iface . IsDefined ( typeof ( GInterfaceAttribute ) , true ) | | iface . IsAssignableFrom ( t . BaseType ) )
continue ;
GInterfaceAttribute attr = iface . GetCustomAttributes ( typeof ( GInterfaceAttribute ) , false ) [ 0 ] as GInterfaceAttribute ;
GInterfaceAdapter adapter = Activator . CreateInstance ( attr . AdapterType , null ) as GInterfaceAdapter ;
GInterfaceInfo info = adapter . Info ;
g_type_add_interface_static ( gtype . Val , adapter . GType . Val , ref info ) ;
}
}
2008-12-19 19:57:42 +01:00
protected internal static GType RegisterGType ( System . Type t )
2002-12-25 01:36:00 +01:00
{
2008-12-19 19:57:42 +01:00
GType gtype = GType . RegisterGObjectType ( t ) ;
2008-06-06 18:55:00 +02:00
AddProperties ( gtype , t ) ;
2003-12-30 23:09:42 +01:00
ConnectDefaultHandlers ( gtype , t ) ;
2004-12-23 23:59:59 +01:00
InvokeClassInitializers ( gtype , t ) ;
2007-09-11 22:34:24 +02:00
AddInterfaces ( gtype , t ) ;
2003-12-30 23:09:42 +01:00
return gtype ;
2002-12-25 01:36:00 +01:00
}
2004-04-07 21:15:01 +02:00
2004-05-17 19:52:00 +02:00
protected GType LookupGType ( )
2004-05-07 15:42:59 +02:00
{
return LookupGType ( GetType ( ) ) ;
}
2005-05-04 18:54:24 +02:00
protected internal static GType LookupGType ( System . Type t )
2004-04-07 21:15:01 +02:00
{
2008-12-19 19:57:42 +01:00
return GType . LookupGObjectType ( t ) ;
2004-04-07 21:15:01 +02:00
}
2002-02-03 04:44:10 +01:00
2004-05-17 19:52:00 +02:00
protected Object ( IntPtr raw )
2002-02-03 04:44:10 +01:00
{
2002-02-19 20:46:44 +01:00
Raw = raw ;
2002-02-03 04:44:10 +01:00
}
2001-09-19 04:04:57 +02:00
2007-10-02 05:02:43 +02:00
protected Object ( )
{
CreateNativeObject ( new string [ 0 ] , new GLib . Value [ 0 ] ) ;
}
2003-02-22 05:34:56 +01:00
[DllImport("libgobject-2.0-0.dll")]
2003-12-15 17:59:25 +01:00
static extern IntPtr g_object_new ( IntPtr gtype , IntPtr dummy ) ;
2002-12-25 01:36:00 +01:00
2004-11-09 15:22:39 +01:00
[Obsolete]
2003-12-15 17:59:25 +01:00
protected Object ( GType gtype )
2002-12-25 01:36:00 +01:00
{
2003-12-15 17:59:25 +01:00
Raw = g_object_new ( gtype . Val , IntPtr . Zero ) ;
2002-12-25 01:36:00 +01:00
}
2008-12-19 19:57:42 +01:00
struct GParameter {
public IntPtr name ;
public GLib . Value val ;
}
[DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_object_newv ( IntPtr gtype , int n_params , GParameter [ ] parms ) ;
2004-05-07 15:42:59 +02:00
2004-11-09 15:22:39 +01:00
protected virtual void CreateNativeObject ( string [ ] names , GLib . Value [ ] vals )
2004-05-07 15:42:59 +02:00
{
2008-12-19 19:57:42 +01:00
GParameter [ ] parms = new GParameter [ names . Length ] ;
for ( int i = 0 ; i < names . Length ; i + + ) {
parms [ i ] . name = GLib . Marshaller . StringToPtrGStrdup ( names [ i ] ) ;
parms [ i ] . val = vals [ i ] ;
}
Raw = g_object_newv ( LookupGType ( ) . Val , parms . Length , parms ) ;
foreach ( GParameter p in parms )
GLib . Marshaller . Free ( p . name ) ;
2004-05-07 15:42:59 +02:00
}
2002-11-10 11:09:05 +01:00
protected virtual IntPtr Raw {
2001-09-19 13:37:15 +02:00
get {
2007-11-16 19:35:38 +01:00
return handle ;
2001-09-19 04:04:57 +02:00
}
2001-09-19 13:37:15 +02:00
set {
2007-11-16 19:35:38 +01:00
if ( handle = = value )
2004-06-09 19:53:05 +02:00
return ;
2007-11-16 19:35:38 +01:00
if ( handle ! = IntPtr . Zero ) {
2008-01-17 22:10:25 +01:00
Objects . Remove ( handle ) ;
2008-01-22 17:54:44 +01:00
if ( tref ! = null ) {
2007-11-16 19:35:38 +01:00
tref . Free ( ) ;
2008-01-22 17:54:44 +01:00
tref = null ;
}
2007-11-16 19:35:38 +01:00
}
handle = value ;
2008-01-22 17:54:44 +01:00
if ( value ! = IntPtr . Zero ) {
tref = new ToggleRef ( this ) ;
Objects [ value ] = tref ;
}
2001-09-19 04:04:57 +02:00
}
2002-11-10 11:09:05 +01:00
}
2001-09-19 04:04:57 +02:00
2004-05-27 18:35:21 +02:00
public static GLib . GType GType {
2002-08-09 05:56:27 +02:00
get {
2004-05-17 19:52:00 +02:00
return GType . Object ;
2002-08-09 05:56:27 +02:00
}
}
2004-05-17 19:52:00 +02:00
protected string TypeName {
2003-12-03 21:23:25 +01:00
get {
2008-12-19 19:57:42 +01:00
return NativeType . ToString ( ) ;
2003-12-03 21:23:25 +01:00
}
}
2004-05-17 19:52:00 +02:00
internal GLib . GType NativeType {
2004-04-12 17:54:57 +02:00
get {
2004-05-18 07:06:10 +02:00
return LookupGType ( ) ;
2004-04-12 17:54:57 +02:00
}
2002-11-18 19:55:39 +01:00
}
2008-01-22 17:54:44 +01:00
internal ToggleRef ToggleRef {
2001-10-07 02:41:52 +02:00
get {
2008-01-22 17:54:44 +01:00
return tref ;
2007-11-16 19:35:38 +01:00
}
}
2008-01-22 17:54:44 +01:00
public IntPtr Handle {
2007-11-16 19:35:38 +01:00
get {
2008-01-22 17:54:44 +01:00
return handle ;
2001-10-07 02:41:52 +02:00
}
}
2008-04-04 18:10:08 +02:00
public IntPtr OwnedHandle {
get {
return g_object_ref ( handle ) ;
}
}
2004-03-16 20:43:04 +01:00
Hashtable before_signals ;
2005-02-02 22:57:15 +01:00
[Obsolete ("Replaced by GLib.Signal marshaling mechanism.")]
2008-04-30 22:15:45 +02:00
protected internal Hashtable BeforeSignals {
2004-03-16 20:43:04 +01:00
get {
if ( before_signals = = null )
before_signals = new Hashtable ( ) ;
return before_signals ;
}
}
2001-09-27 20:39:53 +02:00
2004-03-16 20:43:04 +01:00
Hashtable after_signals ;
2005-02-02 22:57:15 +01:00
[Obsolete ("Replaced by GLib.Signal marshaling mechanism.")]
2008-04-30 22:15:45 +02:00
protected internal Hashtable AfterSignals {
2001-09-19 13:37:15 +02:00
get {
2004-03-16 20:43:04 +01:00
if ( after_signals = = null )
after_signals = new Hashtable ( ) ;
return after_signals ;
2001-09-19 04:04:57 +02:00
}
}
2001-09-19 06:47:48 +02:00
2004-03-16 20:43:04 +01:00
EventHandlerList before_handlers ;
2005-02-02 22:57:15 +01:00
[Obsolete ("Replaced by GLib.Signal marshaling mechanism.")]
2004-03-16 20:43:04 +01:00
protected EventHandlerList BeforeHandlers {
get {
if ( before_handlers = = null )
before_handlers = new EventHandlerList ( ) ;
return before_handlers ;
}
}
EventHandlerList after_handlers ;
2005-02-02 22:57:15 +01:00
[Obsolete ("Replaced by GLib.Signal marshaling mechanism.")]
2004-03-16 20:43:04 +01:00
protected EventHandlerList AfterHandlers {
get {
if ( after_handlers = = null )
after_handlers = new EventHandlerList ( ) ;
return after_handlers ;
}
}
2001-10-31 02:31:05 +01:00
2005-03-25 18:57:15 +01:00
[CDeclCallback]
2005-02-02 22:57:15 +01:00
delegate void NotifyDelegate ( IntPtr handle , IntPtr pspec , IntPtr gch ) ;
void NotifyCallback ( IntPtr handle , IntPtr pspec , IntPtr gch )
{
2007-03-08 21:28:24 +01:00
try {
GLib . Signal sig = ( ( GCHandle ) gch ) . Target as GLib . Signal ;
if ( sig = = null )
throw new Exception ( "Unknown signal GC handle received " + gch ) ;
NotifyArgs args = new NotifyArgs ( ) ;
args . Args = new object [ 1 ] ;
args . Args [ 0 ] = pspec ;
NotifyHandler handler = ( NotifyHandler ) sig . Handler ;
handler ( GLib . Object . GetObject ( handle ) , args ) ;
} catch ( Exception e ) {
ExceptionManager . RaiseUnhandledException ( e , false ) ;
}
2005-02-02 22:57:15 +01:00
}
2005-01-28 17:44:30 +01:00
void ConnectNotification ( string signal , NotifyHandler handler )
{
2005-02-02 22:57:15 +01:00
Signal sig = Signal . Lookup ( this , signal , new NotifyDelegate ( NotifyCallback ) ) ;
sig . AddDelegate ( handler ) ;
2005-01-28 17:44:30 +01:00
}
public void AddNotification ( string property , NotifyHandler handler )
{
ConnectNotification ( "notify::" + property , handler ) ;
}
public void AddNotification ( NotifyHandler handler )
{
ConnectNotification ( "notify" , handler ) ;
}
void DisconnectNotification ( string signal , NotifyHandler handler )
{
2005-02-02 22:57:15 +01:00
Signal sig = Signal . Lookup ( this , signal , new NotifyDelegate ( NotifyCallback ) ) ;
sig . RemoveDelegate ( handler ) ;
2005-01-28 17:44:30 +01:00
}
public void RemoveNotification ( string property , NotifyHandler handler )
{
DisconnectNotification ( "notify::" + property , handler ) ;
}
public void RemoveNotification ( NotifyHandler handler )
{
DisconnectNotification ( "notify" , handler ) ;
}
2001-10-31 02:31:05 +01:00
public override int GetHashCode ( )
{
return Handle . GetHashCode ( ) ;
}
2003-07-04 09:13:19 +02:00
public Hashtable Data {
get {
if ( data = = null )
data = new Hashtable ( ) ;
return data ;
}
2001-09-19 04:04:57 +02:00
}
2001-09-20 06:03:27 +02:00
2007-11-16 19:35:38 +01:00
Hashtable persistent_data ;
2005-03-12 23:19:44 +01:00
protected Hashtable PersistentData {
get {
2007-11-16 19:35:38 +01:00
if ( persistent_data = = null )
persistent_data = new Hashtable ( ) ;
return persistent_data ;
2005-03-12 23:19:44 +01:00
}
}
2003-02-22 05:34:56 +01:00
[DllImport("libgobject-2.0-0.dll")]
2005-03-08 22:28:08 +01:00
static extern void g_object_get_property ( IntPtr obj , IntPtr name , ref GLib . Value val ) ;
2004-03-16 20:43:04 +01:00
2004-04-12 17:54:57 +02:00
protected GLib . Value GetProperty ( string name )
2001-09-28 20:23:14 +02:00
{
2004-04-12 17:54:57 +02:00
Value val = new Value ( this , name ) ;
2005-03-08 22:28:08 +01:00
IntPtr native_name = GLib . Marshaller . StringToPtrGStrdup ( name ) ;
g_object_get_property ( Raw , native_name , ref val ) ;
GLib . Marshaller . Free ( native_name ) ;
2004-04-12 17:54:57 +02:00
return val ;
2001-09-28 20:23:14 +02:00
}
2003-02-22 05:34:56 +01:00
[DllImport("libgobject-2.0-0.dll")]
2005-03-08 22:28:08 +01:00
static extern void g_object_set_property ( IntPtr obj , IntPtr name , ref GLib . Value val ) ;
2004-03-16 20:43:04 +01:00
2004-04-12 17:54:57 +02:00
protected void SetProperty ( string name , GLib . Value val )
2002-01-12 03:08:16 +01:00
{
2005-03-08 22:28:08 +01:00
IntPtr native_name = GLib . Marshaller . StringToPtrGStrdup ( name ) ;
g_object_set_property ( Raw , native_name , ref val ) ;
GLib . Marshaller . Free ( native_name ) ;
2002-01-12 03:08:16 +01:00
}
2008-11-14 17:21:16 +01:00
[DllImport("libgobject-2.0-0.dll")]
static extern void g_object_notify ( IntPtr obj , IntPtr property_name ) ;
protected void Notify ( string property_name )
{
IntPtr native_name = GLib . Marshaller . StringToPtrGStrdup ( property_name ) ;
g_object_notify ( Handle , native_name ) ;
GLib . Marshaller . Free ( native_name ) ;
}
2003-12-15 17:59:25 +01:00
protected static void OverrideVirtualMethod ( GType gtype , string name , Delegate cb )
{
2008-12-19 19:57:42 +01:00
Signal . OverrideDefaultHandler ( gtype , name , cb ) ;
2003-12-15 17:59:25 +01:00
}
2003-12-10 23:56:49 +01:00
2003-12-09 06:01:22 +01:00
[DllImport("libgobject-2.0-0.dll")]
2004-04-12 17:54:57 +02:00
protected static extern void g_signal_chain_from_overridden ( IntPtr args , ref GLib . Value retval ) ;
2003-12-09 06:01:22 +01:00
2008-12-19 19:57:42 +01:00
[DllImport("libgobject-2.0-0.dll")]
static extern bool g_type_check_instance_is_a ( IntPtr obj , IntPtr gtype ) ;
2002-09-01 06:46:38 +02:00
internal static bool IsObject ( IntPtr obj )
{
2008-12-19 19:57:42 +01:00
return g_type_check_instance_is_a ( obj , GType . Object . Val ) ;
}
struct GTypeInstance {
public IntPtr g_class ;
2002-09-01 06:46:38 +02:00
}
2002-11-10 11:09:05 +01:00
2008-12-19 19:57:42 +01:00
struct GObject {
public GTypeInstance type_instance ;
public uint ref_count ;
public IntPtr qdata ;
}
2002-11-10 11:09:05 +01:00
2004-05-17 19:52:00 +02:00
protected int RefCount {
2002-11-10 11:09:05 +01:00
get {
2008-12-19 19:57:42 +01:00
GObject native = ( GObject ) Marshal . PtrToStructure ( Handle , typeof ( GObject ) ) ;
return ( int ) native . ref_count ;
2002-11-10 11:09:05 +01:00
}
}
2008-04-17 18:32:44 +02:00
internal void Harden ( )
{
tref . Harden ( ) ;
}
2008-04-30 22:15:45 +02:00
static Object ( )
{
2008-05-02 18:58:46 +02:00
if ( Environment . GetEnvironmentVariable ( "GTK_SHARP_DEBUG" ) ! = null )
2008-08-25 22:43:09 +02:00
GLib . Log . SetLogHandler ( "GLib-GObject" , GLib . LogLevelFlags . All , new GLib . LogFunc ( GLib . Log . PrintTraceLogFunction ) ) ;
2008-04-30 22:15:45 +02:00
}
2001-09-19 04:04:57 +02:00
}
}