From 2aad89ab9bbad6c743f2f1a4d1cacb31a64faf50 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 8 Apr 2011 07:13:54 -0400 Subject: [PATCH] Avoid an interaction between GApplication and GOption When using GOption to handle commandlines, we need to disable the builtin help handling, since it calls exit(). Also mention this particular pitfall in the docs. --- gio/gapplicationcommandline.c | 5 ++++- gio/tests/gapplication-example-cmdline3.c | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gio/gapplicationcommandline.c b/gio/gapplicationcommandline.c index b3c98f5bb..7e4d3333e 100644 --- a/gio/gapplicationcommandline.c +++ b/gio/gapplicationcommandline.c @@ -106,7 +106,10 @@ G_DEFINE_TYPE (GApplicationCommandLine, g_application_command_line, G_TYPE_OBJEC * * * This example also shows how to use #GOptionContext for parsing the - * commandline arguments. + * commandline arguments. Note that it is necessary to disable the + * built-in help-handling of #GOptionContext, since it calls exit() + * after printing help, which is not what you want to happen in + * the primary instance. * * * diff --git a/gio/tests/gapplication-example-cmdline3.c b/gio/tests/gapplication-example-cmdline3.c index 3d0c8b17a..a573a4a4d 100644 --- a/gio/tests/gapplication-example-cmdline3.c +++ b/gio/tests/gapplication-example-cmdline3.c @@ -11,10 +11,12 @@ my_cmdline_handler (gpointer data) gint argc; gint arg1; gboolean arg2; + gboolean help; GOptionContext *context; GOptionEntry entries[] = { { "arg1", 0, 0, G_OPTION_ARG_INT, &arg1, NULL, NULL }, { "arg2", 0, 0, G_OPTION_ARG_NONE, &arg2, NULL, NULL }, + { "help", '?', 0, G_OPTION_ARG_NONE, &help, NULL, NULL }, { NULL } }; GError *error; @@ -30,10 +32,12 @@ my_cmdline_handler (gpointer data) argv[i] = args[i]; context = g_option_context_new (NULL); + g_option_context_set_help_enabled (context, FALSE); g_option_context_add_main_entries (context, entries, NULL); arg1 = 0; arg2 = FALSE; + help = FALSE; error = NULL; if (!g_option_context_parse (context, &argc, &argv, &error)) { @@ -41,6 +45,13 @@ my_cmdline_handler (gpointer data) g_error_free (error); g_application_command_line_set_exit_status (cmdline, 1); } + else if (help) + { + gchar *text; + text = g_option_context_get_help (context, FALSE, NULL); + g_application_command_line_print (cmdline, "%s", text); + g_free (text); + } else { g_application_command_line_print (cmdline, "arg1 is %d and arg2 is %s\n",