-/* TODO Turn this function into a macro? */
-static gboolean
-tree_update_wrapper (GSignalInvocationHint * signal_hint,
- guint n_param_values,
- const GValue * param_values,
- gpointer data, TreeUpdateAction action)
-{
- AtkObject *accessible;
-
- g_static_rec_mutex_lock (®istration_mutex);
-
- /* Ensure that only registered accessibles
- * have their signals processed.
- */
- accessible = ATK_OBJECT (g_value_get_object (¶m_values[0]));
- g_return_val_if_fail (ATK_IS_OBJECT (accessible), TRUE);
-
- if (object_to_ref (accessible))
- {
-#ifdef SPI_ATK_DEBUG
- if (recursion_check_and_set ())
- g_warning ("AT-SPI: Recursive use of registration module");
-
- g_debug ("AT-SPI: Tree update listener");
-#endif
- action (signal_hint, n_param_values, param_values, data, accessible);
-
- recursion_check_unset ();
- }
-
- g_static_rec_mutex_unlock (®istration_mutex);
-
- return TRUE;
-}
-
-static gboolean
-maybe_expire_lease (gpointer key, gpointer obj_data, gpointer iter)
-{
- time_t secs = time (NULL) - (time_t) obj_data;
-
- if (secs < 30)
- return FALSE;
- deregister_sub_accessible (key, obj_data, iter);
- return TRUE;
-}
-
-static void
-expire_old_leases_in (gpointer key, gpointer obj_data, gpointer iter)
-{
- g_hash_table_foreach_remove ((GHashTable *) obj_data, maybe_expire_lease,
- NULL);
-}
-
-static void
-expire_old_leases ()
-{
- g_hash_table_foreach (objects_with_subrefs, expire_old_leases_in, NULL);
-}
-
-static gboolean
-tree_update_state_action (GSignalInvocationHint * signal_hint,
- guint n_param_values,
- const GValue * param_values,
- gpointer data, AtkObject * accessible)
-{
- const gchar *name;
- gboolean state;
-
- if (n_param_values < 3)
- {
- g_warning ("at-spi: Not enough params in state-changed signal");
- return TRUE;
- }
-
- name = g_value_get_string (param_values + 1);
- state = g_value_get_boolean (param_values + 2);
- if (!strcmp (name, "visible"))
- {
- AtkStateSet *set = atk_object_ref_state_set (accessible);
- if (atk_state_set_contains_state (set, ATK_STATE_TRANSIENT))
- {
- if (state == 0)
- {
- g_hash_table_insert (leased_refs, accessible,
- (gpointer) time (NULL));
- leased_refs_count++;
- /* todo: Set to a high number: 5 for dbg. */
- if (leased_refs_count > 5)
- expire_old_leases ();
- }
- else
- {
- g_hash_table_remove (leased_refs, accessible);
- leased_refs_count--;
- }
- }
- g_object_unref (set);
- }
-
- update_accessible (accessible);
- return TRUE;
-}
-
-static gboolean
-tree_update_state_listener (GSignalInvocationHint * signal_hint,
- guint n_param_values,
- const GValue * param_values, gpointer data)
-{
- tree_update_wrapper (signal_hint, n_param_values, param_values, data,
- tree_update_state_action);
- return TRUE;
-}
-
-static gboolean
-tree_update_property_action (GSignalInvocationHint * signal_hint,
- guint n_param_values,
- const GValue * param_values,
- gpointer data, AtkObject * accessible)
-{
- AtkPropertyValues *values;
- const gchar *pname = NULL;
-
- values = (AtkPropertyValues *) g_value_get_pointer (¶m_values[1]);
- pname = values[0].property_name;
- if (strcmp (pname, "accessible-name") == 0 ||
- strcmp (pname, "accessible-description") == 0 ||
- strcmp (pname, "accessible-parent") == 0 ||
- strcmp (pname, "accessible-role") == 0)
- {
- update_accessible (accessible);
- }
- /* Parent value us updated by child-add signal of parent object */
- return TRUE;
-}
-
-static gboolean
-tree_update_property_listener (GSignalInvocationHint * signal_hint,
- guint n_param_values,
- const GValue * param_values, gpointer data)
-{
- tree_update_wrapper (signal_hint, n_param_values, param_values, data,
- tree_update_property_action);
- return TRUE;
-}
-
-static gboolean
-tree_update_children_action (GSignalInvocationHint * signal_hint,
- guint n_param_values,
- const GValue * param_values,
- gpointer data, AtkObject * accessible)
-{
- const gchar *detail = NULL;
- AtkObject *child;
-
- if (signal_hint->detail)
- detail = g_quark_to_string (signal_hint->detail);
-
- if (!strcmp (detail, "add"))
- {
- gpointer child;
- int index = g_value_get_uint (param_values + 1);
- child = g_value_get_pointer (param_values + 2);
-
- if (!ATK_IS_OBJECT (child))
- {
- child = atk_object_ref_accessible_child (accessible, index);
-#ifdef SPI_ATK_DEBUG
- non_owned_accessible (child);
-#endif
- }
- register_subtree (child);
- update_accessible (accessible);
- }
- else if (!strcmp (detail, "remove"))
- {
- update_accessible (accessible);
- }
- return TRUE;
-}
-
-static gboolean
-tree_update_children_listener (GSignalInvocationHint * signal_hint,
- guint n_param_values,
- const GValue * param_values, gpointer data)
-{
- tree_update_wrapper (signal_hint, n_param_values, param_values, data,
- tree_update_children_action);
- return TRUE;
-}
-
-/*---------------------------------------------------------------------------*/
-
-static void
-spi_atk_register_toplevel_added (AtkObject * accessible,
- guint index, AtkObject * child)
-{
- g_static_rec_mutex_lock (®istration_mutex);
-
- g_return_if_fail (ATK_IS_OBJECT (accessible));
-
- if (object_to_ref (accessible))
- {
-#ifdef SPI_ATK_DEBUG
- if (recursion_check_and_set ())
- g_warning ("AT-SPI: Recursive use of registration module");
-
- g_debug ("AT-SPI: Toplevel added listener");
-#endif
- if (!ATK_IS_OBJECT (child))
- {
- child = atk_object_ref_accessible_child (accessible, index);
-#ifdef SPI_ATK_DEBUG
- non_owned_accessible (child);
-#endif
- }
- register_subtree (child);
- update_accessible (accessible);
-
- recursion_check_unset ();
- }
-
- g_static_rec_mutex_unlock (®istration_mutex);
-}
-
-static void
-spi_atk_register_toplevel_removed (AtkObject * accessible,
- guint index, AtkObject * child)
-{
- g_static_rec_mutex_lock (®istration_mutex);
-
- g_return_if_fail (ATK_IS_OBJECT (accessible));
-
- if (object_to_ref (accessible))
- {
-#ifdef SPI_ATK_DEBUG
- if (recursion_check_and_set ())
- g_warning ("AT-SPI: Recursive use of registration module");
-
- g_debug ("AT-SPI: Toplevel removed listener");
-#endif
- update_accessible (accessible);
- recursion_check_unset ();
- }
-
- g_static_rec_mutex_unlock (®istration_mutex);
-}
-
-/*
- * Initializes required global data. The update and removal lists
- * and the reference lookup tables.
- *
- * Initializes all of the required D-Bus interfaces.
- */
-void
-atk_dbus_initialize (AtkObject * root)