Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.3:Rings:1-MinimalX
at-spi2-core
at-spi2-core-session-management.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File at-spi2-core-session-management.patch of Package at-spi2-core
From 253ada975e0a374e7b1a6a07d2a483dd1d8c52fa Mon Sep 17 00:00:00 2001 From: Mike Gorse <mgorse@suse.com> Date: Thu, 14 Jul 2016 11:38:25 -0500 Subject: [PATCH] at-spi-bus-launcher: session management fixes At-spi-bus-launcher was attempting to register with gnome-session but typically failed because it was started before gnome-session is initialized. Now we check whether gnome-session is running and only attempt to register if it is; otherwise watch for SessionRunning and register when se wee it. Also, handle SessionOver. --- bus/at-spi-bus-launcher.c | 97 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 80 insertions(+), 17 deletions(-) diff --git a/bus/at-spi-bus-launcher.c b/bus/at-spi-bus-launcher.c index 54aa07f..50e76f4 100644 --- a/bus/at-spi-bus-launcher.c +++ b/bus/at-spi-bus-launcher.c @@ -61,6 +61,11 @@ typedef struct { char *a11y_launch_error_message; } A11yBusLauncher; +#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 A11yBusLauncher *_global_app = NULL; static const gchar introspection_xml[] = @@ -129,11 +134,12 @@ client_proxy_ready_cb (GObject *source_object, G_CALLBACK (g_signal_cb), app); } +static GDBusProxy *sm_proxy; + static void register_client (A11yBusLauncher *app) { GDBusProxyFlags flags; - GDBusProxy *sm_proxy; GError *error; const gchar *app_id; const gchar *autostart_id; @@ -141,24 +147,12 @@ register_client (A11yBusLauncher *app) GVariant *parameters; GVariant *variant; gchar *object_path; + static gboolean session_registered = FALSE; - flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | - G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS; + if (session_registered) + return; 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"); @@ -202,6 +196,75 @@ register_client (A11yBusLauncher *app) NULL, client_proxy_ready_cb, app); g_free (object_path); + + session_registered = TRUE; +} + +static void +on_session_signal (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + A11yBusLauncher *app = user_data; + + if (g_strcmp0 (signal_name, "SessionOver") == 0) { + g_main_loop_quit (app->loop); + } else if (g_strcmp0 (signal_name, "SessionRunning") == 0) { + register_client (app); + } +} + +static void +is_session_running_ready_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GDBusProxy *proxy; + A11yBusLauncher *app = user_data; + GVariant *values; + GError *error = NULL; + gboolean is_running = FALSE; + + proxy = G_DBUS_PROXY (source_object); + values = g_dbus_proxy_call_finish (proxy, res, &error); + if (values) { + g_variant_get (values, "(b)", &is_running); + g_variant_unref (values); + } + if (is_running) { + register_client (app); + } + } + +static gboolean +session_manager_connect (A11yBusLauncher *app) +{ + GVariant *res; + GError *error = NULL; + + 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, &error); + + if (error != NULL) + { + g_warning ("Failed to get session manager proxy: %s", error->message); + g_error_free (error); + + return; + } + + g_dbus_proxy_call (sm_proxy, + "IsSessionRunning", NULL, + 0, 1000, NULL, is_session_running_ready_cb, app); + + g_signal_connect (G_OBJECT (sm_proxy), "g-signal", + G_CALLBACK (on_session_signal), app); + + return (sm_proxy != NULL); } static void @@ -590,7 +653,7 @@ on_name_acquired (GDBusConnection *connection, { A11yBusLauncher *app = user_data; - register_client (app); + session_manager_connect (app); } static int sigterm_pipefd[2]; -- 2.6.6
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor