|
|
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 |
|