Merge branch 'master' of git+ssh://doffm@git.freedesktop.org/git/at-spi2/at-spi2...
[platform/core/uifw/at-spi2-atk.git] / registryd / deviceeventcontroller.c
index bdc5816..288c07b 100644 (file)
@@ -164,6 +164,35 @@ static gboolean spi_dec_poll_mouse_idle (gpointer data);
 G_DEFINE_TYPE(SpiDEController, spi_device_event_controller, G_TYPE_OBJECT)
 
 /* Private methods */
+static dbus_bool_t
+spi_dbus_add_disconnect_match (DBusConnection *bus, const char *name)
+{
+  char *match = g_strdup_printf ("interface=%s,member=NameOwnerChanged,arg0=%s", DBUS_INTERFACE_DBUS, name);
+  if (match)
+  {
+    DBusError error;
+    dbus_error_init (&error);
+    dbus_bus_add_match (bus, match, &error);
+    g_free (match);
+    return !dbus_error_is_set (&error);
+  }
+  else return FALSE;
+}
+
+static dbus_bool_t
+spi_dbus_remove_disconnect_match (DBusConnection *bus, const char *name)
+{
+  char *match = g_strdup_printf ("interface=%s,member=NameOwnerChanged,arg0=%s", DBUS_INTERFACE_DBUS, name);
+  if (match)
+  {
+    DBusError error;
+    dbus_error_init (&error);
+    dbus_bus_remove_match (bus, match, &error);
+    g_free (match);
+    return !dbus_error_is_set (&error);
+  }
+  else return FALSE;
+}
 
 static unsigned int
 keysym_mod_mask (KeySym keysym, KeyCode keycode)
@@ -342,13 +371,26 @@ spi_dec_clear_unlatch_pending (SpiDEController *controller)
   priv->xkb_latch_mask = 0;
 }
 
-static void emit(SpiDEController *controller, const char *name, int first_type, ...)
+static void emit(SpiDEController *controller, const char *interface, const char *name, int a1, int a2)
 {
-  va_list arg;
+  DBusMessage *signal = NULL;
+  DBusMessageIter iter, iter_variant;
+  int nil = 0;
+  const char *minor = "";
+  const char *path = SPI_DBUS_PATH_DEC;
 
-  va_start(arg, first_type);
-  spi_dbus_emit_valist(controller->bus, SPI_DBUS_PATH_DEC, SPI_DBUS_INTERFACE_DEC, name, first_type, arg);
-  va_end(arg);
+  signal = dbus_message_new_signal (path, interface, name);
+
+  dbus_message_iter_init_append (signal, &iter);
+
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &minor);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &a1);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &a2);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "i", &iter_variant);
+      dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_INT32, &nil);
+  dbus_message_iter_close_container (&iter, &iter_variant);
+
+  dbus_connection_send (controller->bus, signal, NULL);
 }
 
 static gboolean
@@ -455,7 +497,7 @@ spi_dec_button_update_and_emit (SpiDEController *controller,
        if (!is_consumed)
          {
            dbus_uint32_t x = last_mouse_pos->x, y = last_mouse_pos->y;
-           emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "button", event_detail, x, y);
+           emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "button", x, y);
          }
        else
          spi_dec_set_unlatch_pending (controller, mask_return);
@@ -499,10 +541,10 @@ spi_dec_mouse_check (SpiDEController *controller,
     {
       // TODO: combine these two signals?
       dbus_uint32_t ix = *x, iy = *y;
-      emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "abs", NULL, ix, iy);
+      emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "abs", ix, iy);
       ix -= last_mouse_pos->x;
       iy -= last_mouse_pos->y;
-      emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "rel", NULL, ix, iy);
+      emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "rel", ix, iy);
       last_mouse_pos->x = *x;
       last_mouse_pos->y = *y;
       *moved = True;
@@ -534,7 +576,7 @@ spi_dec_emit_modifier_event (SpiDEController *controller, guint prev_mask,
 
   d1 = prev_mask & key_modifier_mask;
   d2 = current_mask & key_modifier_mask;
-      emit(controller, SPI_DBUS_INTERFACE_EVENT_KEYBOARD, "modifiers", NULL, d1, d2);
+      emit(controller, SPI_DBUS_INTERFACE_EVENT_KEYBOARD, "modifiers", d1, d2);
 }
 
 static gboolean
