#include <gdk/gdkx.h> /* TODO: hide dependency (wrap in single porting file) */
#include <gdk/gdkkeysyms.h>
-#include <droute/droute.h>
+#include <dbus/dbus.h>
#include "paths.h"
#include "keymasks.h"
G_DEFINE_TYPE(SpiDEController, spi_device_event_controller, G_TYPE_OBJECT)
+DBusMessage *
+invalid_arguments_error (DBusMessage *message)
+{
+ DBusMessage *reply;
+ gchar *errmsg;
+
+ errmsg= g_strdup_printf (
+ "Method \"%s\" with signature \"%s\" on interface \"%s\" was supplied with invalid arguments\n",
+ dbus_message_get_member (message),
+ dbus_message_get_signature (message),
+ dbus_message_get_interface (message));
+ reply = dbus_message_new_error (message,
+ DBUS_ERROR_INVALID_ARGS,
+ errmsg);
+ g_free (errmsg);
+ return reply;
+}
+
/* Private methods */
static dbus_bool_t
spi_dbus_add_disconnect_match (DBusConnection *bus, const char *name)
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 droute_invalid_arguments_error (message);
+ return invalid_arguments_error (message);
}
dec_listener = spi_dec_listener_new (dbus_message_get_sender(message), path, event_types);
ret = spi_controller_register_device_listener (
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 droute_invalid_arguments_error (message);
+ return invalid_arguments_error (message);
}
listener = spi_dec_listener_new (dbus_message_get_sender(message), path, event_types);
spi_controller_deregister_device_listener (
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 droute_invalid_arguments_error (message);
+ return invalid_arguments_error (message);
}
#ifdef SPI_DEBUG
dbus_error_init (&error);
if (!dbus_message_get_args(message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_STRING, &eventName, DBUS_TYPE_INVALID))
{
- return droute_invalid_arguments_error (message);
+ return invalid_arguments_error (message);
}
#ifdef SPI_DEBUG
if (!spi_dbus_demarshal_deviceEvent(message, &event))
{
- return droute_invalid_arguments_error (message);
+ return invalid_arguments_error (message);
}
#ifdef SPI_DEBUG
g_print ("notifylistening listeners synchronously: controller %p, event id %d\n",
if (!spi_dbus_demarshal_deviceEvent(message, &event))
{
- return droute_invalid_arguments_error (message);
+ return invalid_arguments_error (message);
}
#ifdef SPI_DEBUG
g_print ("notifylistening listeners asynchronously: controller %p, event id %d\n",
check_release_handler = g_timeout_add (CHECK_RELEASE_DELAY, check_release, &pressed_event);
}
-static DRouteMethod dev_methods[] =
+static DBusHandlerResult
+handle_dec_method (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+ const gchar *iface = dbus_message_get_interface (message);
+ const gchar *member = dbus_message_get_member (message);
+ const gint type = dbus_message_get_type (message);
+
+ DBusMessage *reply = NULL;
+
+ /* Check for basic reasons not to handle */
+ if (type != DBUS_MESSAGE_TYPE_METHOD_CALL ||
+ member == NULL ||
+ iface == NULL)
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ if (!strcmp (iface, SPI_DBUS_INTERFACE_DEC))
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ if (!strcmp (member, "registerKeystrokeListener"))
+ reply = impl_register_keystroke_listener (bus, message, user_data);
+ else if (!strcmp (member, "registerDeviceEventListener"))
+ reply = impl_register_device_event_listener (bus, message, user_data);
+ else if (!strcmp (member, "deregisterKeystrokeListener"))
+ reply = impl_deregister_keystroke_listener (bus, message, user_data);
+ else if (!strcmp (member, "deregisterDeviceEventListener"))
+ reply = impl_deregister_device_event_listener (bus, message, user_data);
+ else if (!strcmp (member, "generateKeyboardEvent"))
+ reply = impl_generate_keyboard_event (bus, message, user_data);
+ else if (!strcmp (member, "generateMouseEvent"))
+ reply = impl_generate_mouse_event (bus, message, user_data);
+ else if (!strcmp (member, "notifyListenersSync"))
+ reply = impl_notify_listeners_sync (bus, message, user_data);
+ else if (!strcmp (member, "notifyListenersAsync"))
+ reply = impl_notify_listeners_async (bus, message, user_data);
+ else
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ if (!reply)
+ {
+ reply = dbus_message_new_method_return (message);
+ }
+ dbus_connection_send (bus, reply, NULL);
+ dbus_message_unref (reply);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusObjectPathVTable dec_vtable =
{
- { impl_register_keystroke_listener, "registerKeystrokeListener" },
- { impl_register_device_event_listener, "registerDeviceEventListener" },
- { impl_deregister_keystroke_listener, "deregisterKeystrokeListener" },
- { impl_deregister_device_event_listener, "deregisterDeviceEventListener" },
- { impl_generate_keyboard_event, "generateKeyboardEvent" },
- { impl_generate_mouse_event, "generateMouseEvent" },
- { impl_notify_listeners_sync, "notifyListenersSync" },
- { impl_notify_listeners_async, "notifyListenersAsync" },
- { NULL, NULL }
+ NULL,
+ &handle_dec_method,
+ NULL, NULL, NULL, NULL
};
SpiDEController *
-spi_registry_dec_new (SpiRegistry *reg, DBusConnection *bus, DRouteContext *droute)
+spi_registry_dec_new (SpiRegistry *reg, DBusConnection *bus)
{
SpiDEController *dec = g_object_new (SPI_DEVICE_EVENT_CONTROLLER_TYPE, NULL);
- DRoutePath *path;
dec->registry = g_object_ref (reg);
dec->bus = bus;
- path = droute_add_one (droute,
- SPI_DBUS_PATH_DEC,
- dec);
-
- droute_path_add_interface (path,
- SPI_DBUS_INTERFACE_DEC,
- dev_methods,
- NULL);
+ dbus_connection_register_object_path (bus, SPI_DBUS_PATH_DEC, &dec_vtable, dec);
spi_dec_init_mouse_listener (dec);
- /* TODO: kill mouse listener on finalize */
return dec;
}