Release v2.3.92
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / event.c
index 586d196..22f817d 100644 (file)
@@ -421,6 +421,18 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor)
   return ret;
 }
 
+/* Convert a : to a / so that listeners can use arg0path to match only
+ *  * the prefix */
+static char *
+adapt_minor_for_dbus (const char *source)
+{
+  gchar *ret = g_strdup (source);
+  int i = strcspn (ret, ":");
+  if (ret[i] == ':')
+    ret[i] = '/';
+  return ret;
+}
+
 /*
  * Emits an AT-SPI event.
  * AT-SPI events names are split into three parts:
@@ -444,6 +456,7 @@ emit_event (AtkObject  *obj,
 {
   DBusConnection *bus = spi_global_app_data->bus;
   const char *path;
+  char *minor_dbus;
 
   gchar *cname, *t;
   DBusMessage *sig;
@@ -458,6 +471,7 @@ emit_event (AtkObject  *obj,
     return;
 
   path =  spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
+  g_return_if_fail (path != NULL);
 
   /*
    * This is very annoying, but as '-' isn't a legal signal
@@ -469,7 +483,9 @@ emit_event (AtkObject  *obj,
 
   dbus_message_iter_init_append(sig, &iter);
 
-  dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor);
+  minor_dbus = adapt_minor_for_dbus (minor);
+  dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor_dbus);
+  g_free (minor_dbus);
   dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail1);
   dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail2);
   append_variant (&iter, type, val);
@@ -635,7 +651,7 @@ state_event_listener (GSignalInvocationHint * signal_hint,
   emit_event (accessible, ITF_EVENT_OBJECT, STATE_CHANGED, pname, detail1, 0,
               DBUS_TYPE_INT32_AS_STRING, 0, append_basic);
 
-  if (!g_strcmp0 (pname, "defunct"))
+  if (!g_strcmp0 (pname, "defunct") && detail1)
     spi_register_deregister_object (spi_global_register, G_OBJECT (accessible),
                                     TRUE);
   return TRUE;