@@ -936,7 +978,10 @@ Accessibility_DeviceEventListener_notifyEvent(SpiDEController *controller,
                                               DEControllerListener *listener,
                                               const Accessibility_DeviceEvent *key_event)
 {
-  DBusMessage *message = dbus_message_new_method_call(listener->bus_name, listener->path, "org.freedesktop.atspi.Registry", "notifyEvent");
+  DBusMessage *message = dbus_message_new_method_call(listener->bus_name,
+                                                      listener->path,
+                                                      SPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER,
+                                                      "notifyEvent");
   DBusError error;
   dbus_bool_t consumed = FALSE;
 
@@ -1810,7 +1855,20 @@ impl_register_keystroke_listener (DBusConnection *bus,
   dbus_message_iter_next(&iter);
   dbus_message_iter_get_basic(&iter, &mask);
   dbus_message_iter_next(&iter);
-  dbus_message_iter_get_basic(&iter, &type);
+  if (!strcmp (dbus_message_iter_get_signature (&iter), "u"))
+    dbus_message_iter_get_basic(&iter, &type);
+  else
+  {
+    dbus_message_iter_recurse(&iter, &iter_array);
+    while (dbus_message_iter_get_arg_type(&iter_array) != DBUS_TYPE_INVALID)
+    {
+      dbus_uint32_t t;
+      dbus_message_iter_get_basic (&iter_array, &t);
+      type |= (1 << t);
+      dbus_message_iter_next (&iter_array);
+    }
+    dbus_message_iter_next (&iter_array);
+  }
   dbus_message_iter_next(&iter);
   mode = (Accessibility_EventListenerMode *)g_malloc(sizeof(Accessibility_EventListenerMode));
   if (mode)
@@ -1852,7 +1910,7 @@ impl_register_device_listener (DBusConnection *bus,
   dbus_error_init(&error);
   if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_UINT32, &event_types, DBUS_TYPE_INVALID))
   {
-    return spi_dbus_general_error (message);
+    return droute_invalid_arguments_error (message);
   }
   dec_listener = spi_dec_listener_new (dbus_message_get_sender(message), path, event_types);
   ret =  spi_controller_register_device_listener (
@@ -2040,7 +2098,7 @@ impl_deregister_device_listener (DBusConnection *bus,
   dbus_error_init(&error);
   if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_UINT32, &event_types, DBUS_TYPE_INVALID))
   {
-    return spi_dbus_general_error (message);
+    return droute_invalid_arguments_error (message);
   }
   listener = spi_dec_listener_new (dbus_message_get_sender(message), path, event_types);
   spi_controller_deregister_device_listener (
@@ -2351,7 +2409,7 @@ static DBusMessage * impl_generate_keyboard_event (DBusConnection *bus, DBusMess
   dbus_error_init(&error);
   if (!dbus_message_get_args(message, &error, DBUS_TYPE_INT32, &keycode, DBUS_TYPE_STRING, &keystring, DBUS_TYPE_UINT32, &synth_type, DBUS_TYPE_INVALID))
   {
-    return spi_dbus_general_error (message);
+    return droute_invalid_arguments_error (message);
   }
 
 #ifdef SPI_DEBUG
@@ -2429,7 +2487,7 @@ static DBusMessage * impl_generate_mouse_event (DBusConnection *bus, DBusMessage
 
   if (!dbus_message_get_args(message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_STRING, &eventName, DBUS_TYPE_INVALID))
   {
-    return spi_dbus_general_error (message);
+    return droute_invalid_arguments_error (message);
   }
 
 #ifdef SPI_DEBUG
@@ -2501,7 +2559,7 @@ impl_notify_listeners_sync (DBusConnection *bus, DBusMessage *message, void *use
 
   if (!spi_dbus_demarshal_deviceEvent(message, &event))
   {
-    return spi_dbus_general_error (message);
+    return droute_invalid_arguments_error (message);
   }
 #ifdef SPI_DEBUG
   g_print ("notifylistening listeners synchronously: controller %p, event id %d\n",
@@ -2528,7 +2586,7 @@ impl_notify_listeners_async (DBusConnection *bus, DBusMessage *message, void *us
 
   if (!spi_dbus_demarshal_deviceEvent(message, &event))
   {
-    return spi_dbus_general_error (message);
+    return droute_invalid_arguments_error (message);
   }
 #ifdef SPI_DEBUG
   g_print ("notifylistening listeners asynchronously: controller %p, event id %d\n",