info = g_hash_table_lookup (callbacks, callback);
if (!info)
{
- g_warning ("Atspi: Dereferencing invalid callback %p\n", callback);
+ g_warning ("AT-SPI: Dereferencing invalid callback %p\n", callback);
return;
}
info->ref_count--;
return;
child = g_value_get_object (&event->any_data);
+ if (child == NULL)
+ return;
if (!strncmp (event->type, "object:children-changed:add", 27))
{
- if (g_list_find (event->source->children, child))
+ g_ptr_array_remove (event->source->children, child); /* just to be safe */
+ if (event->detail1 < 0 || event->detail1 > event->source->children->len)
+ {
+ event->source->cached_properties &= ~ATSPI_CACHE_CHILDREN;
return;
- event->source->children = g_list_insert (event->source->children,
- g_object_ref (child),
- event->detail1);
+ }
+ /* Unfortunately, there's no g_ptr_array_insert or similar */
+ g_ptr_array_add (event->source->children, NULL);
+ memmove (event->source->children->pdata + event->detail1 + 1,
+ event->source->children->pdata + event->detail1,
+ (event->source->children->len - event->detail1 - 1) * sizeof (gpointer));
+ g_ptr_array_index (event->source->children, event->detail1) = g_object_ref (child);
}
- else if (g_list_find (event->source->children, child))
+ else
{
- event->source->children = g_list_remove (event->source->children, child);
+ g_ptr_array_remove (event->source->children, child);
if (child == child->parent.app->root)
g_object_run_dispose (G_OBJECT (child->parent.app));
- g_object_unref (child);
}
}
return dst;
}
+/**
+ * atspi_event_listener_register_from_callback_full:
+ * @callback: (scope async): an #AtspiEventListenerCB function pointer.
+ * @user_data: (closure callback)
+ * @callback_destroyed: (destroy callback)
+ * @event_type:
+ * @properties: (element-type utf8)
+ * @error:
+ *
+ * Returns: #TRUE if successful, otherwise #FALSE.
+ *
+ **/
gboolean
atspi_event_listener_register_from_callback_full (AtspiEventListenerCB callback,
void *user_data,
dbus_bus_add_match (_atspi_bus(), matchrule, &d_error);
if (dbus_error_is_set (&d_error))
{
- g_warning ("Atspi: Adding match: %s", d_error.message);
+ g_warning ("AT-SPI: Adding match: %s", d_error.message);
dbus_error_free (&d_error);
/* TODO: Set error */
}
if (!convert_event_type_to_dbus (e->type, &category, &name, &detail, NULL))
{
- g_warning ("Atspi: Couldn't parse event: %s\n", e->type);
+ g_warning ("AT-SPI: Couldn't parse event: %s\n", e->type);
return;
}
for (l = event_listeners; l; l = g_list_next (l))
if (e.source == NULL)
{
g_warning ("Got no valid source accessible for signal for signal %s from interface %s\n", member, category);
+ g_free (converted_type);
+ g_free (name);
+ g_free (detail);
return DBUS_HANDLER_RESULT_HANDLED;
}