static GtkNotebook * notebook_create_window_cb (GtkNotebook *notebook, GtkWidget *page, gint x, gint y, gpointer user_data) { NemoApplication *app; NemoWindow *new_window; NemoWindowPane *new_pane; NemoWindowSlot *slot; if (!NEMO_IS_WINDOW_SLOT (page)) { return NULL; } app = NEMO_APPLICATION (g_application_get_default ()); new_window = nemo_application_create_window (app, gtk_widget_get_screen (GTK_WIDGET (notebook))); slot = NEMO_WINDOW_SLOT (page); g_object_set_data (G_OBJECT (slot), "dnd-window-slot", GINT_TO_POINTER (TRUE)); gtk_window_set_position (GTK_WINDOW (new_window), GTK_WIN_POS_MOUSE); new_pane = nemo_window_get_active_pane (new_window); return GTK_NOTEBOOK (new_pane->notebook); }
static void nemo_main_application_quit_mainloop (GApplication *app) { nemo_main_application_notify_unmount_done (NEMO_APPLICATION (app), NULL); G_APPLICATION_CLASS (nemo_main_application_parent_class)->quit_mainloop (app); }
static void layout_changed (NemoDesktopManager *manager) { gint n_monitors = 0; gint x_primary = 0; gboolean show_desktop_on_primary = FALSE; gboolean show_desktop_on_remaining = FALSE; close_all_windows (manager); NemoApplication *app = NEMO_APPLICATION (g_application_get_default ()); if (!nemo_application_get_show_desktop (app)) { return; } gchar *pref = g_settings_get_string (nemo_desktop_preferences, NEMO_PREFERENCES_DESKTOP_LAYOUT); if (g_strcmp0 (pref, "") == 0) { g_settings_set_string (nemo_desktop_preferences, NEMO_PREFERENCES_DESKTOP_LAYOUT, DESKTOPS_DEFAULT); g_free (pref); layout_changed (manager); } gchar **pref_split = g_strsplit (pref, "::", 2); if (g_strv_length (pref_split) != 2) { g_settings_set_string (nemo_desktop_preferences, NEMO_PREFERENCES_DESKTOP_LAYOUT, DESKTOPS_DEFAULT); g_free (pref); g_strfreev (pref_split); layout_changed (manager); } n_monitors = gdk_screen_get_n_monitors (manager->screen); x_primary = gdk_screen_get_primary_monitor (manager->screen); show_desktop_on_primary = g_strcmp0 (pref_split[0], "true") == 0; show_desktop_on_remaining = g_strcmp0 (pref_split[1], "true") == 0; gint i = 0; gboolean primary_set = FALSE; for (i = 0; i < n_monitors; i++) { if (i == x_primary) { create_new_desktop_window (manager, i, show_desktop_on_primary, show_desktop_on_primary); primary_set = primary_set || show_desktop_on_primary; } else if (!nemo_desktop_utils_get_monitor_cloned (i, x_primary)) { gboolean set_layout_primary = !primary_set && !show_desktop_on_primary && show_desktop_on_remaining; create_new_desktop_window (manager, i, set_layout_primary, show_desktop_on_remaining); primary_set = primary_set || set_layout_primary; } } g_free (pref); g_strfreev (pref_split); }
/* callback for showing or hiding the desktop based on the user's preference */ static void desktop_changed_callback (gpointer user_data) { NemoApplication *application; application = NEMO_APPLICATION (user_data); if (g_settings_get_boolean (nemo_desktop_preferences, NEMO_PREFERENCES_SHOW_DESKTOP)) { nemo_application_open_desktop (application); } else { nemo_application_close_desktop (); } }
static void nemo_application_quit_mainloop (GApplication *app) { DEBUG ("Quitting mainloop"); nemo_icon_info_clear_caches (); nemo_application_save_accel_map (NULL); nemo_application_notify_unmount_done (NEMO_APPLICATION (app), NULL); G_APPLICATION_CLASS (nemo_application_parent_class)->quit_mainloop (app); }
static void nemo_application_open (GApplication *app, GFile **files, gint n_files, const gchar *geometry) { NemoApplication *self = NEMO_APPLICATION (app); DEBUG ("Open called on the GApplication instance; %d files", n_files); open_windows (self, files, n_files, gdk_screen_get_default (), geometry); }
static GObject * nemo_application_constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params) { GObject *retval; if (singleton != NULL) { return G_OBJECT (singleton); } retval = G_OBJECT_CLASS (nemo_application_parent_class)->constructor (type, n_construct_params, construct_params); singleton = NEMO_APPLICATION (retval); g_object_add_weak_pointer (retval, (gpointer) &singleton); return retval; }
static void nemo_application_finalize (GObject *object) { NemoApplication *application; application = NEMO_APPLICATION (object); nemo_bookmarks_exiting (); g_clear_object (&application->undo_manager); g_clear_object (&application->priv->volume_monitor); g_clear_object (&application->priv->progress_handler); g_free (application->priv->geometry); nemo_dbus_manager_stop (); nemo_freedesktop_dbus_stop (); notify_uninit (); G_OBJECT_CLASS (nemo_application_parent_class)->finalize (object); }
static gboolean nemo_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 fix_cache = FALSE; gchar **remaining = NULL; NemoApplication *self = NEMO_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, &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 }, { "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_desktop %d", no_default_window, kill_shell, perform_self_check, self->priv->no_desktop); g_application_register (application, NULL, &error); if (error != NULL) { g_printerr ("Could not register the application: %s\n", 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), "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) { 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 void nemo_application_startup (GApplication *app) { NemoApplication *self = NEMO_APPLICATION (app); /* chain up to the GTK+ implementation early, so gtk_init() * is called for us. */ G_APPLICATION_CLASS (nemo_application_parent_class)->startup (app); /* initialize the previewer singleton */ //nemo_previewer_get_singleton (); /* create an undo manager */ self->undo_manager = nemo_undo_manager_new (); /* create DBus manager */ self->priv->dbus_manager = nemo_dbus_manager_new (); self->priv->fdb_manager = nemo_freedesktop_dbus_new (); /* initialize preferences and create the global GSettings objects */ nemo_global_preferences_init (); /* register views */ nemo_icon_view_register (); nemo_desktop_icon_view_register (); nemo_list_view_register (); nemo_icon_view_compact_register (); #if ENABLE_EMPTY_VIEW nemo_empty_view_register (); #endif /* register property pages */ nemo_image_properties_page_register (); /* initialize theming */ init_icons_and_styles (); init_gtk_accels (); /* initialize nemo modules */ nemo_module_setup (); /* attach menu-provider module callback */ menu_provider_init_callback (); /* Initialize the UI handler singleton for file operations */ notify_init (GETTEXT_PACKAGE); self->priv->progress_handler = nemo_progress_ui_handler_new (); /* Watch for unmounts so we can close open windows */ /* TODO-gio: This should be using the UNMOUNTED feature of GFileMonitor instead */ self->priv->volume_monitor = g_volume_monitor_get (); g_signal_connect_object (self->priv->volume_monitor, "mount_removed", G_CALLBACK (mount_removed_callback), self, 0); g_signal_connect_object (self->priv->volume_monitor, "mount_added", G_CALLBACK (mount_added_callback), self, 0); g_signal_connect_swapped (nemo_window_state, "changed::" NEMO_WINDOW_STATE_START_WITH_MENU_BAR, G_CALLBACK (menu_state_changed_callback), self); /* Check the user's ~/.nemo directories and post warnings * if there are problems. */ check_required_directories (self); self->priv->cache_problem = FALSE; self->priv->ignore_cache_problem = FALSE; /* silently do a full check of the cache and fix if running as root. * If running as a normal user, do a quick check, and we'll notify the * user later if there's a problem via an infobar */ if (geteuid () == 0) { if (!gnome_desktop_thumbnail_cache_check_permissions (NULL, FALSE)) gnome_desktop_thumbnail_cache_fix_permissions (); } else { if (!gnome_desktop_thumbnail_cache_check_permissions (NULL, TRUE)) self->priv->cache_problem = TRUE; } if (geteuid() != 0) init_desktop (self); }
static void nemo_application_startup (GApplication *app) { NemoApplication *self = NEMO_APPLICATION (app); /* chain up to the GTK+ implementation early, so gtk_init() * is called for us. */ G_APPLICATION_CLASS (nemo_application_parent_class)->startup (app); /* initialize the previewer singleton */ //nemo_previewer_get_singleton (); /* create an undo manager */ self->undo_manager = nemo_undo_manager_new (); /* create DBus manager */ nemo_dbus_manager_start (app); nemo_freedesktop_dbus_start (self); /* initialize preferences and create the global GSettings objects */ nemo_global_preferences_init (); /* register views */ nemo_icon_view_register (); nemo_desktop_icon_view_register (); nemo_list_view_register (); nemo_icon_view_compact_register (); #if ENABLE_EMPTY_VIEW nemo_empty_view_register (); #endif /* register property pages */ nemo_image_properties_page_register (); /* initialize theming */ init_icons_and_styles (); init_gtk_accels (); /* initialize nemo modules */ nemo_module_setup (); /* attach menu-provider module callback */ menu_provider_init_callback (); /* Initialize the UI handler singleton for file operations */ notify_init (GETTEXT_PACKAGE); self->priv->progress_handler = nemo_progress_ui_handler_new (); /* Watch for unmounts so we can close open windows */ /* TODO-gio: This should be using the UNMOUNTED feature of GFileMonitor instead */ self->priv->volume_monitor = g_volume_monitor_get (); g_signal_connect_object (self->priv->volume_monitor, "mount_removed", G_CALLBACK (mount_removed_callback), self, 0); g_signal_connect_object (self->priv->volume_monitor, "mount_added", G_CALLBACK (mount_added_callback), self, 0); /* Check the user's ~/.nemo directories and post warnings * if there are problems. */ check_required_directories (self); init_desktop (self); }