summaryrefslogtreecommitdiff
path: root/src/nautilus-main.c
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2010-10-27 13:13:48 +0200
committerCosimo Cecchi <cosimoc@gnome.org>2010-10-30 16:29:13 +0200
commita8481ee4bd8d34e792d63598fa5efb47736f9de4 (patch)
tree3b093e1dfed4a02539e01ea2289959b9120a8326 /src/nautilus-main.c
parentb03b081e91d376140e4fc94fd885bf7d13fc57c5 (diff)
downloadnautilus-a8481ee4bd8d34e792d63598fa5efb47736f9de4.tar.gz
main: adapt to GtkApplication changes
This code should be much easier now that window lifecycle is handled by GtkApplication itself.
Diffstat (limited to 'src/nautilus-main.c')
-rw-r--r--src/nautilus-main.c255
1 files changed, 21 insertions, 234 deletions
diff --git a/src/nautilus-main.c b/src/nautilus-main.c
index 34145f018..1f8c58a10 100644
--- a/src/nautilus-main.c
+++ b/src/nautilus-main.c
@@ -29,7 +29,6 @@
/* nautilus-main.c: Implementation of the routines that drive program lifecycle and main window creation/destruction. */
#include <config.h>
-#include "nautilus-main.h"
#include "nautilus-application.h"
#include "nautilus-self-check-functions.h"
@@ -64,97 +63,6 @@
#include <exempi/xmp.h>
#endif
-/* Keeps track of everyone who wants the main event loop kept active */
-static GSList *event_loop_registrants;
-
-static gboolean exit_with_last_window = TRUE;
-
-static gboolean
-is_event_loop_needed (void)
-{
- return event_loop_registrants != NULL || !exit_with_last_window;
-}
-
-static int
-quit_if_in_main_loop (gpointer callback_data)
-{
- guint level;
-
- g_assert (callback_data == NULL);
-
- level = gtk_main_level ();
-
- /* We can be called even outside the main loop,
- * so check that we are in a loop before calling quit.
- */
- if (level != 0) {
- gtk_main_quit ();
- }
-
- /* We need to be called again if we quit a nested loop. */
- return level > 1;
-}
-
-static void
-eel_gtk_main_quit_all (void)
-{
- /* Calling gtk_main_quit directly only kills the current/top event loop.
- * This idler will be run by the current event loop, killing it, and then
- * by the next event loop, ...
- */
- g_idle_add (quit_if_in_main_loop, NULL);
-}
-
-static void
-event_loop_unregister (GtkWidget *object)
-{
- event_loop_registrants = g_slist_remove (event_loop_registrants, object);
- if (!is_event_loop_needed ()) {
- eel_gtk_main_quit_all ();
- }
-}
-
-void
-nautilus_main_event_loop_register (GtkWidget *object)
-{
- g_signal_connect (object, "destroy", G_CALLBACK (event_loop_unregister), NULL);
- event_loop_registrants = g_slist_prepend (event_loop_registrants, object);
-}
-
-gboolean
-nautilus_main_is_event_loop_mainstay (GtkWidget *object)
-{
- return g_slist_length (event_loop_registrants) == 1
- && event_loop_registrants->data == object;
-}
-
-void
-nautilus_main_event_loop_quit (gboolean explicit)
-{
- if (explicit) {
- /* Explicit --quit, make sure we don't restart */
-
- /* To quit all instances, reset exit_with_last_window */
- exit_with_last_window = TRUE;
-
- if (event_loop_registrants == NULL) {
- /* If this is reached, nautilus must run in "daemon" mode
- * (i.e. !exit_with_last_window) with no windows open.
- * We need to quit_all here because the below loop won't
- * trigger a quit.
- */
- eel_gtk_main_quit_all();
- }
-
- /* TODO: With the old session we needed to set restart
- style to GNOME_RESTART_IF_RUNNING here, but i don't think we need
- that now since gnome-session doesn't restart apps except on startup. */
- }
- while (event_loop_registrants != NULL) {
- gtk_widget_destroy (event_loop_registrants->data);
- }
-}
-
static void
dump_debug_log (void)
{
@@ -318,47 +226,14 @@ setup_debug_log (void)
int
main (int argc, char *argv[])
{
- gboolean kill_shell;
gboolean no_default_window;
- gboolean browser_window;
gboolean no_desktop;
- gboolean version;
gboolean autostart_mode;
+ gint retval;
const char *autostart_id;
- gchar *geometry;
- gchar **remaining;
- gboolean perform_self_check;
+ gboolean perform_self_check = FALSE;
NautilusApplication *application;
- GOptionContext *context;
- GFile *file;
- char *uri;
- char **uris;
- GPtrArray *uris_array;
- GError *error;
- int i;
- 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
- { "version", '\0', 0, G_OPTION_ARG_NONE, &version,
- N_("Show the version of the program."), NULL },
- { "geometry", 'g', 0, G_OPTION_ARG_STRING, &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,
- N_("Do not manage the desktop (ignore the preference set in the preferences dialog)."), NULL },
- { "browser", '\0', 0, G_OPTION_ARG_NONE, &browser_window,
- N_("open a browser window."), NULL },
- { "quit", 'q', 0, G_OPTION_ARG_NONE, &kill_shell,
- N_("Quit Nautilus."), NULL },
- { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, N_("[URI...]") },
-
- { NULL }
- };
-
#if defined (HAVE_MALLOPT) && defined(M_MMAP_THRESHOLD)
/* Nautilus uses lots and lots of small and medium size allocations,
* and then a few large ones for the desktop background. By default
@@ -372,7 +247,8 @@ main (int argc, char *argv[])
*/
mallopt (M_MMAP_THRESHOLD, 128 *1024);
#endif
-
+
+ g_type_init ();
g_thread_init (NULL);
/* This will be done by gtk+ later, but for now, force it to GNOME */
@@ -394,41 +270,19 @@ main (int argc, char *argv[])
autostart_mode = TRUE;
}
- /* Get parameters. */
- remaining = NULL;
- geometry = NULL;
- version = FALSE;
- kill_shell = FALSE;
- no_default_window = FALSE;
- no_desktop = FALSE;
- perform_self_check = FALSE;
- browser_window = FALSE;
+ /* If in autostart mode (aka started by gnome-session), we need to ensure
+ * nautilus starts with the correct options.
+ */
+ if (autostart_mode) {
+ no_default_window = TRUE;
+ no_desktop = FALSE;
+ }
g_set_prgname ("nautilus");
if (g_file_test (DATADIR "/applications/nautilus.desktop", G_FILE_TEST_EXISTS)) {
egg_set_desktop_file (DATADIR "/applications/nautilus.desktop");
}
-
- 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));
- g_option_context_add_group (context, egg_sm_client_get_option_group ());
-
- error = NULL;
- if (!g_option_context_parse (context, &argc, &argv, &error)) {
- g_printerr ("Could not parse arguments: %s\n", error->message);
- g_error_free (error);
- return 1;
- }
-
- g_option_context_free (context);
-
- if (version) {
- g_print ("GNOME nautilus " PACKAGE_VERSION "\n");
- return 0;
- }
#ifdef HAVE_EXEMPI
xmp_init();
@@ -436,34 +290,6 @@ main (int argc, char *argv[])
setup_debug_log ();
- /* If in autostart mode (aka started by gnome-session), we need to ensure
- * nautilus starts with the correct options.
- */
- if (autostart_mode) {
- no_default_window = TRUE;
- no_desktop = FALSE;
- }
-
- if (perform_self_check && remaining != NULL) {
- /* translators: %s is an option (e.g. --check) */
- fprintf (stderr, _("nautilus: %s cannot be used with URIs.\n"),
- "--check");
- return EXIT_FAILURE;
- }
- if (perform_self_check && kill_shell) {
- fprintf (stderr, _("nautilus: --check cannot be used with other options.\n"));
- return EXIT_FAILURE;
- }
- if (kill_shell && remaining != NULL) {
- fprintf (stderr, _("nautilus: %s cannot be used with URIs.\n"),
- "--quit");
- return EXIT_FAILURE;
- }
- if (geometry != NULL && remaining != NULL && remaining[0] != NULL && remaining[1] != NULL) {
- fprintf (stderr, _("nautilus: --geometry cannot be used with more than one URI.\n"));
- return EXIT_FAILURE;
- }
-
/* Initialize the services that we use. */
LIBXML_TEST_VERSION
@@ -472,10 +298,11 @@ main (int argc, char *argv[])
*/
nautilus_global_preferences_init ();
+#if 0
/* exit_with_last_window being FALSE, nautilus can run without window. */
exit_with_last_window =
g_settings_get_boolean (nautilus_preferences, NAUTILUS_PREFERENCES_EXIT_WITH_LAST_WINDOW);
-
+#endif
application = NULL;
/* Do either the self-check or the real work. */
@@ -490,61 +317,21 @@ main (int argc, char *argv[])
nautilus_run_self_checks ();
nautilus_run_lib_self_checks ();
eel_exit_if_self_checks_failed ();
+
+ retval = EXIT_SUCCESS;
#endif
} else {
- /* Convert args to URIs */
- uris = NULL;
- if (remaining != NULL) {
- uris_array = g_ptr_array_new ();
- for (i = 0; remaining[i] != NULL; i++) {
- file = g_file_new_for_commandline_arg (remaining[i]);
- if (file != NULL) {
- uri = g_file_get_uri (file);
- g_object_unref (file);
- if (uri) {
- g_ptr_array_add (uris_array, uri);
- }
- }
- }
- g_ptr_array_add (uris_array, NULL);
- uris = (char **)g_ptr_array_free (uris_array, FALSE);
- g_strfreev (remaining);
- }
-
-
/* Run the nautilus application. */
- application = nautilus_application_new ();
-
- if (egg_sm_client_is_resumed (application->smclient)) {
- no_default_window = TRUE;
- }
-
- nautilus_application_startup
- (application,
- kill_shell, no_default_window, no_desktop,
- browser_window,
- geometry,
- uris);
- g_strfreev (uris);
-
- if (unique_app_is_running (application->unique_app) ||
- kill_shell) {
- exit_with_last_window = TRUE;
- }
-
- if (is_event_loop_needed ()) {
- gtk_main ();
- }
- }
+ application = nautilus_application_dup_singleton ();
- nautilus_icon_info_clear_caches ();
-
- if (application != NULL) {
- g_object_unref (application);
+ retval = g_application_run (G_APPLICATION (application),
+ argc, argv);
}
+ nautilus_icon_info_clear_caches ();
+ g_object_unref (application);
eel_debug_shut_down ();
-
+
nautilus_application_save_accel_map (NULL);
return EXIT_SUCCESS;