← Back to team overview

lightdm-gtk-greeter-team team mailing list archive

[Merge] lp:~kalgasnik/lightdm-gtk-greeter/lp-1377743-indicator-services-restart-after-every-resume into lp:lightdm-gtk-greeter

 

Andrew P. has proposed merging lp:~kalgasnik/lightdm-gtk-greeter/lp-1377743-indicator-services-restart-after-every-resume into lp:lightdm-gtk-greeter.

Requested reviews:
  LightDM Gtk+ Greeter Development Team (lightdm-gtk-greeter-team)
Related bugs:
  Bug #1366534 in LightDM GTK+ Greeter: "lightdm lefts a11y (at-spi*) process behind"
  https://bugs.launchpad.net/lightdm-gtk-greeter/+bug/1366534
  Bug #1377743 in LightDM GTK+ Greeter: "indicator services restart after every resume"
  https://bugs.launchpad.net/lightdm-gtk-greeter/+bug/1377743

For more details, see:
https://code.launchpad.net/~kalgasnik/lightdm-gtk-greeter/lp-1377743-indicator-services-restart-after-every-resume/+merge/243145

#1377743: indicator services restart after every resume

#1366534: lightdm lefts a11y (at-spi*) process behind
This solution is better than one used in debian, but I don't like it too.
It's still possible to see lightdm's at-spi processes after login in some cases.
Needs testing.
-- 
Your team LightDM Gtk+ Greeter Development Team is requested to review the proposed merge of lp:~kalgasnik/lightdm-gtk-greeter/lp-1377743-indicator-services-restart-after-every-resume into lp:lightdm-gtk-greeter.
=== modified file 'src/lightdm-gtk-greeter.c'
--- src/lightdm-gtk-greeter.c	2014-09-01 07:58:56 +0000
+++ src/lightdm-gtk-greeter.c	2014-11-28 12:04:27 +0000
@@ -61,6 +61,11 @@
 static gchar *state_filename;
 static void save_state_file (void);
 
+/* Terminating */
+GSList *pids_to_close = NULL;
+static void sigterm_cb (gpointer user_data);
+static void close_pid (GPid *pid, gboolean remove);
+
 /* Screen window */
 static GtkOverlay *screen_overlay;
 
@@ -254,11 +259,7 @@
 /* Maybe unnecessary (in future) trick to enable accelerators for hidden/detached menu items */
 static void reassign_menu_item_accel (GtkWidget *item);
 
-#ifdef START_INDICATOR_SERVICES
-static void init_indicators (GKeyFile* config, GPid* indicator_pid, GPid* spi_pid);
-#else
 static void init_indicators (GKeyFile* config);
-#endif
 
 static void layout_selected_cb (GtkCheckMenuItem *menuitem, gpointer user_data);
 static void update_layouts_menu (void);
@@ -312,6 +313,31 @@
     }
 }
 
+/* Terminating */
+
+static void
+sigterm_cb (gpointer user_data)
+{
+    g_slist_foreach (pids_to_close, (GFunc)close_pid, GINT_TO_POINTER (FALSE));
+    g_slist_free (pids_to_close);
+    pids_to_close = NULL;
+    gtk_main_quit ();
+}
+
+static void
+close_pid (GPid *ppid, gboolean remove)
+{
+    if (!ppid || !*ppid)
+        return;
+
+    if (remove)
+        pids_to_close = g_slist_remove (pids_to_close, GINT_TO_POINTER (*ppid));
+
+    kill (*ppid, SIGTERM);
+    waitpid (*ppid, NULL, 0);
+    *ppid = 0;
+}
+
 /* Power window */
 
 static gboolean
@@ -755,7 +781,11 @@
             g_child_watch_add (command->pid, (GChildWatchFunc)menu_command_terminated_cb, command);
     }
 
-    if (!spawned)
+    if (spawned)
+    {
+        pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (command->pid));
+    }
+    else
     {
         if (error)
             g_warning ("Command spawning error: '%s'", error->message);
@@ -773,9 +803,7 @@
 
     if (command->pid)
     {
-        kill (command->pid, SIGTERM);
-        g_spawn_close_pid (command->pid);
-        command->pid = 0;
+        close_pid (&command->pid, TRUE);
         if (command->menu_item)
             gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (command->menu_item), FALSE);
         if (command->widget)
@@ -1293,11 +1321,7 @@
 }
 
 static void
-#ifdef START_INDICATOR_SERVICES
-init_indicators (GKeyFile* config, GPid* indicator_pid, GPid* spi_pid)
-#else
 init_indicators (GKeyFile* config)
-#endif
 {
     gchar **names = NULL;
     gsize length = 0;
@@ -1313,12 +1337,6 @@
     const gchar *DEFAULT_LAYOUT[] = {"~host", "~spacer", "~clock", "~spacer",
                                      "~session", "~language", "~a11y", "~power", NULL};
 
-#ifdef START_INDICATOR_SERVICES
-    GError *error = NULL;
-    gchar *AT_SPI_CMD[] = {"/usr/lib/at-spi2-core/at-spi-bus-launcher", "--launch-immediately", NULL};
-    gchar *INDICATORS_CMD[] = {"init", "--user", "--startup-event", "indicator-services-start", NULL};
-#endif
-
     if (g_key_file_has_key (config, "greeter", "indicators", NULL))
     {   /* no option = default list, empty value = empty list */
         names = g_key_file_get_string_list (config, "greeter", "indicators", &length, NULL);
@@ -1399,12 +1417,14 @@
             greeter_set_env ("GVFS_DISABLE_FUSE", "1");
 
             #ifdef START_INDICATOR_SERVICES
-            if (!g_spawn_async (NULL, AT_SPI_CMD, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, spi_pid, &error))
-                g_warning ("Failed to run \"at-spi-bus-launcher\": %s", error->message);
-            g_clear_error (&error);
+            gchar *INDICATORS_CMD[] = {"init", "--user", "--startup-event", "indicator-services-start", NULL};
+            GError *error = NULL;
+            GPid pid = 0;
 
-            if (!g_spawn_async (NULL, INDICATORS_CMD, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, indicator_pid, &error))
-                g_warning ("Failed to run \"indicator-services\": %s", error->message);
+            if (g_spawn_async (NULL, INDICATORS_CMD, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &error))
+                pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (pid));
+            else
+                g_warning ("[Greeter] Failed to run 'init --startup-event indicator-services-start': %s", error->message);
             g_clear_error (&error);
             #endif
             inited = TRUE;
@@ -2457,10 +2477,6 @@
     GError *error = NULL;
     Display *display;
 
-    #ifdef START_INDICATOR_SERVICES
-    GPid indicator_pid = 0, spi_pid = 0;
-    #endif
-
     /* Prevent memory from being swapped out, as we are dealing with passwords */
     mlockall (MCL_CURRENT | MCL_FUTURE);
 
@@ -2470,13 +2486,16 @@
     /* LP: #1024482 */
     g_setenv ("GDK_CORE_DEVICE_EVENTS", "1", TRUE);
 
+    /* LP: #1366534 */
+    g_setenv ("NO_AT_BRIDGE", "1", TRUE);
+
     /* Initialize i18n */
     setlocale (LC_ALL, "");
     bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
     bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
     textdomain (GETTEXT_PACKAGE);
 
-    g_unix_signal_add (SIGTERM, (GSourceFunc)gtk_main_quit, NULL);
+    g_unix_signal_add (SIGTERM, (GSourceFunc)sigterm_cb, pids_to_close);
 
     /* init gtk */
     gtk_init (&argc, &argv);
@@ -2638,11 +2657,7 @@
     gtk_accel_map_add_entry ("<Login>/a11y/reader", GDK_KEY_F4, 0);
     gtk_accel_map_add_entry ("<Login>/power/shutdown", GDK_KEY_F4, GDK_MOD1_MASK);
 
-#ifdef START_INDICATOR_SERVICES
-    init_indicators (config, &indicator_pid, &spi_pid);
-#else
     init_indicators (config);
-#endif
 
     /* Hide empty panel */
     GList *menubar_items = gtk_container_get_children (GTK_CONTAINER (menubar));
@@ -2765,6 +2780,20 @@
     gtk_widget_set_visible (reader_menuitem, a11y_reader_command != NULL);
     g_free (value);
 
+    if (a11y_keyboard_command || a11y_reader_command)
+    {
+        gchar *AT_SPI_CMD[] = {"/usr/lib/at-spi2-core/at-spi-bus-launcher", "--launch-immediately", NULL};
+        GPid pid = 0;
+        if (g_spawn_async (NULL, AT_SPI_CMD, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &error))
+        {
+            g_debug ("[Greeter] AT-SPI launched");
+            pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (pid));
+        }
+        else
+            g_warning ("[Greeter] Failed to launch AT-SPI: %s", error->message);
+        g_clear_error (&error);
+    }
+
     /* Power menu */
     if (gtk_widget_get_visible (power_menuitem))
     {
@@ -2965,19 +2994,7 @@
 
     gtk_main ();
 
-#ifdef START_INDICATOR_SERVICES
-    if (indicator_pid)
-    {
-		kill (indicator_pid, SIGTERM);
-		waitpid (indicator_pid, NULL, 0);
-    }
-
-    if (spi_pid)
-    {
-		kill (spi_pid, SIGTERM);
-		waitpid (spi_pid, NULL, 0);
-    }
-#endif
+    g_slist_foreach (pids_to_close, (GFunc)close_pid, NULL);
 
     return EXIT_SUCCESS;
 }


Follow ups