[gnome-terminal/gsettings] Add --wait option



commit 57684a8ba06f400c98af904f7b9c3d4f860ff7e5
Author: Christian Persch <chpe gnome org>
Date:   Tue Nov 22 00:36:01 2011 +0100

    Add --wait option
    
    When passed --wait, the client listens to 'child-exited' signal on
    the remote object, and then exits with the same exit status as the child.

 src/client.c               |   71 ++++++++++++++++++++++++++++++++++++++++++--
 src/org.gnome.Terminal.xml |    4 ++
 src/terminal-app.c         |    5 +--
 src/terminal-controller.c  |   20 ++++++++++--
 4 files changed, 90 insertions(+), 10 deletions(-)
---
diff --git a/src/client.c b/src/client.c
index 29ed919..0b000db 100644
--- a/src/client.c
+++ b/src/client.c
@@ -215,6 +215,9 @@ typedef struct
   char   *title;
   double  zoom;
 
+  /* Processing options */
+  gboolean wait;
+
   /* Flags */
   guint menubar_state_set : 1;
   guint zoom_set          : 1;
@@ -285,6 +288,13 @@ get_goption_context (OptionData *data)
     { NULL, 0, 0, 0, NULL, NULL, NULL }
   };
 
+  const GOptionEntry processing_goptions[] = {
+    { "wait", 0, 0, G_OPTION_ARG_NONE, &data->wait,
+      N_("Wait until the child exits"), NULL },
+    { NULL, 0, 0, 0, NULL, NULL, NULL }
+  };
+
+
   GOptionContext *context;
   GOptionGroup *group;
 
@@ -304,13 +314,21 @@ get_goption_context (OptionData *data)
 
   group = g_option_group_new ("terminal-options",
                               N_("Terminal options:"),
-                              N_("Show per-terminal options"),
+                              N_("Show terminal options"),
                               data,
                               NULL);
   g_option_group_set_translation_domain (group, GETTEXT_PACKAGE);
   g_option_group_add_entries (group, terminal_goptions);
   g_option_context_add_group (context, group);
 
+  group = g_option_group_new ("processing-goptions",
+                              N_("Processing options:"),
+                              N_("Show processing options"),
+                              data,
+                              NULL);
+  g_option_group_set_translation_domain (group, GETTEXT_PACKAGE);
+  g_option_group_add_entries (group, processing_goptions);
+  g_option_context_add_group (context, group);
   g_option_context_add_group (context, gtk_get_option_group (TRUE));
 
   return context;
@@ -448,12 +466,29 @@ build_exec_options_variant (OptionData *data)
   return g_variant_builder_end (&builder);
 }
 
+typedef struct {
+  GMainLoop *loop;
+  int exit_code;
+} WaitData;
+
+static void
+receiver_child_exited_cb (TerminalReceiver *receiver,
+                          int exit_code,
+                          WaitData *data)
+{
+  data->exit_code = exit_code;
+
+  if (g_main_loop_is_running (data->loop))
+    g_main_loop_quit (data->loop);
+}
+
 static gboolean
 handle_open (int *argc,
              char ***argv,
              gboolean request_completion,
              const gchar *completion_cur,
-             const gchar *completion_prev)
+             const gchar *completion_prev,
+             int *exit_code)
 {
   OptionData *data;
   TerminalFactory *factory;
@@ -529,6 +564,25 @@ handle_open (int *argc,
     return FALSE;
   }
 
+  if (data->wait) {
+    WaitData wait_data;
+
+    wait_data.loop = g_main_loop_new (NULL, FALSE);
+    wait_data.exit_code = 255;
+
+    g_signal_connect (receiver, "child-exited", 
+                      G_CALLBACK (receiver_child_exited_cb), 
+                      &wait_data);
+    g_main_loop_run (wait_data.loop);
+    g_signal_handlers_disconnect_by_func (receiver,
+                                          G_CALLBACK (receiver_child_exited_cb),
+                                          &wait_data);
+
+    g_main_loop_unref (wait_data.loop);
+
+    *exit_code = wait_data.exit_code;
+  }
+
   option_data_free (data);
 
   g_object_unref (receiver);
@@ -578,6 +632,7 @@ gint
 main (gint argc, gchar *argv[])
 {
   int ret;
+  int exit_code = 0;
   const gchar *command;
   gboolean request_completion;
   gchar *completion_cur;
@@ -628,7 +683,8 @@ main (gint argc, gchar *argv[])
                        &argv,
                        request_completion,
                        completion_cur,
-                       completion_prev))
+                       completion_prev,
+                       &exit_code))
         ret = EXIT_SUCCESS;
       goto out;
     }
