c04169c
From f2654acb1760fd473dffa28abc1b8e25ca1dbbca Mon Sep 17 00:00:00 2001
c04169c
From: leigh123linux <leigh123linux@googlemail.com>
c04169c
Date: Sat, 1 Aug 2015 15:14:32 +0100
c04169c
Subject: [PATCH] Revert "Fix zombie screensavers"
c04169c
c04169c
This reverts commit 7db84a08fa05be09a9fc7d75d93601313bc4ab6a.
c04169c
---
c04169c
 src/gs-window-x11.c | 78 +++++++++++++++++++++--------------------------------
c04169c
 1 file changed, 31 insertions(+), 47 deletions(-)
c04169c
c04169c
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
c04169c
index 6ed384d..a34f116 100644
c04169c
--- a/src/gs-window-x11.c
c04169c
+++ b/src/gs-window-x11.c
c04169c
@@ -53,7 +53,7 @@ static void remove_command_watches (GSWindow *window);
c04169c
 
c04169c
 static void gs_window_show_screensaver (GSWindow *window);
c04169c
 static void gs_window_hide_screensaver (GSWindow *window);
c04169c
-static void screensaver_command_finish (GSWindow *window);
c04169c
+static void gs_window_kill_screensaver (GSWindow *window);
c04169c
 
c04169c
 static gboolean spawn_on_window (GSWindow *window, char *command, int *pid, GIOFunc watch_func, gpointer user_data, gint *watch_id);
c04169c
 
c04169c
@@ -642,26 +642,7 @@ create_screensaver_socket (GSWindow *window,
c04169c
   gtk_socket_add_id (GTK_SOCKET (window->priv->screensaver), id);
c04169c
   gs_window_show_screensaver (window);
c04169c
 }
c04169c
-
c04169c
-/* adapted from gspawn.c */
c04169c
-static int
c04169c
-wait_on_child (int pid)
c04169c
-{
c04169c
-        int status;
c04169c
-
c04169c
- wait_again:
c04169c
-        if (waitpid (pid, &status, 0) < 0) {
c04169c
-                if (errno == EINTR) {
c04169c
-                        goto wait_again;
c04169c
-                } else if (errno == ECHILD) {
c04169c
-                        ; /* do nothing, child already reaped */
c04169c
-                } else {
c04169c
-                        gs_debug ("waitpid () should not fail in 'GSWindow'");
c04169c
-                }
c04169c
-        }
c04169c
-
c04169c
-        return status;
c04169c
-}
c04169c
+                           
c04169c
 
c04169c
 static gboolean
