static gint gedit_app_handle_local_options (GApplication *application, GVariantDict *options) { if (g_variant_dict_contains (options, "version")) { g_print ("%s - Version %s\n", g_get_application_name (), VERSION); return 0; } if (g_variant_dict_contains (options, "list-encodings")) { print_all_encodings (); return 0; } if (g_variant_dict_contains (options, "standalone")) { GApplicationFlags old_flags; old_flags = g_application_get_flags (application); g_application_set_flags (application, old_flags | G_APPLICATION_NON_UNIQUE); } if (g_variant_dict_contains (options, "wait")) { GApplicationFlags old_flags; old_flags = g_application_get_flags (application); g_application_set_flags (application, old_flags | G_APPLICATION_IS_LAUNCHER); } return -1; }
/* GObject implementation stuff {{{1 */ static void g_application_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GApplication *application = G_APPLICATION (object); switch (prop_id) { case PROP_APPLICATION_ID: g_application_set_application_id (application, g_value_get_string (value)); break; case PROP_FLAGS: g_application_set_flags (application, g_value_get_flags (value)); break; case PROP_INACTIVITY_TIMEOUT: g_application_set_inactivity_timeout (application, g_value_get_uint (value)); break; case PROP_ACTION_GROUP: g_application_set_action_group (application, g_value_get_object (value)); break; default: g_assert_not_reached (); } }
static gboolean nemo_main_application_local_command_line (GApplication *application, gchar ***arguments, gint *exit_status) { gboolean perform_self_check = FALSE; gboolean version = FALSE; gboolean browser = FALSE; gboolean kill_shell = FALSE; gboolean no_default_window = FALSE; gboolean no_desktop_ignored = FALSE; gboolean fix_cache = FALSE; gchar **remaining = NULL; GApplicationFlags init_flags; NemoMainApplication *self = NEMO_MAIN_APPLICATION (application); const GOptionEntry options[] = { #ifndef NEMO_OMIT_SELF_CHECK { "check", 'c', 0, G_OPTION_ARG_NONE, &perform_self_check, N_("Perform a quick set of self-check tests."), NULL }, #endif /* dummy, only for compatibility reasons */ { "browser", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &browser, NULL, NULL }, { "version", '\0', 0, G_OPTION_ARG_NONE, &version, N_("Show the version of the program."), NULL }, { "geometry", 'g', 0, G_OPTION_ARG_STRING, &self->priv->geometry, N_("Create the initial window with the given geometry."), N_("GEOMETRY") }, { "no-default-window", 'n', 0, G_OPTION_ARG_NONE, &no_default_window, N_("Only create windows for explicitly specified URIs."), NULL }, { "no-desktop", '\0', 0, G_OPTION_ARG_NONE, &no_desktop_ignored, N_("Ignored - left for compatibility only."), NULL }, { "fix-cache", '\0', 0, G_OPTION_ARG_NONE, &fix_cache, N_("Repair the user thumbnail cache - this can be useful if you're having trouble with file thumbnails. Must be run as root"), NULL }, { "quit", 'q', 0, G_OPTION_ARG_NONE, &kill_shell, N_("Quit Nemo."), NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, N_("[URI...]") }, { NULL } }; GOptionContext *context; GError *error = NULL; gint argc = 0; gchar **argv = NULL; *exit_status = EXIT_SUCCESS; context = g_option_context_new (_("\n\nBrowse the file system with the file manager")); g_option_context_add_main_entries (context, options, NULL); g_option_context_add_group (context, gtk_get_option_group (TRUE)); argv = *arguments; argc = g_strv_length (argv); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_printerr ("Could not parse arguments: %s\n", error->message); g_error_free (error); *exit_status = EXIT_FAILURE; goto out; } if (version) { g_print ("nemo " PACKAGE_VERSION "\n"); goto out; } if (!do_cmdline_sanity_checks (self, perform_self_check, version, kill_shell, remaining)) { *exit_status = EXIT_FAILURE; goto out; } if (perform_self_check) { do_perform_self_checks (exit_status); goto out; } if (fix_cache) { if (geteuid () != 0) { g_printerr ("The --fix-cache option must be run with sudo or as the root user.\n"); } else { gnome_desktop_thumbnail_cache_fix_permissions (); g_print ("User thumbnail cache successfully repaired.\n"); } goto out; } DEBUG ("Parsing local command line, no_default_window %d, quit %d, " "self checks %d", no_default_window, kill_shell, perform_self_check); /* Keep our original flags handy */ init_flags = g_application_get_flags (application); /* First try to register as a service (this allows our dbus activation to succeed * if we're not already running */ g_application_set_flags (application, init_flags | G_APPLICATION_IS_SERVICE); g_application_register (application, NULL, &error); if (error != NULL) { g_debug ("Could not register nemo as a service, trying as a remote: %s", error->message); g_clear_error (&error); } else { goto post_registration; } /* If service registration failed, try to connect to the existing instance */ g_application_set_flags (application, init_flags | G_APPLICATION_IS_LAUNCHER); g_application_register (application, NULL, &error); if (error != NULL) { g_printerr ("Could not register nemo as a remote: %s\n", error->message); g_clear_error (&error); *exit_status = EXIT_FAILURE; goto out; } post_registration: if (kill_shell) { DEBUG ("Killing application, as requested"); g_action_group_activate_action (G_ACTION_GROUP (application), "quit", NULL); goto out; } GFile **files; gint idx, len; len = 0; files = NULL; /* Convert args to GFiles */ if (remaining != NULL) { GFile *file; GPtrArray *file_array; file_array = g_ptr_array_new (); for (idx = 0; remaining[idx] != NULL; idx++) { file = g_file_new_for_commandline_arg (remaining[idx]); if (file != NULL) { g_ptr_array_add (file_array, file); } } len = file_array->len; files = (GFile **) g_ptr_array_free (file_array, FALSE); g_strfreev (remaining); } if (files == NULL && !no_default_window) { files = g_malloc0 (2 * sizeof (GFile *)); len = 1; files[0] = g_file_new_for_path (g_get_home_dir ()); files[1] = NULL; } /* Invoke "Open" to create new windows */ if (len > 0) { if (self->priv->geometry != NULL) { g_application_open (application, files, len, self->priv->geometry); } else { g_application_open (application, files, len, ""); } } for (idx = 0; idx < len; idx++) { g_object_unref (files[idx]); } g_free (files); out: g_option_context_free (context); return TRUE; }