} DEControllerGrabMask;
typedef struct {
- char *app_path;
+ char *bus_name;
char *path;
SpiDeviceTypeCategory type;
gulong types;
}
static DEControllerKeyListener *
-spi_dec_key_listener_new (const char *app_path,
+spi_dec_key_listener_new (const char *bus_name,
const char *path,
GSList *keys,
const Accessibility_ControllerEventMask mask,
const Accessibility_EventListenerMode *mode)
{
DEControllerKeyListener *key_listener = g_new0 (DEControllerKeyListener, 1);
- key_listener->listener.app_path = g_strdup(app_path);
+ key_listener->listener.bus_name = g_strdup(bus_name);
key_listener->listener.path = g_strdup(path);
key_listener->listener.type = SPI_DEVICE_TYPE_KBD;
key_listener->keys = keys;
}
static DEControllerListener *
-spi_dec_listener_new (const char *app_path,
+spi_dec_listener_new (const char *bus_name,
const char *path,
dbus_uint32_t types)
{
DEControllerListener *listener = g_new0 (DEControllerListener, 1);
- listener->app_path = g_strdup(app_path);
+ listener->bus_name = g_strdup(bus_name);
listener->path = g_strdup(path);
listener->type = SPI_DEVICE_TYPE_MOUSE;
listener->types = types;
spi_listener_clone (DEControllerListener *listener)
{
DEControllerListener *clone = g_new0 (DEControllerListener, 1);
- clone->app_path = g_strdup (listener->app_path);
+ clone->bus_name = g_strdup (listener->bus_name);
clone->path = g_strdup (listener->path);
clone->type = listener->type;
clone->types = listener->types;
spi_key_listener_clone (DEControllerKeyListener *key_listener)
{
DEControllerKeyListener *clone = g_new0 (DEControllerKeyListener, 1);
- clone->listener.app_path = g_strdup (key_listener->listener.app_path);
+ clone->listener.bus_name = g_strdup (key_listener->listener.bus_name);
clone->listener.path = g_strdup (key_listener->listener.path);
clone->listener.type = SPI_DEVICE_TYPE_KBD;
clone->keys = keylist_clone (key_listener->keys);
spi_listener_clone_free (DEControllerListener *clone)
{
g_free (clone->path);
- g_free (clone->app_path);
+ g_free (clone->bus_name);
g_free (clone);
}
static void
spi_dec_listener_free (DEControllerListener *listener)
{
- g_free (listener->app_path);
+ g_free (listener->bus_name);
g_free (listener->path);
if (listener->type == SPI_DEVICE_TYPE_KBD)
spi_key_listener_data_free ((DEControllerKeyListener *) listener);
controller->key_listeners = g_list_prepend (controller->key_listeners,
key_listener);
+ spi_dbus_add_disconnect_match (controller->registry->droute.bus, key_listener->listener.bus_name);
if (key_listener->mode->global)
{
return spi_controller_register_global_keygrabs (controller, key_listener);
break;
case SPI_DEVICE_TYPE_MOUSE:
controller->mouse_listeners = g_list_prepend (controller->mouse_listeners, listener);
+ spi_dbus_add_disconnect_match (controller->registry->droute.bus, listener->bus_name);
break;
default:
DBG (1, g_warning ("listener registration for unknown device type.\n"));
static gboolean Accessibility_DeviceEventListener_notifyEvent(SpiRegistry *registry, DEControllerListener *listener, const Accessibility_DeviceEvent *key_event)
{
- DBusMessage *message = dbus_message_new_method_call(listener->app_path, listener->path, "org.freedesktop.atspi.Registry", "notifyEvent");
+ DBusMessage *message = dbus_message_new_method_call(listener->bus_name, listener->path, "org.freedesktop.atspi.Registry", "notifyEvent");
DBusError error;
dbus_bool_t consumed = FALSE;
DEControllerListener *listener = (*list)->data;
RemoveListenerClosure *ctx = user_data;
- if (!strcmp(ctx->listener->app_path, listener->app_path) &&
+ if (!strcmp(ctx->listener->bus_name, listener->bus_name) &&
!strcmp(ctx->listener->path, listener->path))
{
spi_re_entrant_list_delete_link (list);
+ spi_dbus_remove_disconnect_match (ctx->bus, listener->bus_name);
spi_dec_listener_free (listener);
}
DEControllerKeyListener *key_listener = (*list)->data;
RemoveListenerClosure *ctx = user_data;
- if (!strcmp(ctx->listener->app_path, key_listener->listener.app_path) &&
+ if (!strcmp(ctx->listener->bus_name, key_listener->listener.bus_name) &&
!strcmp(ctx->listener->path, key_listener->listener.path))
{
/* TODO: FIXME aggregate keys in case the listener is registered twice */
}
+void
+spi_remove_device_listeners (SpiDEController *controller, const char *bus_name)
+{
+ GList *l, *tmp;
+
+ for (l = controller->mouse_listeners; l; l = tmp)
+ {
+ DEControllerListener *listener = l->data;
+ tmp = l->next;
+ if (!strcmp (listener->bus_name, bus_name))
+ {
+ spi_controller_deregister_device_listener (controller, listener);
+ }
+ }
+ for (l = controller->key_listeners; l; l = tmp)
+ {
+ DEControllerKeyListener *key_listener = l->data;
+ tmp = l->next;
+ if (!strcmp (key_listener->listener.bus_name, bus_name))
+ {
+ spi_deregister_controller_key_listener (controller, key_listener);
+ }
+ }
+}
+
/*
* DBus Accessibility::DEController::deregisterKeystrokeListener
* method implementation
gboolean retval = TRUE;
const gchar *c;
- maxlen = strlen (keystring);
+ maxlen = strlen (keystring) + 1;
keysyms = g_new0 (KeySym, maxlen);
if (!(keystring && *keystring && g_utf8_validate (keystring, -1, &c))) {
retval = FALSE;
void
spi_registry_initialize_dec_interface (DRouteData * data)
{
- droute_add_interface (data, "org.freedesktop.atspi.DeviceEventController", methods,
+ droute_add_interface (data, SPI_DBUS_INTERFACE_DEC, methods,
NULL, NULL, NULL);
};