diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2015-09-18 03:28:51 +0300 |
---|---|---|
committer | Mike Gorse <mgorse@suse.com> | 2016-01-26 11:29:40 -0600 |
commit | d4ae614301bbc7f7204dab795cbd6f1289c401d2 (patch) | |
tree | 6a3145d06258ebf2b93ad2250126515cc22b0524 | |
parent | 4153dfa84b5611d2a5f24bb05d2327db02498ce5 (diff) | |
download | at-spi2-core-d4ae614301bbc7f7204dab795cbd6f1289c401d2.tar.gz |
at-spi-bus-launcher: register with session manager
This application is started in Initialization phase. In this phase
it is required to register with session manager. See:
https://wiki.gnome.org/Projects/SessionManagement/NewGnomeSession
https://bugzilla.gnome.org/show_bug.cgi?id=753931
-rw-r--r-- | bus/at-spi-bus-launcher.c | 132 |
1 files changed, 131 insertions, 1 deletions
diff --git a/bus/at-spi-bus-launcher.c b/bus/at-spi-bus-launcher.c index b6bd8e84..c445be8f 100644 --- a/bus/at-spi-bus-launcher.c +++ b/bus/at-spi-bus-launcher.c @@ -51,6 +51,8 @@ typedef struct { GSettings *a11y_schema; GSettings *interface_schema; + GDBusProxy *client_proxy; + A11yBusState state; /* -1 == error, 0 == pending, > 0 == running */ int a11y_bus_pid; @@ -76,6 +78,133 @@ static const gchar introspection_xml[] = static GDBusNodeInfo *introspection_data = NULL; static void +respond_to_end_session (GDBusProxy *proxy) +{ + GVariant *parameters; + + parameters = g_variant_new ("(bs)", TRUE, ""); + + g_dbus_proxy_call (proxy, + "EndSessionResponse", parameters, + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, NULL, NULL); +} + +static void +g_signal_cb (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + A11yBusLauncher *app = user_data; + + if (g_strcmp0 (signal_name, "QueryEndSession") == 0) + respond_to_end_session (proxy); + else if (g_strcmp0 (signal_name, "EndSession") == 0) + respond_to_end_session (proxy); + else if (g_strcmp0 (signal_name, "Stop") == 0) + g_main_loop_quit (app->loop); +} + +static void +client_proxy_ready_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + A11yBusLauncher *app = user_data; + GError *error = NULL; + + app->client_proxy = g_dbus_proxy_new_for_bus_finish (res, &error); + + if (error != NULL) + { + g_warning ("Failed to get a client proxy: %s", error->message); + g_error_free (error); + + return; + } + + g_signal_connect (app->client_proxy, "g-signal", + G_CALLBACK (g_signal_cb), app); +} + +static void +register_client (A11yBusLauncher *app) +{ + GDBusProxyFlags flags; + GDBusProxy *sm_proxy; + GError *error; + const gchar *app_id; + const gchar *autostart_id; + gchar *client_startup_id; + GVariant *parameters; + GVariant *variant; + gchar *object_path; + + flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS; + + error = NULL; + sm_proxy = g_dbus_proxy_new_sync (app->session_bus, flags, NULL, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + NULL, &error); + + if (error != NULL) + { + g_warning ("Failed to get session manager proxy: %s", error->message); + g_error_free (error); + + return; + } + + app_id = "at-spi-bus-launcher"; + autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID"); + + if (autostart_id != NULL) + { + client_startup_id = g_strdup (autostart_id); + g_unsetenv ("DESKTOP_AUTOSTART_ID"); + } + else + { + client_startup_id = g_strdup (""); + } + + parameters = g_variant_new ("(ss)", app_id, client_startup_id); + g_free (client_startup_id); + + error = NULL; + variant = g_dbus_proxy_call_sync (sm_proxy, + "RegisterClient", parameters, + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &error); + + g_object_unref (sm_proxy); + + if (error != NULL) + { + g_warning ("Failed to register client: %s", error->message); + g_error_free (error); + + return; + } + + g_variant_get (variant, "(o)", &object_path); + g_variant_unref (variant); + + flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES; + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, flags, NULL, + "org.gnome.SessionManager", object_path, + "org.gnome.SessionManager.ClientPrivate", + NULL, client_proxy_ready_cb, app); + + g_free (object_path); +} + +static void setup_bus_child (gpointer data) { A11yBusLauncher *app = data; @@ -454,7 +583,8 @@ on_name_acquired (GDBusConnection *connection, gpointer user_data) { A11yBusLauncher *app = user_data; - (void) app; + + register_client (app); } static int sigterm_pipefd[2]; |