GApplication: parse command line options

Add support for parsing command line options with GApplication.

You can add GOptionGroup and GOptionEntry using two new APIs:
g_application_add_option_group() and
g_application_add_main_option_entries().

Also add a "handle-local-options" signal that allows handling of
commandline arguments in the local process without having to override
local_command_line.

As a special feature, you can have a %NULL @arg_data in a GOptionEntry
which will cause the argument to be stored in a GVariantDict.  This
dictionary is available for inspection and modification by the
"handle-local-options" signal and can be forwarded to the primary
instance in cases of command line invocation (where it can be fetched
using g_application_command_line_get_options()).

https://bugzilla.gnome.org/show_bug.cgi?id=721977
This commit is contained in:
Ryan Lortie
2014-01-12 18:14:30 -05:00
parent 7f36233042
commit 0e671286fc
7 changed files with 658 additions and 154 deletions

View File

@@ -211,6 +211,7 @@ enum
{
PROP_NONE,
PROP_ARGUMENTS,
PROP_OPTIONS,
PROP_PLATFORM_DATA,
PROP_IS_REMOTE
};
@@ -219,6 +220,8 @@ struct _GApplicationCommandLinePrivate
{
GVariant *platform_data;
GVariant *arguments;
GVariant *options;
GVariantDict *options_dict;
gchar *cwd;
gchar **environ;
@@ -253,6 +256,12 @@ grok_platform_data (GApplicationCommandLine *cmdline)
cmdline->priv->environ =
g_variant_dup_bytestring_array (value, NULL);
}
else if (strcmp (key, "options") == 0)
{
if (!cmdline->priv->options)
cmdline->priv->options = g_variant_ref (value);
}
}
static void
@@ -321,6 +330,11 @@ g_application_command_line_set_property (GObject *object,
cmdline->priv->arguments = g_value_dup_variant (value);
break;
case PROP_OPTIONS:
g_assert (cmdline->priv->options == NULL);
cmdline->priv->options = g_value_dup_variant (value);
break;
case PROP_PLATFORM_DATA:
g_assert (cmdline->priv->platform_data == NULL);
cmdline->priv->platform_data = g_value_dup_variant (value);
@@ -338,6 +352,12 @@ g_application_command_line_finalize (GObject *object)
{
GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object);
if (cmdline->priv->options_dict)
g_variant_dict_unref (cmdline->priv->options_dict);
if (cmdline->priv->options)
g_variant_unref (cmdline->priv->options);
if (cmdline->priv->platform_data)
g_variant_unref (cmdline->priv->platform_data);
if (cmdline->priv->arguments)
@@ -394,6 +414,13 @@ g_application_command_line_class_init (GApplicationCommandLineClass *class)
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class, PROP_OPTIONS,
g_param_spec_variant ("options",
P_("Options"),
P_("The options sent along with the commandline"),
G_VARIANT_TYPE_VARDICT, NULL, G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class, PROP_PLATFORM_DATA,
g_param_spec_variant ("platform-data",
P_("Platform data"),
@@ -450,6 +477,35 @@ g_application_command_line_get_arguments (GApplicationCommandLine *cmdline,
return argv;
}
/**
* g_application_command_line_get_options_dict:
* @cmdline: a #GApplicationCommandLine
*
* Gets the options there were passed to g_application_command_line().
*
* If you did not override local_command_line() then these are the same
* options that were parsed according to the #GOptionEntrys added to the
* application with g_application_add_main_option_entries() and possibly
* modified from your GApplication::handle-local-options handler.
*
* If no options were sent then an empty dictionary is returned so that
* you don't need to check for %NULL.
*
* Returns: (transfer none): a #GVariantDict with the options
*
* Since: 2.40
**/
GVariantDict *
g_application_command_line_get_options_dict (GApplicationCommandLine *cmdline)
{
g_return_val_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline), NULL);
if (!cmdline->priv->options_dict)
cmdline->priv->options_dict = g_variant_dict_new (cmdline->priv->options);
return cmdline->priv->options_dict;
}
/**
* g_application_command_line_get_stdin:
* @cmdline: a #GApplicationCommandLine