application: handle command line options right

Commandline arguments are now handled by the primary instance of the
application. And so outputs for --help, and --version are shown there.
Not where the application is invoked.

So hook to handle-local-options so that the arguments are parsed locally,
and sent unparsed ones to primary instance in case it is required.

As a side effect, the arguments passed to --date and --uuid are not updated
in the primary instance on subsequent runs (ie, when the primary instance
is already up and running). So check the commandline arguments as they
arrives rather than saving them to a variable, which won't then be updated.

https://bugzilla.gnome.org/show_bug.cgi?id=773152
This commit is contained in:
Mohammed Sadiq
2017-09-07 11:45:12 -03:00
committed by Georges Basile Stavracas Neto
parent 9c6c8770ec
commit 24a2e97df2
+35 -37
View File
@@ -78,9 +78,6 @@ static void gcal_application_quit (GSimpleAction *
G_DEFINE_TYPE (GcalApplication, gcal_application, GTK_TYPE_APPLICATION);
static gboolean show_version = FALSE;
static gboolean debug = FALSE;
static gchar* date = NULL;
static gchar* uuid = NULL;
static GOptionEntry gcal_application_goptions[] = {
{
@@ -90,17 +87,17 @@ static GOptionEntry gcal_application_goptions[] = {
},
{
"debug", 'd', 0,
G_OPTION_ARG_NONE, &debug,
G_OPTION_ARG_NONE, NULL,
N_("Enable debug messages"), NULL
},
{
"date", 'd', 0,
G_OPTION_ARG_STRING, &date,
G_OPTION_ARG_STRING, NULL,
N_("Open calendar on the passed date"), NULL
},
{
"uuid", 'u', 0,
G_OPTION_ARG_STRING, &uuid,
G_OPTION_ARG_STRING, NULL,
N_("Open calendar showing the passed event"), NULL
},
{ NULL }
@@ -274,44 +271,32 @@ gcal_application_command_line (GApplication *app,
GApplicationCommandLine *command_line)
{
GcalApplication *self;
GOptionContext *context;
gchar **argv;
GError *error;
gint argc;
GVariantDict *options;
GVariant *option;
const gchar* date = NULL;
const gchar* uuid = NULL;
gsize length;
self = GCAL_APPLICATION (app);
argv = g_application_command_line_get_arguments (command_line, &argc);
context = g_option_context_new (N_("— Calendar management"));
g_option_context_add_main_entries (context, gcal_application_goptions, GETTEXT_PACKAGE);
options = g_application_command_line_get_options_dict (command_line);
error = NULL;
if (!g_option_context_parse (context, &argc, &argv, &error))
{
g_critical ("Failed to parse argument: %s", error->message);
g_error_free (error);
g_option_context_free (context);
return 1;
}
if (show_version)
{
g_print ("gnome-calendar: Version %s\n", PACKAGE_VERSION);
return 0;
}
if (debug)
if (g_variant_dict_contains (options, "debug"))
gcal_log_init ();
if (uuid != NULL)
if (g_variant_dict_contains (options, "uuid"))
{
option = g_variant_dict_lookup_value (options, "uuid", G_VARIANT_TYPE_STRING);
uuid = g_variant_get_string (option, &length);
gcal_application_set_uuid (GCAL_APPLICATION (app), uuid);
g_clear_pointer (&uuid, g_free);
g_variant_unref (option);
}
else if (date != NULL)
else if (g_variant_dict_contains (options, "date"))
{
struct tm result;
option = g_variant_dict_lookup_value (options, "date", G_VARIANT_TYPE_STRING);
date = g_variant_get_string (option, &length);
if (e_time_parse_date_and_time (date, &result) == E_TIME_PARSE_OK)
{
if (self->initial_date == NULL)
@@ -322,17 +307,27 @@ gcal_application_command_line (GApplication *app,
gcal_manager_get_system_timezone (self->manager));
}
g_clear_pointer (&date, g_free);
g_variant_unref (option);
}
g_option_context_free (context);
g_strfreev (argv);
g_application_activate (app);
return 0;
}
static gint
gcal_application_handle_local_options (GApplication *app,
GVariantDict *options)
{
if (show_version)
{
g_print ("gnome-calendar: Version %s\n", PACKAGE_VERSION);
return 0;
}
return -1;
}
static gboolean
gcal_application_dbus_register (GApplication *application,
GDBusConnection *connection,
@@ -390,6 +385,7 @@ gcal_application_class_init (GcalApplicationClass *klass)
application_class->activate = gcal_application_activate;
application_class->startup = gcal_application_startup;
application_class->command_line = gcal_application_command_line;
application_class->handle_local_options = gcal_application_handle_local_options;
application_class->dbus_register = gcal_application_dbus_register;
application_class->dbus_unregister = gcal_application_dbus_unregister;
@@ -398,6 +394,8 @@ gcal_application_class_init (GcalApplicationClass *klass)
static void
gcal_application_init (GcalApplication *self)
{
g_application_add_main_option_entries (G_APPLICATION (self), gcal_application_goptions);
self->settings = g_settings_new ("org.gnome.calendar");
self->colors_provider = gtk_css_provider_new ();