summaryrefslogtreecommitdiff
path: root/atk-adaptor/accessible-register.c
diff options
context:
space:
mode:
authorMark Doffman <mdoff@silver-wind.(none)>2009-04-23 16:01:08 +0100
committerMark Doffman <mdoff@silver-wind.(none)>2009-04-23 16:01:08 +0100
commit4ac4e0d4876bd1535748e8dc8ccf35db1e173673 (patch)
treec52ff393807b5ec0799ee0b072a6e8abd1cd2ee9 /atk-adaptor/accessible-register.c
parent83011880d6f5c5c99202376433f582ecfd3b31e3 (diff)
downloadat-spi2-atk-4ac4e0d4876bd1535748e8dc8ccf35db1e173673.tar.gz
2009-04-23 Mark Doffman <mark.doffman@codethink.co.uk>
Add a hack for registering objects when an event needs to be sent on them and they are not already registered.
Diffstat (limited to 'atk-adaptor/accessible-register.c')
-rw-r--r--atk-adaptor/accessible-register.c72
1 files changed, 64 insertions, 8 deletions
diff --git a/atk-adaptor/accessible-register.c b/atk-adaptor/accessible-register.c
index c6c7328..63fc106 100644
--- a/atk-adaptor/accessible-register.c
+++ b/atk-adaptor/accessible-register.c
@@ -240,16 +240,15 @@ append_children (AtkObject *accessible, GQueue *traversal)
for (i =0; i < atk_object_get_n_accessible_children (accessible); i++)
{
current = atk_object_ref_accessible_child (accessible, i);
+ if (current)
+ {
#ifdef SPI_ATK_DEBUG
- non_owned_accessible (current);
+ non_owned_accessible (current);
#endif
- if (!has_manages_descendants (current))
- {
- g_queue_push_tail (traversal, current);
- }
- else
- {
- g_object_unref (G_OBJECT (current));
+ if (!has_manages_descendants (current))
+ g_queue_push_tail (traversal, current);
+ else
+ g_object_unref (G_OBJECT (current));
}
}
}
@@ -363,6 +362,63 @@ atk_dbus_path_to_object (const char *path)
}
/*
+ * TODO WARNING HACK This function is dangerous.
+ * It should only be called before sending an event on an
+ * object that has not already been registered.
+ */
+gchar *
+atk_dbus_object_attempt_registration (AtkObject *accessible)
+{
+ guint ref;
+
+ ref = object_to_ref (accessible);
+ if (!ref)
+ {
+ /* See if the object is attached to the main tree */
+ AtkObject *current, *prev = NULL;
+ guint cref = 0;
+
+ /* This should iterate until it hits a NULL or registered parent */
+ prev = accessible;
+ current = atk_object_get_parent (accessible);
+ if (current)
+ cref = object_to_ref (current);
+ while (current && !cref)
+ {
+ prev = current;
+ current = atk_object_get_parent (current);
+ if (current)
+ cref = object_to_ref (current);
+ }
+
+ /* A registered parent, with non-registered child, has been found */
+ if (current)
+ {
+ register_subtree (prev);
+ }
+
+ /* The object SHOULD be registered now. If it isn't - I give up */
+ ref = object_to_ref (accessible);
+ if (ref)
+ {
+ return ref_to_path (ref);
+ }
+ else
+ {
+#ifdef SPI_ATK_DEBUG
+ g_debug ("AT-SPI: Could not register a non-attached accessible object");
+#endif
+ return NULL;
+ }
+ }
+ else
+ {
+ return ref_to_path (ref);
+ }
+}
+
+
+/*
* Used to lookup a D-Bus path from the AtkObject.
*/
gchar *