diff options
Diffstat (limited to 'src/caja-main.c')
-rw-r--r-- | src/caja-main.c | 434 |
1 files changed, 1 insertions, 433 deletions
diff --git a/src/caja-main.c b/src/caja-main.c index 51ecbd93..549dfac0 100644 --- a/src/caja-main.c +++ b/src/caja-main.c @@ -28,20 +28,12 @@ /* caja-main.c: Implementation of the routines that drive program lifecycle and main window creation/destruction. */ #include <config.h> -#include "caja-main.h" -#if ENABLE_LIBUNIQUE == (TRUE) -#include "caja-application.h" -#include "caja-self-check-functions.h" -#endif #include "caja-window.h" #include <dlfcn.h> #include <signal.h> #include <eel/eel-debug.h> #include <eel/eel-glib-extensions.h> #include <eel/eel-self-checks.h> -#if ENABLE_LIBUNIQUE == (TRUE) -#include <libegg/eggsmclient.h> -#endif #include <libegg/eggdesktopfile.h> #include <gdk/gdkx.h> #include <gtk/gtk.h> @@ -49,9 +41,6 @@ #include <gio/gdesktopappinfo.h> #include <libcaja-private/caja-debug-log.h> #include <libcaja-private/caja-global-preferences.h> -#if ENABLE_LIBUNIQUE == (TRUE) -#include <libcaja-private/caja-lib-self-check-functions.h> -#endif #include <libcaja-private/caja-icon-names.h> #include <libxml/parser.h> #ifdef HAVE_LOCALE_H @@ -68,101 +57,7 @@ #include <exempi/xmp.h> #endif -#if ENABLE_LIBUNIQUE == (TRUE) -/* 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 (); - } -} - -#if GTK_CHECK_VERSION(3, 0, 0) -void caja_main_event_loop_register (GtkWidget *object) -#else -void caja_main_event_loop_register (GtkObject *object) -#endif -{ - g_signal_connect (object, "destroy", G_CALLBACK (event_loop_unregister), NULL); - event_loop_registrants = g_slist_prepend (event_loop_registrants, GTK_WIDGET (object)); -} - -gboolean caja_main_is_event_loop_mainstay (GtkWidget *object) -{ - return g_slist_length (event_loop_registrants) == 1 - && event_loop_registrants->data == object; -} - -void caja_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, caja 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 MATE_RESTART_IF_RUNNING here, but i don't think we need - that now since mate-session doesn't restart apps except on startup. */ - } - while (event_loop_registrants != NULL) - { - gtk_widget_destroy (event_loop_registrants->data); - } -} -#endif static void dump_debug_log (void) { char *filename; @@ -334,7 +229,7 @@ running_as_root (void) { return geteuid () == 0; } -#if ENABLE_LIBUNIQUE == (FALSE) + int main (int argc, char *argv[]) { @@ -397,331 +292,4 @@ main (int argc, char *argv[]) return retval; } -#else -int -main (int argc, char *argv[]) -{ - gboolean kill_shell; - gboolean no_default_window; - gboolean browser_window; - gboolean no_desktop; - gboolean version; - gboolean autostart_mode; - const char *autostart_id; - gchar *geometry; - gchar **remaining; - gboolean perform_self_check; - CajaApplication *application; - GOptionContext *context; - GFile *file = NULL; - GFileInfo *fileinfo = NULL; - GAppInfo *appinfo = NULL; - char *uri = NULL; - char **uris = NULL; - GPtrArray *uris_array; - GError *error; - int i; - - const GOptionEntry options[] = - { -#ifndef CAJA_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 Caja."), NULL - }, - { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, N_("[URI...]") }, - - { NULL } - }; - -#if defined (HAVE_MALLOPT) && defined(M_MMAP_THRESHOLD) - /* Caja uses lots and lots of small and medium size allocations, - * and then a few large ones for the desktop background. By default - * glibc uses a dynamic treshold for how large allocations should - * be mmaped. Unfortunately this triggers quickly for caja when - * it does the desktop background allocations, raising the limit - * such that a lot of temporary large allocations end up on the - * heap and are thus not returned to the OS. To fix this we set - * a hardcoded limit. I don't know what a good value is, but 128K - * was the old glibc static limit, lets use that. - */ - mallopt (M_MMAP_THRESHOLD, 128 *1024); -#endif - -#if !GLIB_CHECK_VERSION (2, 42, 0) - /* This will be done by gtk+ later, but for now, force it to MATE */ - g_desktop_app_info_set_desktop_env ("MATE"); -#endif - - if (g_getenv ("CAJA_DEBUG") != NULL) - { - eel_make_warnings_and_criticals_stop_in_debugger (); - } - - /* Initialize gettext support */ - bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - autostart_mode = FALSE; - autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID"); - if (autostart_id != NULL && *autostart_id != '\0') - { - 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; - - g_set_prgname ("caja"); - - if (g_file_test (DATADIR "/applications/caja.desktop", G_FILE_TEST_EXISTS)) - { - egg_set_desktop_file (DATADIR "/applications/caja.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 ("MATE caja " PACKAGE_VERSION "\n"); - return 0; - } - -#ifdef HAVE_EXEMPI - xmp_init(); -#endif - - setup_debug_log (); - - /* If in autostart mode (aka started by mate-session), we need to ensure - * caja starts with the correct options. - */ - if (autostart_mode) - { - no_default_window = TRUE; - no_desktop = FALSE; - } - else if (running_as_root () || !running_in_mate ()) - { - /* do not manage desktop when running as root or on other desktops */ - no_desktop = TRUE; - - /* set smclient mode to "no restart" when running as root or on other desktops */ - egg_sm_client_set_mode (EGG_SM_CLIENT_MODE_NO_RESTART); - } - - if (perform_self_check && remaining != NULL) - { - /* translators: %s is an option (e.g. --check) */ - fprintf (stderr, _("caja: %s cannot be used with URIs.\n"), - "--check"); - return EXIT_FAILURE; - } - if (perform_self_check && kill_shell) - { - fprintf (stderr, _("caja: --check cannot be used with other options.\n")); - return EXIT_FAILURE; - } - if (kill_shell && remaining != NULL) - { - fprintf (stderr, _("caja: %s cannot be used with URIs.\n"), - "--quit"); - return EXIT_FAILURE; - } - if (geometry != NULL && remaining != NULL && remaining[0] != NULL && remaining[1] != NULL) - { - fprintf (stderr, _("caja: --geometry cannot be used with more than one URI.\n")); - return EXIT_FAILURE; - } - - /* Initialize the services that we use. */ - LIBXML_TEST_VERSION - - /* Initialize preferences. This is needed so that proper - * defaults are available before any preference peeking - * happens. - */ - caja_global_preferences_init (); - - /* exit_with_last_window is already set to TRUE, and we need to keep that value - * on other desktops or when running caja as root. Otherwise, we read the value - * from the configuration. - */ - if (running_in_mate () && !running_as_root()) - { - exit_with_last_window = g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_EXIT_WITH_LAST_WINDOW); - } - - application = NULL; - - /* Do either the self-check or the real work. */ - if (perform_self_check) - { - #ifndef CAJA_OMIT_SELF_CHECK - /* Run the checks (each twice) for caja and libcaja-private. */ - - caja_run_self_checks (); - caja_run_lib_self_checks (); - eel_exit_if_self_checks_failed (); - - caja_run_self_checks (); - caja_run_lib_self_checks (); - eel_exit_if_self_checks_failed (); - #endif - } - else - { - /* Convert args to URIs */ - 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); - if (uri) - { - fileinfo = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, NULL, NULL); - if (fileinfo && g_file_info_get_file_type(fileinfo) == G_FILE_TYPE_DIRECTORY) - { - g_ptr_array_add (uris_array, uri); - } - else - { - if (fileinfo) - g_object_unref (fileinfo); - fileinfo = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, G_FILE_QUERY_INFO_NONE, NULL, NULL); - if (fileinfo) - { - appinfo = g_app_info_get_default_for_type (g_file_info_get_content_type (fileinfo), TRUE); - if (appinfo) - { - if (g_strcmp0 (g_app_info_get_executable (appinfo), "caja") != 0) - { - g_app_info_launch_default_for_uri (uri, NULL, NULL); - } - else - { - fprintf (stderr, _("caja: set erroneously as default application for '%s' content type.\n"), - g_file_info_get_content_type (fileinfo)); - } - g_object_unref (appinfo); - } - g_free (uri); - } - else - { - g_ptr_array_add (uris_array, uri); - } - } - if (fileinfo) - g_object_unref (fileinfo); - } - if (file) - g_object_unref (file); - } - } - if (uris_array->len == 0) - { - /* Caja is being used only to open files (not directories), so closing */ - g_strfreev (remaining); - return EXIT_SUCCESS; - } - g_ptr_array_add (uris_array, NULL); - uris = (char**) g_ptr_array_free (uris_array, FALSE); - g_strfreev (remaining); - } - - - /* Run the caja application. */ - application = caja_application_new (); - - if (egg_sm_client_is_resumed (application->smclient)) - { - no_default_window = TRUE; - } - - caja_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 (); - } - } - - caja_icon_info_clear_caches (); - - if (application != NULL) - { - g_object_unref (application); - } - - eel_debug_shut_down (); - - caja_application_save_accel_map (NULL); - - return EXIT_SUCCESS; -} -#endif |