| #include <glib.h> | |
| #include <glib-object.h> | |
| #define MY_TYPE_BADGER (my_badger_get_type ()) | |
| #define MY_BADGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_BADGER, MyBadger)) | |
| #define MY_IS_BADGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_BADGER)) | |
| #define MY_BADGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MY_TYPE_BADGER, MyBadgerClass)) | |
| #define MY_IS_BADGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MY_TYPE_BADGER)) | |
| #define MY_BADGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MY_TYPE_BADGER, MyBadgerClass)) | |
| enum { | |
| PROP_0, | |
| PROP_MAMA | |
| }; | |
| typedef struct _MyBadger MyBadger; | |
| typedef struct _MyBadgerClass MyBadgerClass; | |
| struct _MyBadger | |
| { | |
| GObject parent_instance; | |
| MyBadger * mama; | |
| guint mama_notify_count; | |
| }; | |
| struct _MyBadgerClass | |
| { | |
| GObjectClass parent_class; | |
| }; | |
| static GType my_badger_get_type (void); | |
| G_DEFINE_TYPE (MyBadger, my_badger, G_TYPE_OBJECT) | |
| static void my_badger_dispose (GObject * object); | |
| static void my_badger_get_property (GObject *object, | |
| guint prop_id, | |
| GValue *value, | |
| GParamSpec *pspec); | |
| static void my_badger_set_property (GObject *object, | |
| guint prop_id, | |
| const GValue *value, | |
| GParamSpec *pspec); | |
| static void my_badger_mama_notify (GObject *object, | |
| GParamSpec *pspec); | |
| static void | |
| my_badger_class_init (MyBadgerClass * klass) | |
| { | |
| GObjectClass *gobject_class; | |
| gobject_class = (GObjectClass *) klass; | |
| gobject_class->dispose = my_badger_dispose; | |
| gobject_class->get_property = my_badger_get_property; | |
| gobject_class->set_property = my_badger_set_property; | |
| g_object_class_install_property (gobject_class, | |
| PROP_MAMA, | |
| g_param_spec_object ("mama", | |
| NULL, | |
| NULL, | |
| MY_TYPE_BADGER, | |
| G_PARAM_READWRITE)); | |
| } | |
| static void | |
| my_badger_init (MyBadger * self) | |
| { | |
| g_signal_connect (self, "notify::mama", G_CALLBACK (my_badger_mama_notify), | |
| NULL); | |
| } | |
| static void | |
| my_badger_dispose (GObject * object) | |
| { | |
| MyBadger * self; | |
| self = MY_BADGER (object); | |
| if (self->mama != NULL) | |
| { | |
| g_object_unref (self->mama); | |
| self->mama = NULL; | |
| } | |
| G_OBJECT_CLASS (my_badger_parent_class)->dispose (object); | |
| } | |
| static void | |
| my_badger_get_property (GObject *object, | |
| guint prop_id, | |
| GValue *value, | |
| GParamSpec *pspec) | |
| { | |
| MyBadger *self; | |
| self = MY_BADGER (object); | |
| switch (prop_id) | |
| { | |
| case PROP_MAMA: | |
| g_value_set_object (value, self->mama); | |
| break; | |
| default: | |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | |
| break; | |
| } | |
| } | |
| static void | |
| my_badger_set_property (GObject *object, | |
| guint prop_id, | |
| const GValue *value, | |
| GParamSpec *pspec) | |
| { | |
| MyBadger *self; | |
| self = MY_BADGER (object); | |
| switch (prop_id) | |
| { | |
| case PROP_MAMA: | |
| if (self->mama) | |
| g_object_unref (self->mama); | |
| self->mama = g_value_dup_object (value); | |
| if (self->mama) | |
| g_object_set (self->mama, "mama", NULL, NULL); /* another notify */ | |
| break; | |
| default: | |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | |
| break; | |
| } | |
| } | |
| static void | |
| my_badger_mama_notify (GObject *object, | |
| GParamSpec *pspec) | |
| { | |
| MyBadger *self; | |
| self = MY_BADGER (object); | |
| self->mama_notify_count++; | |
| } | |
| static void | |
| test_refcount_properties_4 (void) | |
| { | |
| MyBadger * badger1, * badger2; | |
| gpointer test; | |
| badger1 = g_object_new (MY_TYPE_BADGER, NULL); | |
| badger2 = g_object_new (MY_TYPE_BADGER, NULL); | |
| g_object_set (badger1, "mama", badger2, NULL); | |
| g_assert_cmpuint (badger1->mama_notify_count, ==, 1); | |
| g_assert_cmpuint (badger2->mama_notify_count, ==, 1); | |
| g_object_get (badger1, "mama", &test, NULL); | |
| g_assert_cmpmem (test, sizeof (MyBadger), badger2, sizeof (MyBadger)); | |
| g_object_unref (test); | |
| g_object_unref (badger1); | |
| g_object_unref (badger2); | |
| } | |
| int | |
| main (int argc, gchar *argv[]) | |
| { | |
| g_log_set_always_fatal (G_LOG_LEVEL_WARNING | | |
| G_LOG_LEVEL_CRITICAL | | |
| g_log_set_always_fatal (G_LOG_FATAL_MASK)); | |
| g_test_init (&argc, &argv, NULL); | |
| g_test_add_func ("/gobject/refcount/properties-4", test_refcount_properties_4); | |
| return g_test_run (); | |
| } |