[gnome-terminal/gsettings] Add --wait option
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-terminal/gsettings] Add --wait option
- Date: Mon, 21 Nov 2011 23:55:25 +0000 (UTC)
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]