[gnome-software/wip/launcher: 3/7] Redo commandline handling
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/launcher: 3/7] Redo commandline handling
- Date: Mon, 16 Sep 2013 02:28:56 +0000 (UTC)
commit eff052f3f96fbd63d974a027421f6c4601b0893c
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Sep 15 20:07:12 2013 -0400
Redo commandline handling
Move all commandline handling to the launcher and convert
the --mode argument into a set-mode action.
src/gs-application.c | 100 ++++++++++++-------------------------------------
src/gs-launcher.c | 65 +++++++++++++++++++++++++++++++-
2 files changed, 88 insertions(+), 77 deletions(-)
---
diff --git a/src/gs-application.c b/src/gs-application.c
index 14d0adc..ae72acb 100644
--- a/src/gs-application.c
+++ b/src/gs-application.c
@@ -108,9 +108,32 @@ quit_activated (GSimpleAction *action,
g_application_quit (G_APPLICATION (app));
}
+static void
+set_mode_activated (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer data)
+{
+ GsApplication *app = GS_APPLICATION (data);
+ const gchar *mode;
+
+ mode = g_variant_get_string (parameter, NULL);
+ if (g_strcmp0 (mode, "updates") == 0) {
+ gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATES);
+ } else if (g_strcmp0 (mode, "installed") == 0) {
+ gs_shell_set_mode (app->shell, GS_SHELL_MODE_INSTALLED);
+ } else if (g_strcmp0 (mode, "overview") == 0) {
+ gs_shell_set_mode (app->shell, GS_SHELL_MODE_OVERVIEW);
+ } else if (g_strcmp0 (mode, "updated") == 0) {
+ gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATED);
+ } else {
+ g_warning ("Mode '%s' not recognised", mode);
+ }
+}
+
static GActionEntry actions[] = {
{ "about", about_activated, NULL, NULL, NULL },
- { "quit", quit_activated, NULL, NULL, NULL }
+ { "quit", quit_activated, NULL, NULL, NULL },
+ { "set-mode", set_mode_activated, "s", NULL, NULL }
};
static void
@@ -199,78 +222,6 @@ gs_application_activate (GApplication *application)
gs_shell_activate (GS_APPLICATION (application)->shell);
}
-static int
-gs_application_command_line (GApplication *application,
- GApplicationCommandLine *cmdline)
-{
- GsApplication *app = GS_APPLICATION (application);
- GOptionContext *context;
- gchar *mode = NULL;
- gboolean help = FALSE;
- gboolean verbose = FALSE;
- const GOptionEntry options[] = {
- { "mode", '\0', 0, G_OPTION_ARG_STRING, &mode,
- /* TRANSLATORS: this is a command line option */
- _("Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’"), _("MODE") },
- { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, NULL, NULL },
- { "help", '?', 0, G_OPTION_ARG_NONE, &help, NULL, NULL },
-
- { NULL}
- };
- gchar **args, **argv;
- gint argc;
- gint i;
- GError *error = NULL;
-
- args = g_application_command_line_get_arguments (cmdline, &argc);
- /* We have to make an extra copy of the array, since g_option_context_parse()
- * assumes that it can remove strings from the array without freeing them.
- */
- argv = g_new (gchar*, argc + 1);
- for (i = 0; i <= argc; i++)
- argv[i] = args[i];
-
- context = g_option_context_new ("");
- g_option_context_set_help_enabled (context, FALSE);
- g_option_context_add_main_entries (context, options, NULL);
- if (!g_option_context_parse (context, &argc, &argv, &error)) {
- g_application_command_line_printerr (cmdline, "%s\n", error->message);
- 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);
- }
- if (verbose)
- g_setenv ("G_MESSAGES_DEBUG", "all", FALSE);
- if (mode) {
- if (g_strcmp0 (mode, "updates") == 0) {
- gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATES);
- } else if (g_strcmp0 (mode, "installed") == 0) {
- gs_shell_set_mode (app->shell, GS_SHELL_MODE_INSTALLED);
- } else if (g_strcmp0 (mode, "overview") == 0) {
- gs_shell_set_mode (app->shell, GS_SHELL_MODE_OVERVIEW);
- } else if (g_strcmp0 (mode, "updated") == 0) {
- gs_shell_set_mode (app->shell, GS_SHELL_MODE_UPDATED);
- } else {
- g_warning ("Mode '%s' not recognised", mode);
- }
- } else {
- /* this is the default */
- gs_shell_set_mode (app->shell, GS_SHELL_MODE_OVERVIEW);
- }
-
- g_free (argv);
- g_strfreev (args);
-
- g_option_context_free (context);
-
- return 0;
-}
-
static void
gs_application_finalize (GObject *object)
{
@@ -290,7 +241,6 @@ gs_application_class_init (GsApplicationClass *class)
G_OBJECT_CLASS (class)->finalize = gs_application_finalize;
G_APPLICATION_CLASS (class)->startup = gs_application_startup;
G_APPLICATION_CLASS (class)->activate = gs_application_activate;
- G_APPLICATION_CLASS (class)->command_line = gs_application_command_line;
}
GsApplication *
@@ -298,7 +248,7 @@ gs_application_new (void)
{
return g_object_new (GS_APPLICATION_TYPE,
"application-id", "org.gnome.Software",
- "flags", G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_IS_SERVICE,
+ "flags", G_APPLICATION_IS_SERVICE,
NULL);
}
diff --git a/src/gs-launcher.c b/src/gs-launcher.c
index 41edee9..a5007f7 100644
--- a/src/gs-launcher.c
+++ b/src/gs-launcher.c
@@ -44,17 +44,78 @@ gs_launcher_init (GsLauncher *launcher)
{
}
+static gboolean
+gs_launcher_local_command_line (GApplication *app, gchar ***args, gint *status)
+{
+ GOptionContext *context;
+ gchar *mode = NULL;
+ gboolean version = FALSE;
+ gint argc;
+ const GOptionEntry options[] = {
+ { "mode", '\0', 0, G_OPTION_ARG_STRING, &mode,
+ /* TRANSLATORS: this is a command line option */
+ _("Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’"), _("MODE") },
+ { "version", 0, 0, G_OPTION_ARG_NONE, &version, NULL, NULL },
+
+ { NULL}
+ };
+ GError *error = NULL;
+
+ context = g_option_context_new ("");
+ g_option_context_add_main_entries (context, options, NULL);
+
+ argc = g_strv_length (*args);
+ if (!g_option_context_parse (context, &argc, args, &error)) {
+ g_printerr ("%s\n", error->message);
+ g_error_free (error);
+ *status = 1;
+ goto out;
+ }
+
+ if (version) {
+ g_print ("gnome-software " VERSION "\n");
+ *status = 0;
+ goto out;
+ }
+
+ if (!g_application_register (app, NULL, &error)) {
+ g_printerr ("%s\n", error->message);
+ g_error_free (error);
+ *status = 1;
+ goto out;
+ }
+
+ if (mode != NULL) {
+ g_action_group_activate_action (G_ACTION_GROUP (app),
+ "set-mode",
+ g_variant_new_string (mode));
+ } else {
+ g_application_activate (app);
+ }
+
+ *status = 0;
+
+out:
+ g_option_context_free (context);
+
+ return TRUE;
+}
+
static void
gs_launcher_class_init (GsLauncherClass *class)
{
+ GApplicationClass *application_class = G_APPLICATION_CLASS (class);
+
+ application_class->local_command_line = gs_launcher_local_command_line;
}
-GsLauncher *
+static GsLauncher *
gs_launcher_new (void)
{
return g_object_new (gs_launcher_get_type (),
"application-id", "org.gnome.Software",
- "flags", G_APPLICATION_IS_LAUNCHER,
+ "flags", G_APPLICATION_IS_LAUNCHER |
+ G_APPLICATION_SEND_ENVIRONMENT,
NULL);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]