X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=registryd%2Fregistry-main.c;h=d8b5dc58793439eb905e3f30034a4f4d048d0223;hb=67b77c5a624ccab97c840e689fed4dfcb46e0aa1;hp=fcfa4461ee531cfc138e418a5fe5d67ccdfc4786;hpb=d8788bd39538d18f5cc701ab2f99eda3ccf1562a;p=platform%2Fupstream%2Fat-spi2-core.git diff --git a/registryd/registry-main.c b/registryd/registry-main.c index fcfa446..d8b5dc5 100644 --- a/registryd/registry-main.c +++ b/registryd/registry-main.c @@ -30,17 +30,12 @@ #include #include -#include #include "paths.h" #include "registry.h" #include "deviceeventcontroller.h" #include "atspi/atspi.h" -#define CORBA_GCONF_KEY "/desktop/gnome/interface/at-spi-corba" - -static gboolean need_to_quit (); - static GMainLoop *mainloop; static gchar *dbus_name = NULL; static gboolean use_gnome_session = FALSE; @@ -52,7 +47,6 @@ static GOptionEntry optentries[] = {NULL} }; -static GDBusConnection *bus_connection = NULL; static GDBusProxy *sm_proxy = NULL; static char *client_id = NULL; static GDBusProxy *client_proxy = NULL; @@ -63,52 +57,64 @@ static GDBusProxy *client_proxy = NULL; #define SM_CLIENT_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate" -static void registry_session_init (const char *previous_client_id, const char *exe); +static gboolean register_client (void); static void -on_session_over (GDBusProxy *proxy, - gchar *sender_name, - gchar *signal_name, - GVariant *parameters, - gpointer user_data) +on_session_signal (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) { if (g_strcmp0 (signal_name, "SessionOver") == 0) { g_main_loop_quit (mainloop); + } else if (g_strcmp0 (signal_name, "SessionRunning") == 0) { + if (!register_client ()) + g_warning ("Unable to register client with session manager"); } } static gboolean session_manager_connect (void) { + GVariant *res; + gboolean is_running; sm_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL, SM_DBUS_NAME, SM_DBUS_PATH, SM_DBUS_INTERFACE, NULL, NULL); + res = g_dbus_proxy_call_sync (sm_proxy, + "IsSessionRunning", NULL, + 0, 1000, NULL, NULL); + + if (res) { + g_variant_get (res, "(b)", &is_running); + g_variant_unref (res); + if (is_running) { + if (!register_client ()) + g_warning ("Unable to register client with session manager"); + } + } + g_signal_connect (G_OBJECT (sm_proxy), "g-signal", - G_CALLBACK (on_session_over), NULL); + G_CALLBACK (on_session_signal), NULL); return (sm_proxy != NULL); } -static void -stop_cb (gpointer data) -{ - g_main_loop_quit (mainloop); -} - static gboolean end_session_response (gboolean is_okay, const gchar *reason) { - GVariant *ret; + GVariant *ret; GError *error = NULL; if (!reason) reason = ""; ret = g_dbus_proxy_call_sync (client_proxy, "EndSessionResponse", - g_variant_new ("(us)", is_okay, reason), + g_variant_new ("(bs)", is_okay, reason), 0, 1000, NULL, &error); if (!ret) { @@ -146,10 +152,13 @@ static gboolean register_client (void) { GError *error; - GVariant *res; + GVariant *res; const char *startup_id; const char *app_id; + if (client_proxy) + return TRUE; + startup_id = g_getenv ("DESKTOP_AUTOSTART_ID"); if (!startup_id) startup_id = ""; @@ -162,8 +171,11 @@ register_client (void) startup_id), 0, 1000, NULL, &error); if (! res) { - g_warning ("Failed to register client: %s", error->message); - g_error_free (error); + const char *message = (error && error->message ? error->message + : "no error"); + g_warning ("Failed to register client: %s", message); + if (error) + g_error_free (error); return FALSE; } g_variant_get (res, "(o)", &client_id); @@ -202,25 +214,21 @@ main (int argc, char **argv) GOptionContext *opt; GError *err = NULL; - DBusError error; int ret; - if (need_to_quit ()) - return 0; - - g_type_init(); - /*Parse command options*/ opt = g_option_context_new(NULL); g_option_context_add_main_entries(opt, optentries, NULL); if (!g_option_context_parse(opt, &argc, &argv, &err)) + { g_error("Option parsing failed: %s\n", err->message); + g_clear_error (&err); + } if (dbus_name == NULL) dbus_name = SPI_DBUS_NAME_REGISTRY; - dbus_error_init (&error); bus = atspi_get_a11y_bus (); if (!bus) { @@ -230,10 +238,10 @@ main (int argc, char **argv) mainloop = g_main_loop_new (NULL, FALSE); atspi_dbus_connection_setup_with_g_main(bus, NULL); - ret = dbus_bus_request_name(bus, dbus_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error); + ret = dbus_bus_request_name(bus, dbus_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, NULL); if (ret == DBUS_REQUEST_NAME_REPLY_EXISTS) { - g_error("Could not obtain D-Bus name - %s\n", dbus_name); + exit (0); /* most likely already running */ } else { @@ -247,47 +255,14 @@ main (int argc, char **argv) { if (!session_manager_connect ()) g_warning ("Unable to connect to session manager"); - - if (!register_client ()) - g_warning ("Unable to register client with session manager"); } g_main_loop_run (mainloop); - return 0; -} -static gboolean -need_to_quit () -{ - void *gconf = NULL; - gconf_client_get_default_t gconf_client_get_default = NULL; - gconf_client_get_bool_t gconf_client_get_bool = NULL; - GObject *gconf_client; /* really a GConfClient */ - gboolean ret; + dbus_connection_close (bus); + dbus_connection_unref (bus); + g_object_unref (dec); + g_object_unref (registry); - g_type_init (); - - gconf = dlopen ("libgconf-2.so", RTLD_LAZY); - if (gconf) - { - gconf_client_get_default = dlsym (gconf, "gconf_client_get_default"); - gconf_client_get_bool = dlsym (gconf, "gconf_client_get_bool"); - } - - if (!gconf_client_get_default || !gconf_client_get_bool) - { - if (gconf) - dlclose (gconf); - return FALSE; - } - - /* If we've been relocated, we will exit if the at-spi-corba gconf key - * has been set. If we have not been relocated, we will only run if the - * at-spi-dbus gconf key has been set. - */ - gconf_client = gconf_client_get_default (); - ret = gconf_client_get_bool (gconf_client, CORBA_GCONF_KEY, NULL); - g_object_unref (gconf_client); - - return ret; + return 0; }