From b32f8ba19bd05db95f65baa5074c942b3964c1d3 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Tue, 3 Feb 2015 14:09:44 +0100 Subject: [PATCH] gapplication: add a way to override the app-id Some applications support running in a mode where they present themselves as a different application to the user (for example web browsers or terminals). To facilitate this, add an option --gapplication-app-id which allows users to override an application's id from desktop files or similar. Applications need to opt-in to this by setting the G_APPLICATION_CAN_OVERRIDE_APP_ID flag. https://bugzilla.gnome.org/show_bug.cgi?id=743933 --- gio/gapplication.c | 32 +++++++++++++++++++++++++------- gio/gioenums.h | 7 ++++++- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/gio/gapplication.c b/gio/gapplication.c index 7a2cbb580..315134237 100644 --- a/gio/gapplication.c +++ b/gio/gapplication.c @@ -474,8 +474,10 @@ g_application_parse_command_line (GApplication *application, GError **error) { gboolean become_service = FALSE; + gchar *app_id = NULL; GVariantDict *dict = NULL; GOptionContext *context; + GOptionGroup *gapplication_group; /* Due to the memory management of GOptionGroup we can only parse * options once. That's because once you add a group to the @@ -487,6 +489,12 @@ g_application_parse_command_line (GApplication *application, context = g_option_context_new (NULL); + gapplication_group = g_option_group_new ("gapplication", + _("GApplication options"), _("Show GApplication options"), + NULL, NULL); + g_option_group_set_translation_domain (gapplication_group, GETTEXT_PACKAGE); + g_option_context_add_group (context, gapplication_group); + /* If the application has not registered local options and it has * G_APPLICATION_HANDLES_COMMAND_LINE then we have to assume that * their primary instance commandline handler may want to deal with @@ -525,20 +533,25 @@ g_application_parse_command_line (GApplication *application, */ if ((application->priv->flags & (G_APPLICATION_IS_SERVICE | G_APPLICATION_IS_LAUNCHER)) == 0) { - GOptionGroup *option_group; GOptionEntry entries[] = { { "gapplication-service", '\0', 0, G_OPTION_ARG_NONE, &become_service, N_("Enter GApplication service mode (use from D-Bus service files)") }, { NULL } }; - option_group = g_option_group_new ("gapplication", - _("GApplication options"), _("Show GApplication options"), - NULL, NULL); - g_option_group_set_translation_domain (option_group, GETTEXT_PACKAGE); - g_option_group_add_entries (option_group, entries); + g_option_group_add_entries (gapplication_group, entries); + } - g_option_context_add_group (context, option_group); + /* Allow overriding the ID if the application allows it */ + if (application->priv->flags & G_APPLICATION_CAN_OVERRIDE_APP_ID) + { + GOptionEntry entries[] = { + { "gapplication-app-id", '\0', 0, G_OPTION_ARG_STRING, &app_id, + N_("Override the application's ID") }, + { NULL } + }; + + g_option_group_add_entries (gapplication_group, entries); } /* Now we parse... */ @@ -549,6 +562,10 @@ g_application_parse_command_line (GApplication *application, if (become_service) application->priv->flags |= G_APPLICATION_IS_SERVICE; + /* Check for --gapplication-app-id */ + if (app_id) + g_application_set_application_id (application, app_id); + dict = g_variant_dict_new (NULL); if (application->priv->packed_options) { @@ -562,6 +579,7 @@ out: application->priv->options_parsed = TRUE; g_option_context_free (context); + g_free (app_id); return dict; } diff --git a/gio/gioenums.h b/gio/gioenums.h index 163d63513..4461f8388 100644 --- a/gio/gioenums.h +++ b/gio/gioenums.h @@ -1464,6 +1464,9 @@ typedef enum * owner of the application ID nor does it check if an existing * owner already exists. Everything occurs in the local process. * Since: 2.30. + * @G_APPLICATION_CAN_OVERRIDE_APP_ID: Allow users to override the + * application ID from the command line with `--gapplication-app-id`. + * Since: 2.48 * * Flags used to define the behaviour of a #GApplication. * @@ -1479,7 +1482,9 @@ typedef enum G_APPLICATION_HANDLES_COMMAND_LINE = (1 << 3), G_APPLICATION_SEND_ENVIRONMENT = (1 << 4), - G_APPLICATION_NON_UNIQUE = (1 << 5) + G_APPLICATION_NON_UNIQUE = (1 << 5), + + G_APPLICATION_CAN_OVERRIDE_APP_ID = (1 << 6) } GApplicationFlags; /**