GHashTable *
_atspi_get_live_refs (void)
{
- if (!live_refs)
+ if (!live_refs)
{
live_refs = g_hash_table_new (g_direct_hash, g_direct_equal);
}
return ref_accessible (app, path);
}
-AtspiAccessible *
-_atspi_dbus_return_accessible_from_message (DBusMessage *message)
+static AtspiAccessible *
+_atspi_dbus_return_accessible_and_recurse_info_from_message_impl (DBusMessage *message, unsigned char *recurse)
{
DBusMessageIter iter;
AtspiAccessible *retval = NULL;
const char *signature;
+ const char *expected_signature = recurse ? "(so)y" : "(so)";
- if (!message)
- return NULL;
+ if (!message) return NULL;
signature = dbus_message_get_signature (message);
- if (!strcmp (signature, "(so)"))
+ if (!strcmp (signature, expected_signature))
{
dbus_message_iter_init (message, &iter);
retval = _atspi_dbus_return_accessible_from_iter (&iter);
+ if (recurse) {
+ unsigned char value = 0;
+ dbus_message_iter_get_basic (&iter, &value);
+ dbus_message_iter_next (&iter);
+ *recurse = (value != 0);
+ }
}
else
{
- g_warning ("AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange signature %s", signature);
+ g_warning ("AT-SPI: Called _atspi_dbus_return_accessible_from_message with unexpected signature %s", signature);
}
dbus_message_unref (message);
return retval;
}
AtspiAccessible *
+_atspi_dbus_return_accessible_from_message (DBusMessage *message)
+{
+ return _atspi_dbus_return_accessible_and_recurse_info_from_message_impl(message, NULL);
+}
+
+AtspiAccessible *
+_atspi_dbus_return_accessible_and_recurse_info_from_message(DBusMessage *message, unsigned char *recurse)
+{
+ if (recurse == NULL) {
+ g_error("AT-SPI: Called _atspi_dbus_return_accessible_and_recurse_info_from_message with NULL argument recurse");
+ dbus_message_unref (message);
+ return NULL;
+ }
+ return _atspi_dbus_return_accessible_and_recurse_info_from_message_impl(message, recurse);
+}
+
+AtspiAccessible *
_atspi_dbus_return_accessible_from_iter (DBusMessageIter *iter)
{
const char *app_name, *path;
DBusMessageIter iter;
AtspiHyperlink *retval = NULL;
const char *signature;
-
+
if (!message)
return NULL;
*
* Connects to the accessibility registry and initializes the SPI.
*
- * Returns: 0 on success, 1 if already initialized, or an integer error code.
+ * Returns: 0 on success, 1 if already initialized, or an integer error code.
**/
int
atspi_init (void)
/**
* atspi_exit:
*
- * Disconnects from #AtspiRegistry instances and releases
+ * Disconnects from #AtspiRegistry instances and releases
* any floating resources. Call only once at exit.
*
* Returns: 0 if there were no leaks, otherwise other integer values.
{
AtspiObject *aobj = ATSPI_OBJECT (obj);
DBusError err;
- DBusMessage *msg = NULL, *reply = NULL;
- DBusMessageIter iter;
- const char *p;
+ DBusMessage *msg = NULL, *reply = NULL;
+ DBusMessageIter iter;
+ const char *p;
dbus_error_init (&err);
g_warning ("Could not open X display");
return NULL;
}
-
+
AT_SPI_BUS = XInternAtom (bridge_display, "AT_SPI_BUS", False);
XGetWindowProperty (bridge_display,
XDefaultRootWindow (bridge_display),
dbus_error_free (&error);
goto out;
}
-
+
{
const char *tmp_address;
if (!dbus_message_get_args (reply,
return NULL;
}
}
-
+
/* Simulate a weak ref on the bus */
dbus_connection_set_data (a11y_bus, a11y_dbus_slot, a11y_bus, a11y_bus_free);
g_value_set_boxed (val, &extents);
}
if (val)
- g_hash_table_insert (cache, g_strdup (key), val);
+ g_hash_table_insert (cache, g_strdup (key), val);
dbus_message_iter_next (&iter_dict);
}