X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=registryd%2Fregistry-main.c;h=d8b5dc58793439eb905e3f30034a4f4d048d0223;hb=8fd84fce6f1ef2a9e694a14cfb77a29ed269a686;hp=246270c6c16aabde8fdc617436a62fa749e48ae6;hpb=e879a45ddc5f82a93b2be5dcc00b8d6640d37b42;p=platform%2Fupstream%2Fat-spi2-core.git diff --git a/registryd/registry-main.c b/registryd/registry-main.c index 246270c..d8b5dc5 100644 --- a/registryd/registry-main.c +++ b/registryd/registry-main.c @@ -21,79 +21,248 @@ * Boston, MA 02111-1307, USA. */ -#ifdef AT_SPI_DEBUG #include -#endif - #include #include -#include -#include +#include +#include +#include +#include + +#include + +#include "paths.h" #include "registry.h" +#include "deviceeventcontroller.h" +#include "atspi/atspi.h" + +static GMainLoop *mainloop; +static gchar *dbus_name = NULL; +static gboolean use_gnome_session = FALSE; + +static GOptionEntry optentries[] = +{ + {"dbus-name", 0, 0, G_OPTION_ARG_STRING, &dbus_name, "Well-known name to register with D-Bus", NULL}, + {"use-gnome-session", 0, 0, G_OPTION_ARG_NONE, &use_gnome_session, "Should register with gnome session manager", NULL}, + {NULL} +}; + +static GDBusProxy *sm_proxy = NULL; +static char *client_id = NULL; +static GDBusProxy *client_proxy = NULL; + +#define SM_DBUS_NAME "org.gnome.SessionManager" +#define SM_DBUS_PATH "/org/gnome/SessionManager" +#define SM_DBUS_INTERFACE "org.gnome.SessionManager" + +#define SM_CLIENT_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate" + +static gboolean register_client (void); + +static void +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"); + } + } -#define spi_get_display() GDK_DISPLAY() + g_signal_connect (G_OBJECT (sm_proxy), "g-signal", + G_CALLBACK (on_session_signal), NULL); + + return (sm_proxy != NULL); +} + +static gboolean +end_session_response (gboolean is_okay, const gchar *reason) +{ + GVariant *ret; + GError *error = NULL; -static void registry_set_ior (SpiRegistry *registry); + if (!reason) + reason = ""; + + ret = g_dbus_proxy_call_sync (client_proxy, "EndSessionResponse", + g_variant_new ("(bs)", is_okay, reason), + 0, 1000, NULL, &error); + + if (!ret) { + g_warning ("Failed to send session response %s", error->message); + g_error_free (error); + return FALSE; + } + else + g_variant_unref (ret); + + return TRUE; +} + +static void +client_proxy_signal_cb (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + if (g_strcmp0 (signal_name, "QueryEndSession") == 0) { + g_debug ("Got QueryEndSession signal"); + end_session_response (TRUE, NULL); + } else if (g_strcmp0 (signal_name, "EndSession") == 0) { + g_debug ("Got EndSession signal"); + end_session_response (TRUE, NULL); + g_main_loop_quit (mainloop); + } else if (g_strcmp0 (signal_name, "Stop") == 0) { + g_debug ("Got Stop signal"); + g_main_loop_quit (mainloop); + } +} + +static gboolean +register_client (void) +{ + GError *error; + 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 = ""; + app_id = "at-spi-registryd.desktop"; + + error = NULL; + res = g_dbus_proxy_call_sync (sm_proxy, + "RegisterClient", + g_variant_new ("(ss)", app_id, + startup_id), + 0, 1000, NULL, &error); + if (! res) { + 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); + g_variant_unref (res); + + client_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL, + SM_DBUS_NAME, + client_id, + SM_CLIENT_DBUS_INTERFACE, + NULL, NULL); + + g_signal_connect (client_proxy, "g-signal", + G_CALLBACK (client_proxy_signal_cb), NULL); + + g_unsetenv ("DESKTOP_AUTOSTART_ID"); + + return TRUE; +} + +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +typedef GObject *(*gconf_client_get_default_t) (); +typedef gboolean (*gconf_client_get_bool_t)(GObject *, const char *, void *); int main (int argc, char **argv) { - int ret; - char *obj_id; - const char *display_name; - char *cp, *dp; SpiRegistry *registry; - DBusError error; - GMainLoop *mainloop; + SpiDEController *dec; - g_type_init(); + DBusConnection *bus = NULL; - obj_id = "OAFIID:Accessibility_Registry:1.0"; + GOptionContext *opt; - registry = spi_registry_new (); + GError *err = NULL; + int ret; - display_name = g_getenv ("AT_SPI_DISPLAY"); - if (!display_name) + /*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; + + bus = atspi_get_a11y_bus (); + if (!bus) { - display_name = g_getenv ("DISPLAY"); - cp = strrchr (display_name, '.'); - dp = strrchr (display_name, ':'); - if (cp && dp && (cp > dp)) *cp = '\0'; + return 0; } - dbus_error_init (&error); mainloop = g_main_loop_new (NULL, FALSE); - ret= dbus_bus_request_name(registry->droute.bus, SPI_DBUS_NAME_REGISTRY, 0, &error); + atspi_dbus_connection_setup_with_g_main(bus, NULL); - if (!ret) + ret = dbus_bus_request_name(bus, dbus_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, NULL); + if (ret == DBUS_REQUEST_NAME_REPLY_EXISTS) { -#ifdef AT_SPI_DEBUG - fprintf (stderr, "SpiRegistry Message: SpiRegistry daemon was already running.\n"); -#endif + exit (0); /* most likely already running */ } else { -#ifdef AT_SPI_DEBUG - fprintf (stderr, "SpiRegistry Message: SpiRegistry daemon is running.\n"); -#endif - registry_set_ior (registry); - g_main_loop_run (mainloop); + g_print ("SpiRegistry daemon is running with well-known name - %s\n", dbus_name); } - return 0; -} + registry = spi_registry_new (bus); + dec = spi_registry_dec_new (registry, bus); -static void -registry_set_ior (SpiRegistry *registry){ - Atom AT_SPI_IOR = XInternAtom (spi_get_display (), "AT_SPI_IOR", FALSE); - char *iorstring = NULL; - - iorstring = SPI_DBUS_NAME_REGISTRY; - - XChangeProperty (spi_get_display(), - XDefaultRootWindow (spi_get_display ()), - AT_SPI_IOR, (Atom) 31, 8, - PropModeReplace, - (unsigned char *) iorstring, - iorstring ? strlen (iorstring) : 0); + if (use_gnome_session) + { + if (!session_manager_connect ()) + g_warning ("Unable to connect to session manager"); + } + + g_main_loop_run (mainloop); + + dbus_connection_close (bus); + dbus_connection_unref (bus); + g_object_unref (dec); + g_object_unref (registry); + + return 0; }