/* Our parent GObject type */
#define PARENT_TYPE G_OBJECT_TYPE
-<<<<<<< HEAD:registryd/registry.c
-=======
-
->>>>>>> 6d509d490749c6bac3149a5ec45862352ffcf290:registryd/registry.c
int _dbg = 0;
va_list arg;
va_start(arg, first_type);
- spi_dbus_emit_valist(registry->droute.bus, SPI_DBUS_PATH_REGISTRY, SPI_DBUS_INTERFACE_REGISTRY, name, first_type, arg);
+ spi_dbus_emit_valist(registry->droute.bus, SPI_DBUS_PATH_DESKTOP, SPI_DBUS_INTERFACE_REGISTRY, name, first_type, arg);
va_end(arg);
}
guint index, gpointer data)
{
SpiRegistry *registry = SPI_REGISTRY (data);
- const char *name = g_list_nth_data(desktop->applications, index);
+ const SpiDesktopApplication *app = g_list_nth_data(desktop->applications, index);
- emit(registry, "ApplicationAdd", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
+ emit(registry, "applicationAdd", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &app->bus_name, DBUS_TYPE_INVALID);
}
guint index, gpointer data)
{
SpiRegistry *registry = SPI_REGISTRY (data);
- const char *name = g_list_nth_data(desktop->applications, index);
+ SpiDesktopApplication *app = g_list_nth_data(desktop->applications, index);
- emit(registry, "ApplicationRemove", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
+ spi_dbus_remove_disconnect_match (registry->droute.bus, app->bus_name);
+ emit(registry, "applicationRemove", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &app->bus_name, DBUS_TYPE_INVALID);
}
#endif
spi_desktop_add_application (registry->desktop, application);
+ spi_dbus_add_disconnect_match (registry->droute.bus, application);
+
/*
* TODO: change the implementation below to a WM-aware one;
* e.g. don't add all apps to the SpiDesktop
if (!reply) return NULL;
dbus_message_iter_init_append(reply, &iter);
if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "o", &iter_array)) goto oom;
- dbus_message_iter_append_basic(&iter_array, DBUS_TYPE_STRING, &path);
+ dbus_message_iter_append_basic(&iter_array, DBUS_TYPE_OBJECT_PATH, &path);
if (!dbus_message_iter_close_container (&iter, &iter_array)) goto oom;
return reply;
oom:
NULL, NULL, NULL, NULL
};
+DBusHandlerResult
+disconnect_watch (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+ SpiRegistry *registry = SPI_REGISTRY (user_data);
+ const char *name, *old, *new;
+
+ if (!dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged"))
+ {
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+ if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &old, DBUS_TYPE_STRING, &new, DBUS_TYPE_INVALID))
+ {
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+ if (*old != '\0' && *new == '\0')
+ {
+ spi_desktop_remove_application (registry->desktop, old);
+ spi_remove_device_listeners (registry->de_controller, old);
+ }
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
static void
spi_registry_init (SpiRegistry *registry)
{
g_warning("Couldn't connect to dbus: %s\n", error.message);
return;
}
+ registry->droute.user_data = registry;
spi_registry_initialize_registry_interface (®istry->droute);
spi_registry_initialize_desktop_interface (®istry->droute);
spi_registry_initialize_dec_interface (®istry->droute);
registry);
registry->de_controller = spi_device_event_controller_new (registry);
+
+ dbus_connection_add_filter (registry->droute.bus, disconnect_watch, registry, NULL);
}
SpiRegistry *