[evolution] Add a --quit command-line option.



commit aa3152a2ec7b38232d71b32d085958e899cdc7c5
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Nov 26 10:25:08 2009 -0500

    Add a --quit command-line option.
    
    This -asks- an existing Evolution process to quit.  It is equivalent to
    selecting File->Quit in the main window.  It does not kill the process.
    
    My plan is to use this as part of a new --force-shutdown implementation.

 doc/reference/shell/tmpl/e-shell.sgml |    1 +
 shell/e-shell.c                       |   75 ++++++++++++++++++++++++--------
 shell/e-shell.h                       |    2 +-
 shell/main.c                          |    8 +++-
 4 files changed, 64 insertions(+), 22 deletions(-)
---
diff --git a/doc/reference/shell/tmpl/e-shell.sgml b/doc/reference/shell/tmpl/e-shell.sgml
index c2697cc..ce167e2 100644
--- a/doc/reference/shell/tmpl/e-shell.sgml
+++ b/doc/reference/shell/tmpl/e-shell.sgml
@@ -297,6 +297,7 @@ EShell
 </para>
 
 @shell: 
+ Returns: 
 
 
 <!-- ##### FUNCTION e_shell_cancel_quit ##### -->
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 1e5fecf..e03efb4 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -606,7 +606,7 @@ shell_constructed (GObject *object)
 		shell_add_backend, object);
 }
 
-static gboolean
+static UniqueResponse
 shell_message_handle_new (EShell *shell,
                           UniqueMessageData *data)
 {
@@ -616,10 +616,10 @@ shell_message_handle_new (EShell *shell,
 	e_shell_create_shell_window (shell, view_name);
 	g_free (view_name);
 
-	return TRUE;
+	return UNIQUE_RESPONSE_OK;
 }
 
-static gboolean
+static UniqueResponse
 shell_message_handle_open (EShell *shell,
                            UniqueMessageData *data)
 {
@@ -645,16 +645,21 @@ shell_message_handle_open (EShell *shell,
 	}
 	g_strfreev (uris);
 
-	return TRUE;
+	return UNIQUE_RESPONSE_OK;
 }
 
-static gboolean
+static UniqueResponse
 shell_message_handle_close (EShell *shell,
                             UniqueMessageData *data)
 {
-	e_shell_quit (shell);
+	UniqueResponse response;
 
-	return TRUE;
+	if (e_shell_quit (shell))
+		response = UNIQUE_RESPONSE_OK;
+	else
+		response = UNIQUE_RESPONSE_CANCEL;
+
+	return response;
 }
 
 static UniqueResponse
@@ -670,19 +675,13 @@ shell_message_received (UniqueApp *app,
 			break;  /* use the default behavior */
 
 		case UNIQUE_NEW:
-			if (shell_message_handle_new (shell, data))
-				return UNIQUE_RESPONSE_OK;
-			break;
+			return shell_message_handle_new (shell, data);
 
 		case UNIQUE_OPEN:
-			if (shell_message_handle_open (shell, data))
-				return UNIQUE_RESPONSE_OK;
-			break;
+			return shell_message_handle_open (shell, data);
 
 		case UNIQUE_CLOSE:
-			if (shell_message_handle_close (shell, data))
-				return UNIQUE_RESPONSE_OK;
-			break;
+			return shell_message_handle_close (shell, data);
 
 		default:
 			break;
@@ -1611,15 +1610,53 @@ e_shell_event (EShell *shell,
 	g_signal_emit (shell, signals[EVENT], detail, event_data);
 }
 
-void
+/**
+ * e_shell_quit:
+ * @shell: an #EShell
+ *
+ * Requests an application shutdown.  This happens in two phases: the
+ * first is synchronous, the second is asynchronous.
+ *
+ * In the first phase, the @shell emits a #EShell::quit-requested signal
+ * to potentially give the user a chance to cancel shutdown.  If the user
+ * cancels shutdown, the function returns %FALSE.  Otherwise it proceeds
+ * into the second phase.
+ *
+ * In the second phase, the @shell emits a #EShell::prepare-for-quit
+ * signal and immediately returns %TRUE.  Signal handlers may delay the
+ * actual application shutdown while they clean up resources, but there
+ * is no way to cancel shutdown at this point.
+ *
+ * Consult the documentation for these two signals for details on how
+ * to handle them.
+ *
+ * Returns: %TRUE if shutdown is underway, %FALSE if it was cancelled
+ **/
+gboolean
 e_shell_quit (EShell *shell)
 {
-	g_return_if_fail (E_IS_SHELL (shell));
+	UniqueApp *app;
+	UniqueResponse response;
+
+	g_return_val_if_fail (E_IS_SHELL (shell), FALSE);
+
+	app = UNIQUE_APP (shell);
+
+	if (unique_app_is_running (app))
+		goto unique;
 
 	if (!shell_request_quit (shell))
-		return;
+		return FALSE;
 
 	shell_prepare_for_quit (shell);
+
+	return TRUE;
+
+unique:  /* Send a message to the other Evolution process. */
+
+	response = unique_app_send_message (app, UNIQUE_CLOSE, NULL);
+
+	return (response == UNIQUE_RESPONSE_OK);
 }
 
 /**
diff --git a/shell/e-shell.h b/shell/e-shell.h
index 468cc3a..94821bb 100644
--- a/shell/e-shell.h
+++ b/shell/e-shell.h
@@ -106,7 +106,7 @@ GtkWidget *	e_shell_get_preferences_window	(EShell *shell);
 void		e_shell_event			(EShell *shell,
 						 const gchar *event_name,
 						 gpointer event_data);
-void		e_shell_quit			(EShell *shell);
+gboolean	e_shell_quit			(EShell *shell);
 void		e_shell_cancel_quit		(EShell *shell);
 
 G_END_DECLS
diff --git a/shell/main.c b/shell/main.c
index e96620a..3e3268b 100644
--- a/shell/main.c
+++ b/shell/main.c
@@ -87,7 +87,7 @@ static gboolean force_migrate = FALSE;
 static gboolean disable_eplugin = FALSE;
 static gboolean disable_preview = FALSE;
 static gboolean import_uris = FALSE;
-static gboolean idle_cb (gchar **uris);
+static gboolean quit = FALSE;
 
 static gchar *geometry = NULL;
 static gchar *requested_view = NULL;
@@ -237,7 +237,9 @@ idle_cb (gchar **uris)
 
 	/* These calls do the right thing when another Evolution
 	 * process is running. */
-	if (uris != NULL && *uris != NULL) {
+	if (quit)
+		e_shell_quit (shell);
+	else if (uris != NULL && *uris != NULL) {
 		if (e_shell_handle_uris (shell, uris, import_uris) == 0)
 			gtk_main_quit ();
 	} else
@@ -334,6 +336,8 @@ static GOptionEntry entries[] = {
 	  &setup_only, NULL, NULL },
 	{ "import", 'i', 0, G_OPTION_ARG_NONE, &import_uris,
 	  N_("Import URIs or file names given as rest of arguments."), NULL },
+	{ "quit", 'q', 0, G_OPTION_ARG_NONE, &quit,
+	  N_("Request a running Evolution process to quit"), NULL },
 	{ G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining_args, NULL, NULL },
 	{ NULL }
 };



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]