static void select_items_ready_cb (GObject *source, GAsyncResult *res, gpointer user_data) { GDBusConnection *connection = G_DBUS_CONNECTION (source); NautilusApplication *self = user_data; GError *error = NULL; g_dbus_connection_call_finish (connection, res, &error); if (error != NULL) { g_warning ("Unable to select specified URIs %s\n", error->message); g_error_free (error); /* open default location instead */ g_application_open (G_APPLICATION (self), NULL, 0, ""); } }
int main (int argc, char *argv[]) { GtkApplication *app; GError *error = NULL; GOptionContext *context; GOptionGroup *debug; gulong debug_flags = 0; LifereaDBus *dbus = NULL; gchar *feedUri = NULL; gint status; GOptionEntry entries[] = { { "mainwindow-state", 'w', 0, G_OPTION_ARG_STRING, &initialStateOption, N_("Start Liferea with its main window in STATE. STATE may be `shown', `iconified', or `hidden'"), N_("STATE") }, { "version", 'v', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, show_version, N_("Show version information and exit"), NULL }, { "add-feed", 'a', 0, G_OPTION_ARG_STRING, &feedUri, N_("Add a new subscription"), N_("uri") }, { NULL, 0, 0, 0, NULL, NULL, NULL } }; GOptionEntry debug_entries[] = { { "debug-all", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages of all types"), NULL }, { "debug-cache", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages for the cache handling"), NULL }, { "debug-conf", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages for the configuration handling"), NULL }, { "debug-db", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages of the database handling"), NULL }, { "debug-gui", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages of all GUI functions"), NULL }, { "debug-html", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Enables HTML rendering debugging. Each time Liferea renders HTML output it will also dump the generated HTML into ~/.cache/liferea/output.xhtml"), NULL }, { "debug-net", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages of all network activity"), NULL }, { "debug-parsing", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages of all parsing functions"), NULL }, { "debug-performance", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages when a function takes too long to process"), NULL }, { "debug-trace", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages when entering/leaving functions"), NULL }, { "debug-update", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages of the feed update processing"), NULL }, { "debug-vfolder", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print debugging messages of the search folder matching"), NULL }, { "debug-verbose", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, debug_entries_parse_callback, N_("Print verbose debugging messages"), NULL }, { NULL, 0, 0, 0, NULL, NULL, NULL } }; #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #endif debug = g_option_group_new ("debug", _("Print debugging messages for the given topic"), _("Print debugging messages for the given topic"), &debug_flags, NULL); g_option_group_set_translation_domain(debug, GETTEXT_PACKAGE); g_option_group_add_entries (debug, debug_entries); context = g_option_context_new (NULL); g_option_context_set_summary (context, N_("Liferea, the Linux Feed Reader")); g_option_context_set_description (context, N_("For more information, please visit http://lzone.de/liferea/")); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); g_option_context_set_translation_domain(context, GETTEXT_PACKAGE); g_option_context_add_group (context, debug); g_option_context_add_group (context, gtk_get_option_group (FALSE)); g_option_context_add_group (context, g_irepository_get_option_group ()); g_option_context_parse (context, &argc, &argv, &error); g_option_context_free (context); if (error) { g_print ("Error parsing options: %s\n", error->message); } set_debug_level (debug_flags); /* Configuration necessary for network options, so it has to be initialized before update_init() */ conf_init (); /* We need to do the network initialization here to allow network-manager to be setup before gtk_init() */ update_init (); gtk_init (&argc, &argv); /* Single instance checks, also note that we pass or only RPC (add-feed) as activate signal payload as it is simply an URI string. */ app = gtk_application_new ("net.sourceforge.liferea", G_APPLICATION_HANDLES_OPEN); g_signal_connect (app, "activate", G_CALLBACK (on_app_activate), feedUri); g_signal_connect (app, "open", G_CALLBACK (on_feed_add), NULL); g_set_prgname ("liferea"); g_set_application_name (_("Liferea")); gtk_window_set_default_icon_name ("liferea"); /* GTK theme support */ debug_start_measurement (DEBUG_DB); /* order is important! */ db_init (); /* initialize sqlite */ xml_init (); /* initialize libxml2 */ #ifdef HAVE_LIBNOTIFY notification_plugin_register (&libnotify_plugin); #endif social_init (); /* initialize social bookmarking */ dbus = liferea_dbus_new (); signal (SIGTERM, signal_handler); signal (SIGINT, signal_handler); signal (SIGHUP, signal_handler); /* Note: we explicitely do not use the gdk_thread_* locking in Liferea because it freezes the program when running Flash applets */ runState = STATE_STARTING; debug_end_measurement (DEBUG_DB, "startup"); status = g_application_run (G_APPLICATION (app), 0, NULL); /* Trigger RPCs if we are not primary instance (currently only feed-add) */ if (feedUri && g_application_get_is_remote (G_APPLICATION (app))) { GFile *uris[2]; uris[0] = g_file_new_for_uri (feedUri); uris[1] = NULL; g_application_open (G_APPLICATION (app), uris, 1, "feed-add"); g_object_unref (uris[0]); } g_object_unref (G_OBJECT (dbus)); g_object_unref (app); return status; }
static gboolean logview_app_local_command_line (GApplication *application, gchar ***arguments, gint *exit_status) { gchar **argv; gint argc, idx, len = 0; gchar **remaining = NULL; gboolean version = FALSE; GError *error = NULL; GFile **files = NULL; GOptionContext *context; const GOptionEntry entries[] = { { "version", '\0', 0, G_OPTION_ARG_NONE, &version, N_("Show the version of the program."), NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, N_("[URI...]") }, { NULL } }; *exit_status = EXIT_SUCCESS; context = g_option_context_new (_("A system log viewer for GNOME.")); g_option_context_add_main_entries (context, entries, NULL); g_option_context_add_group (context, gtk_get_option_group (FALSE)); argv = *arguments; argc = g_strv_length (argv); if (!g_option_context_parse (context, &argc, &argv, &error)) { /* Translators: this is a fatal error quit message printed on the * command line */ g_printerr ("%s: %s\n", _("Could not parse arguments"), error->message); g_error_free (error); *exit_status = EXIT_FAILURE; goto out; } if (version) { g_print ("GNOME System Log " PACKAGE_VERSION "\n"); goto out; } g_application_register (application, NULL, &error); if (error != NULL) { /* Translators: this is a fatal error quit message printed on the * command line */ g_printerr ("%s: %s\n", _("Could not register the application"), error->message); g_error_free (error); *exit_status = EXIT_FAILURE; goto out; } /* 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 (len > 0) g_application_open (application, files, len, ""); else g_application_activate (application); for (idx = 0; idx < len; idx++) g_object_unref (files[idx]); g_free (files); out: g_option_context_free (context); return TRUE; }
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; }
static gboolean nautilus_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 open_new_window = FALSE; gboolean no_default_window = FALSE; gboolean select_uris = FALSE; gchar **remaining = NULL; NautilusApplication *self = NAUTILUS_APPLICATION (application); const GOptionEntry options[] = { #ifndef NAUTILUS_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") }, { "new-window", 'w', 0, G_OPTION_ARG_NONE, &open_new_window, N_("Always open a new window for browsing specified URIs"), NULL }, { "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, &self->priv->no_desktop, N_("Never manage the desktop (ignore the GSettings preference)."), NULL }, { "force-desktop", '\0', 0, G_OPTION_ARG_NONE, &self->priv->force_desktop, N_("Always manage the desktop (ignore the GSettings preference)."), NULL }, { "quit", 'q', 0, G_OPTION_ARG_NONE, &kill_shell, N_("Quit Nautilus."), NULL }, { "select", 's', 0, G_OPTION_ARG_NONE, &select_uris, N_("Select specified URI in parent folder."), 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; nautilus_profile_start (NULL); 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 (FALSE)); argv = *arguments; argc = g_strv_length (argv); if (!g_option_context_parse (context, &argc, &argv, &error)) { /* Translators: this is a fatal error quit message printed on the * command line */ g_printerr ("%s: %s\n", _("Could not parse arguments"), error->message); g_error_free (error); *exit_status = EXIT_FAILURE; goto out; } if (version) { g_print ("GNOME nautilus " PACKAGE_VERSION "\n"); goto out; } if (!do_cmdline_sanity_checks (self, perform_self_check, version, kill_shell, select_uris, remaining)) { *exit_status = EXIT_FAILURE; goto out; } if (perform_self_check) { do_perform_self_checks (exit_status); goto out; } DEBUG ("Parsing local command line: open_new_window %d, no_default_window %d, " "quit %d, self checks %d, no_desktop %d, show_desktop %d", open_new_window, no_default_window, kill_shell, perform_self_check, self->priv->no_desktop, self->priv->force_desktop); g_application_register (application, NULL, &error); if (error != NULL) { /* Translators: this is a fatal error quit message printed on the * command line */ g_printerr ("%s: %s\n", _("Could not register the application"), error->message); g_error_free (error); *exit_status = EXIT_FAILURE; goto out; } if (kill_shell) { DEBUG ("Killing application, as requested"); g_action_group_activate_action (G_ACTION_GROUP (application), "kill", 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 && !select_uris) { files = g_malloc0 (2 * sizeof (GFile *)); len = 1; files[0] = g_file_new_for_path (g_get_home_dir ()); files[1] = NULL; } if (len == 0) { goto out; } if (select_uris) { nautilus_application_select (self, files, len); } else { /* Invoke "Open" to create new windows */ g_application_open (application, files, len, open_new_window ? "new-window" : ""); } for (idx = 0; idx < len; idx++) { g_object_unref (files[idx]); } g_free (files); out: g_option_context_free (context); nautilus_profile_end (NULL); return TRUE; }
static gboolean g_application_real_local_command_line (GApplication *application, gchar ***arguments, int *exit_status) { if (application->priv->flags & G_APPLICATION_HANDLES_COMMAND_LINE) return FALSE; else { GError *error = NULL; gint n_args; if (!g_application_register (application, NULL, &error)) { g_critical ("%s", error->message); g_error_free (error); *exit_status = 1; return TRUE; } n_args = g_strv_length (*arguments); if (application->priv->flags & G_APPLICATION_IS_SERVICE) { if ((*exit_status = n_args > 1)) { g_printerr ("GApplication service mode takes no arguments.\n"); application->priv->flags &= ~G_APPLICATION_IS_SERVICE; } return TRUE; } if (n_args <= 1) { g_application_activate (application); *exit_status = 0; } else { if (~application->priv->flags & G_APPLICATION_HANDLES_OPEN) { g_critical ("This application can not open files."); *exit_status = 1; } else { GFile **files; gint n_files; gint i; n_files = n_args - 1; files = g_new (GFile *, n_files); for (i = 0; i < n_files; i++) files[i] = g_file_new_for_commandline_arg ((*arguments)[i + 1]); g_application_open (application, files, n_files, ""); for (i = 0; i < n_files; i++) g_object_unref (files[i]); g_free (files); *exit_status = 0; } } return TRUE; } }