+#include <stdio.h>
#include <atk/atk.h>
#include "my-atk-object.h"
static AtkObjectClass *atk_object_parent_class = NULL;
-
-//add/remove child to/from array of parent(for internal use)
-static void my_atk_object_add_child(MyAtkObject* parent, MyAtkObject* child)
+void my_atk_object_add_child(MyAtkObject* parent, MyAtkObject* child)
{
g_ptr_array_add(parent->children, child);
- g_object_ref(child);
+ g_object_ref_sink(child);
+
+ atk_object_set_parent(ATK_OBJECT(child), ATK_OBJECT(parent));
g_signal_emit_by_name(parent, "children-changed::add",
parent->children->len - 1, child);
}
-static void my_atk_object_remove_child(MyAtkObject* parent, MyAtkObject* child)
+void my_atk_object_remove_child(MyAtkObject* parent, MyAtkObject* child)
{
gint i;
for(i = parent->children->len - 1; i >= 0; i--)
static void my_atk_object_set_parent(AtkObject *accessible, AtkObject *parent)
{
- //applicable only with corresponding type of parent
- g_return_if_fail(parent == NULL || MY_IS_ATK_OBJECT(parent));
+ g_return_if_fail(parent != NULL);
MyAtkObject *self = MY_ATK_OBJECT(accessible);
AtkObject *parent_old = (atk_object_get_parent(accessible));
{
my_atk_object_remove_child((MyAtkObject*)parent_old, self);
}
- if(parent != NULL)
- {
- my_atk_object_add_child((MyAtkObject*)parent, self);
- }
}
static gint my_atk_object_get_n_children(AtkObject *accessible)
return i;//if error, i will be equal to -1
}
+static AtkStateSet *my_atk_object_ref_state_set(AtkObject *accessible)
+{
+ MyAtkObject *obj = MY_ATK_OBJECT(accessible);
+
+ if (obj->state_set == NULL)
+ obj->state_set = atk_state_set_new();
+ return g_object_ref(G_OBJECT(obj->state_set));
+}
+
+static AtkAttributeSet *my_atk_object_get_attributes (AtkObject *accessible)
+{
+ MyAtkObject *obj = MY_ATK_OBJECT(accessible);
+ AtkAttributeSet *rs = obj->attributes = NULL;
+ AtkAttribute *a, *b, *c;
+
+ a = g_new(AtkAttribute, 1);
+ b = g_new(AtkAttribute, 1);
+ c = g_new(AtkAttribute, 1);
+
+ a->name = g_strdup("foo");
+ a->value = g_strdup("bar");
+ b->name = g_strdup("baz");
+ b->value = g_strdup("qux");
+ c->name = g_strdup("quux");
+ c->value = g_strdup("corge");
+
+ rs = g_slist_append(rs, (gpointer) a);
+ rs = g_slist_append(rs, (gpointer) b);
+ rs = g_slist_append(rs, (gpointer) c);
+}
+
//function, needed in instance_finalize()
static void my_unref1(gpointer data, gpointer user_data)
{
atkObjectClass->get_n_children = my_atk_object_get_n_children;
atkObjectClass->ref_child = my_atk_object_ref_child;
atkObjectClass->get_index_in_parent = my_atk_object_get_index_in_parent;
+ atkObjectClass->ref_state_set = my_atk_object_ref_state_set;
+ atkObjectClass->get_attributes = my_atk_object_get_attributes;
atk_object_parent_class = g_type_class_peek_parent(g_class);
}
MyAtkObject *self = (MyAtkObject*)obj;
self->children = g_ptr_array_sized_new(10);
+ self->attributes = g_slist_alloc();
}
GType my_atk_object_get_type()