@@ -717,5 +773,14 @@ main (gint argc, gchar *argv[])
   g_free (completion_cur);
   g_free (completion_prev);
 
+  if (ret == 0 && exit_code != 0) {
+    if (WIFEXITED (exit_code))
+      return WEXITSTATUS (exit_code);
+    else if (WIFSIGNALED (exit_code))
+      raise (WTERMSIG (exit_code));
+    else
+      return 255;
+  }
+
   return ret;
 }
diff --git a/src/org.gnome.Terminal.xml b/src/org.gnome.Terminal.xml
index ba68dd5..06fe6ab 100644
--- a/src/org.gnome.Terminal.xml
+++ b/src/org.gnome.Terminal.xml
@@ -34,5 +34,9 @@
         <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true" />
       </arg>
     </method>
+    
+    <signal name="ChildExited">
+      <arg type="i" name="exit_code" direction="in" />
+    </signal>
   </interface>
 </node>
diff --git a/src/terminal-app.c b/src/terminal-app.c
index ae18e24..1a95c3c 100644
--- a/src/terminal-app.c
+++ b/src/terminal-app.c
@@ -1159,7 +1159,7 @@ terminal_app_create_instance (TerminalFactory *factory,
   char *object_path;
   GSettings *profile = NULL;
   GdkScreen *gdk_screen;
-  const char *startup_id, *display_name, *working_directory;
+  const char *startup_id, *display_name;
   int screen_number;
   gboolean is_restored = FALSE;
   gboolean start_fullscreen = FALSE;
@@ -1196,9 +1196,6 @@ terminal_app_create_instance (TerminalFactory *factory,
   if (startup_id != NULL)
     _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
                            "Startup ID is '%s'\n", startup_id);
-  if (working_directory != NULL)
-    _terminal_debug_print (TERMINAL_DEBUG_FACTORY,
-                           "CWD is '%s'\n", working_directory);
 
   if (!g_variant_lookup (options, "zoom", "d", &zoom))
     zoom_set = FALSE;
diff --git a/src/terminal-controller.c b/src/terminal-controller.c
index 657ecd0..db74871 100644
--- a/src/terminal-controller.c
+++ b/src/terminal-controller.c
@@ -35,6 +35,17 @@ enum {
 /* helper functions */
 
 static void
+child_exited_cb (VteTerminal *terminal,
+                 TerminalReceiver *receiver)
+{
+  int exit_code;
+
+  exit_code = vte_terminal_get_child_exit_status (terminal);;
+
+  terminal_receiver_emit_child_exited (receiver, exit_code);
+}
+
+static void
 terminal_controller_set_screen (TerminalController *controller,
                                 TerminalScreen *screen)
 {
@@ -48,13 +59,16 @@ terminal_controller_set_screen (TerminalController *controller,
     return;
 
   if (priv->screen) {
-    g_signal_handlers_disconnect_by_func (priv->screen,
-                                          G_CALLBACK (_terminal_controller_unset_screen),
-                                          controller);
+    g_signal_handlers_disconnect_matched (priv->screen,
+                                          G_SIGNAL_MATCH_DATA,
+                                          0, 0, NULL, NULL, controller);
   }
 
   priv->screen = screen;
   if (screen) {
+    g_signal_connect (screen, "child-exited",
+                      G_CALLBACK (child_exited_cb), 
+                      controller);
     g_signal_connect_swapped (screen, "destroy",
                               G_CALLBACK (_terminal_controller_unset_screen), 
                               controller);



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