+static DBusMessage *
+impl_introspect (DBusConnection *bus, DBusMessage *message,
+ void *user_data)
+{
+ const char *path;
+ GString *output;
+ char *final;
+
+ DBusMessage *reply;
+
+ path = dbus_message_get_path(message);
+
+ output = g_string_new(spi_introspection_header);
+
+ g_string_append_printf(output, spi_introspection_node_element, path);
+
+ spi_append_interface(output, SPI_DBUS_INTERFACE_DEC);
+
+ g_string_append(output, spi_introspection_footer);
+ final = g_string_free(output, FALSE);
+
+ reply = dbus_message_new_method_return (message);
+ g_assert(reply != NULL);
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &final,
+ DBUS_TYPE_INVALID);
+
+ g_free(final);
+ return reply;
+}
+
+static DRouteMethod dev_methods[] =
+{
+ { impl_register_keystroke_listener, "registerKeystrokeListener" },
+ { impl_register_device_listener, "registerDeviceListener" },
+ { impl_deregister_keystroke_listener, "deregisterKeystrokeListener" },
+ { impl_deregister_device_listener, "deregisterDeviceListener" },
+ { impl_generate_keyboard_event, "generateKeyboardEvent" },
+ { impl_generate_mouse_event, "generateMouseEvent" },
+ { impl_notify_listeners_sync, "notifyListenersSync" },
+ { impl_notify_listeners_async, "notifyListenersAsync" },
+ { NULL, NULL }
+};
+
+static DRouteMethod intro_methods[] = {
+ {impl_introspect, "Introspect"},
+ {NULL, NULL}
+};
+
+SpiDEController *
+spi_registry_dec_new (SpiRegistry *reg, DRouteData *droute)
+{
+ SpiDEController *dec = g_object_new (SPI_DEVICE_EVENT_CONTROLLER_TYPE, NULL);
+
+ dec->registry = g_object_ref (reg);
+ dec->droute = droute;
+
+ droute_add_interface (droute,
+ SPI_DBUS_INTERFACE_DEC,
+ dev_methods,
+ NULL, NULL, NULL);
+ droute_add_interface (droute,
+ "org.freedesktop.DBus.Introspectable",
+ intro_methods,
+ NULL, NULL, NULL);
+
+ spi_dec_init_mouse_listener (dec);
+ /* TODO: kill mouse listener on finalize */
+
+ return dec;
+}