Some introspection fixes to make vapigen happy
[platform/upstream/at-spi2-core.git] / atspi / atspi-event-listener.c
index 781488e..ba5d126 100644 (file)
@@ -209,9 +209,9 @@ cache_process_children_changed (AtspiEvent *event)
   {
     if (g_list_find (event->source->children, child))
       return;
-    GList *new_list = g_list_insert (event->source->children, g_object_ref (child), event->detail1);
-    if (new_list)
-      event->source->children = new_list;
+    event->source->children = g_list_insert (event->source->children,
+                                             g_object_ref (child),
+                                             event->detail1);
   }
   else if (g_list_find (event->source->children, child))
   {
@@ -270,6 +270,18 @@ cache_process_property_change (AtspiEvent *event)
       event->source->cached_properties &= ~ATSPI_CACHE_DESCRIPTION;
     }
   }
+  else if (!strcmp (event->type, "object:property-change:accessible-role"))
+  {
+    if (G_VALUE_HOLDS_INT (&event->any_data))
+    {
+      event->source->role = g_value_get_int (&event->any_data);
+      _atspi_accessible_add_cache (event->source, ATSPI_CACHE_ROLE);
+    }
+    else
+    {
+      event->source->cached_properties &= ~ATSPI_CACHE_ROLE;
+    }
+  }
 }
 
 static void
@@ -345,12 +357,10 @@ convert_event_type_to_dbus (const char *eventType, char **categoryp, char **name
   if (tmp == NULL) return FALSE;
   category = strtok_r (tmp, ":", &saveptr);
   if (category) category = g_strdup (category);
-  if (!category) goto oom;
   name = strtok_r (NULL, ":", &saveptr);
   if (name)
   {
     name = g_strdup (name);
-    if (!name) goto oom;
     detail = strtok_r (NULL, ":", &saveptr);
     if (detail) detail = g_strdup (detail);
   }
@@ -384,12 +394,6 @@ convert_event_type_to_dbus (const char *eventType, char **categoryp, char **name
   else if (detail) g_free (detail);
   g_free (tmp);
   return TRUE;
-oom:
-  if (tmp) g_free (tmp);
-  if (category) g_free (category);
-  if (name) g_free (name);
-  if (detail) g_free (detail);
-  return FALSE;
 }
 
 static void
@@ -531,7 +535,6 @@ atspi_event_listener_register_from_callback (AtspiEventListenerCB callback,
 {
   EventListenerEntry *e;
   DBusError d_error;
-  GList *new_list;
   DBusMessage *message, *reply;
   GPtrArray *matchrule_array;
   gint i;
@@ -558,28 +561,23 @@ atspi_event_listener_register_from_callback (AtspiEventListenerCB callback,
     g_free (e);
     return FALSE;
   }
-  new_list = g_list_prepend (event_listeners, e);
-  if (!new_list)
-  {
-    listener_entry_free (e);
-    return FALSE;
-  }
-  event_listeners = new_list;
-  dbus_error_init (&d_error);
+  event_listeners = g_list_prepend (event_listeners, e);
   for (i = 0; i < matchrule_array->len; i++)
   {
     char *matchrule = g_ptr_array_index (matchrule_array, i);
+    dbus_error_init (&d_error);
     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);
+        dbus_error_free (&d_error);
+        /* TODO: Set error */
+      }
+
     g_free (matchrule);
   }
   g_ptr_array_free (matchrule_array, TRUE);
-  if (d_error.message)
-  {
-    g_warning ("Atspi: Adding match: %s", d_error.message);
-    /* TODO: Set error */
-  }
 
-  dbus_error_init (&d_error);
   message = dbus_message_new_method_call (atspi_bus_registry,
        atspi_path_registry,
        atspi_interface_registry,
@@ -695,7 +693,6 @@ atspi_event_listener_deregister_from_callback (AtspiEventListenerCB callback,
         is_superset (detail, e->detail))
     {
       gboolean need_replace;
-      DBusError d_error;
       DBusMessage *message, *reply;
       need_replace = (l == event_listeners);
       l = g_list_remove (l, e);
@@ -704,10 +701,8 @@ atspi_event_listener_deregister_from_callback (AtspiEventListenerCB callback,
       for (i = 0; i < matchrule_array->len; i++)
       {
        char *matchrule = g_ptr_array_index (matchrule_array, i);
-       dbus_error_init (&d_error);
-       dbus_bus_remove_match (_atspi_bus(), matchrule, &d_error);
+       dbus_bus_remove_match (_atspi_bus(), matchrule, NULL);
       }
-      dbus_error_init (&d_error);
       message = dbus_message_new_method_call (atspi_bus_registry,
            atspi_path_registry,
            atspi_interface_registry,
@@ -793,6 +788,7 @@ _atspi_send_event (AtspiEvent *e)
 {
   char *category, *name, *detail;
   GList *l;
+  GList *called_listeners = NULL;
 
   /* Ensure that the value is set to avoid a Python exception */
   /* TODO: Figure out how to do this without using a private field */
@@ -814,12 +810,24 @@ _atspi_send_event (AtspiEvent *e)
         (entry->name == NULL || !strcmp (name, entry->name)) &&
         detail_matches_listener (detail, entry->detail))
     {
+      GList *l2;
+      for (l2 = called_listeners; l2; l2 = l2->next)
+      {
+        EventListenerEntry *e2 = l2->data;
+        if (entry->callback == e2->callback && entry->user_data == e2->user_data)
+          break;
+      }
+      if (!l2)
+      {
         entry->callback (atspi_event_copy (e), entry->user_data);
+        called_listeners = g_list_prepend (called_listeners, entry);
+      }
     }
   }
   if (detail) g_free (detail);
   g_free (name);
   g_free (category);
+  g_list_free (called_listeners);
 }
 
 DBusHandlerResult