c04169c
 screensaver_command_watch (GIOChannel   *source,
c04169c
@@ -709,14 +690,14 @@ screensaver_command_watch (GIOChannel   *source,
c04169c
 
c04169c
   if (finished) {
c04169c
     window->priv->screensaver_watch_id = 0;
c04169c
-    screensaver_command_finish (window);
c04169c
-
c04169c
+    gs_window_kill_screensaver (window);
c04169c
     return FALSE;
c04169c
   }
c04169c
 
c04169c
   return TRUE;
c04169c
 }
c04169c
 
c04169c
+
c04169c
 static void
c04169c
 gs_window_real_show (GtkWidget *widget)
c04169c
 {
c04169c
@@ -1157,6 +1138,25 @@ create_keyboard_socket (GSWindow *window,
c04169c
         gtk_socket_add_id (GTK_SOCKET (window->priv->keyboard_socket), id);
c04169c
 }
c04169c
 
c04169c
+/* adapted from gspawn.c */
c04169c
+static int
c04169c
+wait_on_child (int pid)
c04169c
+{
c04169c
+        int status;
c04169c
+
c04169c
+ wait_again:
c04169c
+        if (waitpid (pid, &status, 0) < 0) {
c04169c
+                if (errno == EINTR) {
c04169c
+                        goto wait_again;
c04169c
+                } else if (errno == ECHILD) {
c04169c
+                        ; /* do nothing, child already reaped */
c04169c
+                } else {
c04169c
+                        gs_debug ("waitpid () should not fail in 'GSWindow'");
c04169c
+                }
c04169c
+        }
c04169c
+
c04169c
+        return status;
c04169c
+}
c04169c
 
c04169c
 static void
c04169c
 kill_keyboard_command (GSWindow *window)
c04169c
@@ -1189,36 +1189,20 @@ gs_window_hide_screensaver (GSWindow *window) {
c04169c
 }
c04169c
 
c04169c
 static void
c04169c
-kill_screensaver_command (GSWindow *window)
c04169c
-{
c04169c
-  if (window->priv->screensaver_pid > 0) {
c04169c
-    signal_pid (window->priv->screensaver_pid, SIGTERM);
c04169c
-  }
c04169c
-}
c04169c
-
c04169c
-static void
c04169c
-screensaver_command_finish (GSWindow *window)
c04169c
+gs_window_kill_screensaver (GSWindow *window)
c04169c
 {
c04169c
-  g_return_if_fail (GS_IS_WINDOW (window));
c04169c
-
c04169c
-  gs_debug ("Screensaver finished");
c04169c
-
c04169c
   gs_window_hide_screensaver (window);
c04169c
-
c04169c
   if (window->priv->screensaver) {
c04169c
     gtk_widget_destroy (window->priv->screensaver);
c04169c
     window->priv->screensaver = NULL;
c04169c
   }
c04169c
-
c04169c
-  kill_screensaver_command (window);
c04169c
-
c04169c
   if (window->priv->screensaver_pid > 0) {
c04169c
     window->priv->screensaver_watch_id = 0;
c04169c
+    signal_pid (window->priv->screensaver_pid, SIGTERM);
c04169c
+    wait_on_child (window->priv->lock_pid);
c04169c
 
c04169c
-    wait_on_child (window->priv->screensaver_pid);
c04169c
-    g_spawn_close_pid (window->priv->screensaver_pid);
c04169c
-
c04169c
-    window->priv->screensaver_pid = 0;
c04169c
+    g_spawn_close_pid (window->priv->lock_pid);
c04169c
+    window->priv->lock_pid = 0;
c04169c
   }
c04169c
 }
c04169c
 
c04169c
@@ -1356,7 +1340,7 @@ gs_window_dialog_finish (GSWindow *window)
c04169c
 
c04169c
         gs_debug ("Dialog finished");
c04169c
 
c04169c
-        /* make sure we finish the keyboard and screensaver thing too */
c04169c
+        /* make sure we finish the keyboard thing too */
c04169c
         keyboard_command_finish (window);
c04169c
 
c04169c
         /* send a signal just in case */
c04169c
@@ -1528,7 +1512,7 @@ lock_command_watch (GIOChannel   *source,
c04169c
                 popdown_dialog (window);
c04169c
 
c04169c
                 if (window->priv->dialog_response == DIALOG_RESPONSE_OK) {  
c04169c
-                        kill_screensaver_command (window);
c04169c
+                        gs_window_kill_screensaver (window);
c04169c
                         add_emit_deactivated_idle (window);
c04169c
                 }
c04169c
 
c04169c
@@ -1540,6 +1524,7 @@ lock_command_watch (GIOChannel   *source,
c04169c
         return TRUE;
c04169c
 }
c04169c
 
c04169c
+
c04169c
 static gboolean
c04169c
 is_logout_enabled (GSWindow *window)
c04169c
 {
c04169c
@@ -2577,7 +2562,6 @@ gs_window_finalize (GObject *object)
c04169c
 
c04169c
         remove_command_watches (window);
c04169c
 
c04169c
-        screensaver_command_finish (window);
c04169c
         gs_window_dialog_finish (window);
c04169c
 
c04169c
         if (window->priv->background_surface) {
c04169c
-- 
c04169c
2.5.0
c04169c