nautilus-application.c 19.4 KB
Newer Older
Gene Z. Ragan's avatar
CVS:  
Gene Z. Ragan committed
1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 3 4 5 6 7 8

/*
 *  Nautilus
 *
 *  Copyright (C) 1999, 2000 Red Hat, Inc.
 *  Copyright (C) 2000 Eazel, Inc.
 *
9
 *  Nautilus is free software; you can redistribute it and/or
10 11 12 13
 *  modify it under the terms of the GNU General Public License as
 *  published by the Free Software Foundation; either version 2 of the
 *  License, or (at your option) any later version.
 *
14
 *  Nautilus is distributed in the hope that it will be useful,
15 16 17 18 19
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
20
 *  along with this program; if not, write to the Free Software
21 22 23 24 25 26
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  Author: Elliot Lee <sopwith@redhat.com>,
 *
 */

27
#include <config.h>
28
#include "nautilus-application.h"
29

30
#include "file-manager/fm-desktop-icon-view.h"
31
#include "file-manager/fm-icon-view.h"
32
#include "file-manager/fm-list-view.h"
33
#include "file-manager/fm-search-list-view.h"
34 35
#include "nautilus-desktop-window.h"
#include "nautilus-first-time-druid.h"
36
#include "nautilus-main.h"
37 38 39 40 41
#include "nautilus-shell-interface.h"
#include "nautilus-shell.h"
#include <bonobo/bonobo-main.h>
#include <bonobo/bonobo-object.h>
#include <gtk/gtksignal.h>
42 43 44 45
#include <libgnome/gnome-i18n.h>
#include <libgnome/gnome-util.h>
#include <libgnomeui/gnome-messagebox.h>
#include <libgnomeui/gnome-stock.h>
46
#include <libnautilus-extensions/nautilus-file-utilities.h>
47
#include <libnautilus-extensions/nautilus-global-preferences.h>
48
#include <libnautilus-extensions/nautilus-gtk-macros.h>
49
#include <libnautilus-extensions/nautilus-icon-factory.h>
50
#include <libnautilus-extensions/nautilus-sound.h>
51
#include <libnautilus-extensions/nautilus-stock-dialogs.h>
52
#include <libnautilus-extensions/nautilus-string-list.h>
53
#include <libnautilus-extensions/nautilus-undo-manager.h>
54
#include <liboaf/liboaf.h>
55

56 57 58
#define FACTORY_IID	"OAFIID:nautilus_factory:bd1e1862-92d7-4391-963e-37583f0daef3"
#define ICON_VIEW_IID	"OAFIID:nautilus_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058"
#define LIST_VIEW_IID	"OAFIID:nautilus_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c"
59
#define SEARCH_LIST_VIEW_IID "OAFIID:nautilus_file_manager_search_list_view:b186e381-198e-43cf-9c46-60b6bb35db0b"
60
#define SHELL_IID	"OAFIID:nautilus_shell:cd5183b2-3913-4b74-9b8e-10528b0de08d"
61

62 63 64 65 66
static CORBA_boolean manufactures                                (PortableServer_Servant    servant,
								  const CORBA_char         *iid,
								  CORBA_Environment        *ev);
static CORBA_Object  create_object                               (PortableServer_Servant    servant,
								  const CORBA_char         *iid,
Maciej Stachowiak's avatar
Maciej Stachowiak committed
67
								  const GNOME_stringlist  *params,
68 69 70 71 72
								  CORBA_Environment        *ev);
static void          nautilus_application_initialize             (NautilusApplication      *application);
static void          nautilus_application_initialize_class       (NautilusApplicationClass *klass);
static void          nautilus_application_destroy                (GtkObject                *object);
static void          nautilus_application_check_user_directories (NautilusApplication      *application);
73
static gboolean	     check_for_and_run_as_super_user 		 (void);
Ramiro Estrugo's avatar
Ramiro Estrugo committed
74
static gboolean	     need_to_show_first_time_druid		 (void);
75
static void	     desktop_changed_callback 		         (gpointer 		   user_data);
76 77 78

NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusApplication, nautilus_application, BONOBO_OBJECT_TYPE)

79
static POA_GNOME_ObjectFactory__epv factory_epv = {
Gene Z. Ragan's avatar
CVS:  
Gene Z. Ragan committed
80
	NULL,
81 82 83 84
	&manufactures,
	&create_object
};
static PortableServer_ServantBase__epv base_epv;
85
static POA_GNOME_ObjectFactory__vepv vepv = {
86 87
	&base_epv,
	&factory_epv
88 89 90
};

static CORBA_boolean
91 92 93
manufactures (PortableServer_Servant servant,
	      const CORBA_char *iid,
	      CORBA_Environment *ev)
94
{
95
	return strcmp (iid, ICON_VIEW_IID) == 0
96
		|| strcmp (iid, NAUTILUS_DESKTOP_ICON_VIEW_IID) == 0
97
		|| strcmp (iid, LIST_VIEW_IID) == 0
98
		|| strcmp (iid, SEARCH_LIST_VIEW_IID) == 0
99
		|| strcmp (iid, SHELL_IID) == 0;
100 101 102
}

static CORBA_Object
103 104
create_object (PortableServer_Servant servant,
	       const CORBA_char *iid,
Maciej Stachowiak's avatar
Maciej Stachowiak committed
105
	       const GNOME_stringlist *params,
106
	       CORBA_Environment *ev)
107
{
108
	BonoboObject *object;
109
	FMDirectoryView *directory_view;
110
	NautilusApplication *application;
111

112
	if (strcmp (iid, ICON_VIEW_IID) == 0) {
113
		directory_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_icon_view_get_type (), NULL));
114
		object = BONOBO_OBJECT (fm_directory_view_get_nautilus_view (directory_view));
115 116 117
	} else if (strcmp (iid, NAUTILUS_DESKTOP_ICON_VIEW_IID) == 0) {
		directory_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_desktop_icon_view_get_type (), NULL));
		object = BONOBO_OBJECT (fm_directory_view_get_nautilus_view (directory_view));
118
	} else if (strcmp (iid, LIST_VIEW_IID) == 0) {
119
		directory_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_list_view_get_type (), NULL));
120
		object = BONOBO_OBJECT (fm_directory_view_get_nautilus_view (directory_view));
121 122 123
	} else if (strcmp (iid, SEARCH_LIST_VIEW_IID) == 0) {
		directory_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_search_list_view_get_type (), NULL));
		object = BONOBO_OBJECT (fm_directory_view_get_nautilus_view (directory_view));
124
	} else if (strcmp (iid, SHELL_IID) == 0) {
125 126
		application = NAUTILUS_APPLICATION (((BonoboObjectServant *) servant)->bonobo_object);
		object = BONOBO_OBJECT (nautilus_shell_new (application));
Gene Z. Ragan's avatar
CVS:  
Gene Z. Ragan committed
127
	} else {
128
		return CORBA_OBJECT_NIL;
Gene Z. Ragan's avatar
CVS:  
Gene Z. Ragan committed
129
	}
130 131

	return CORBA_Object_duplicate (bonobo_object_corba_objref (object), ev);
132 133
}

134
static CORBA_Object
135 136 137
create_factory (PortableServer_POA poa,
		NautilusApplication *bonobo_object,
		CORBA_Environment *ev)
138
{
139
	BonoboObjectServant *servant;
Gene Z. Ragan's avatar
CVS:  
Gene Z. Ragan committed
140

141
	servant = g_new0 (BonoboObjectServant, 1);
142 143
	((POA_GNOME_ObjectFactory *) servant)->vepv = &vepv;
	POA_GNOME_ObjectFactory__init ((PortableServer_Servant) servant, ev);
144
	return bonobo_object_activate_servant (BONOBO_OBJECT (bonobo_object), servant);
145 146
}

147
/* Keeps track of the one and only desktop window. */
148
static NautilusDesktopWindow *nautilus_application_desktop_window;
149 150 151 152 153 154 155 156 157

/* Keeps track of all the nautilus windows. */
static GSList *nautilus_application_window_list;

GSList *nautilus_application_windows (void)
{
	return nautilus_application_window_list;
}

158
static void
159
nautilus_application_initialize_class (NautilusApplicationClass *klass)
160
{
161
	GTK_OBJECT_CLASS (klass)->destroy = nautilus_application_destroy;
162 163 164
}

static void
165
nautilus_application_initialize (NautilusApplication *application)
166
{
167
	CORBA_Environment ev;
168
	CORBA_Object corba_object;
169

170
	CORBA_exception_init (&ev);
171
	corba_object = create_factory (bonobo_poa (), application, &ev);
172 173 174 175
	if (ev._major != CORBA_NO_EXCEPTION) {
		g_error ("could not create factory");
	}
	CORBA_exception_free (&ev);
176
	
177
	bonobo_object_construct (BONOBO_OBJECT (application), corba_object);
178
	
179 180
	/* Create an undo manager */
	application->undo_manager = nautilus_undo_manager_new ();
181 182 183 184 185

	/* monitor the desktop preference */
	nautilus_preferences_add_callback (NAUTILUS_PREFERENCES_SHOW_DESKTOP,
					   desktop_changed_callback,
					   application);	
186 187
}

188 189
NautilusApplication *
nautilus_application_new (void)
190
{
191
	return NAUTILUS_APPLICATION (gtk_object_new (nautilus_application_get_type (), NULL));
192 193 194
}

static void
195
nautilus_application_destroy (GtkObject *object)
196
{
197 198 199 200
	NautilusApplication *application;

	application = NAUTILUS_APPLICATION (object);

201
	nautilus_bookmarks_exiting ();
202 203 204 205
	
	nautilus_preferences_remove_callback (NAUTILUS_PREFERENCES_SHOW_DESKTOP,
					      desktop_changed_callback,
					      application);
206

207 208
	bonobo_object_unref (BONOBO_OBJECT (application->undo_manager));

209 210
	NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object));
}
211

212
static void
213
nautilus_application_check_user_directories (NautilusApplication *application)
214
{
215 216 217
	char			*user_directory;
	char			*user_main_directory;
	char			*desktop_directory;
218 219
	NautilusStringList	*dir_list;
	
220
	g_assert (NAUTILUS_IS_APPLICATION (application));
221 222 223 224 225

	user_directory = nautilus_get_user_directory ();
	user_main_directory = nautilus_get_user_main_directory ();
	desktop_directory = nautilus_get_desktop_directory ();

226
	dir_list = nautilus_string_list_new (TRUE);
227 228
	
	/* FIXME bugzilla.eazel.com 1115: Need better name for "User Directory"
229 230
	 * and "User Data Directory". Perhaps it's OK to use the word "directory"
	 * instead of "folder" in this technical error case.
231 232 233
	 */

	if (!g_file_test (user_directory, G_FILE_TEST_ISDIR)) {
234
		nautilus_string_list_insert (dir_list, _("User Directory"));
235
	}
236
	g_free (user_directory);
237 238
	    
	if (!g_file_test (user_main_directory, G_FILE_TEST_ISDIR)) {
239
		nautilus_string_list_insert (dir_list, _("User Main Directory"));
240
	}
241
	g_free (user_main_directory);
242 243
	    
	if (!g_file_test (desktop_directory, G_FILE_TEST_ISDIR)) {
244
		nautilus_string_list_insert (dir_list, _("Desktop Directory"));
245
	}
246
	g_free (desktop_directory);
247 248 249 250 251 252 253 254 255 256 257 258

	if (nautilus_string_list_get_length (dir_list) > 0) {
		char *dir_list_concatenated;
		char *error_string;

		dir_list_concatenated = nautilus_string_list_as_concatenated_string (dir_list, "\n");
		
		error_string = g_strdup_printf ("%s\n\n%s\n\n%s",
						"The following directories are missing:",
						dir_list_concatenated,
						"Please restart Nautilus to fix this problem.");

259
		nautilus_error_dialog (error_string, _("Missing Directories"), NULL);
260 261 262 263 264 265 266 267

		g_free (dir_list_concatenated);
		g_free (error_string);
	}

	nautilus_string_list_free (dir_list);
}

268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
static int
nautilus_strv_length (const char * const *strv)
{
	const char * const *p;

	for (p = strv; *p != NULL; p++) { }
	return p - strv;
}

static Nautilus_URIList *
nautilus_make_uri_list_from_strv (const char * const *strv)
{
	int length, i;
	Nautilus_URIList *uri_list;

	length = nautilus_strv_length (strv);

	uri_list = Nautilus_URIList__alloc ();
	uri_list->_maximum = length;
	uri_list->_length = length;
	uri_list->_buffer = CORBA_sequence_Nautilus_URI_allocbuf (length);
	for (i = 0; i < length; i++) {
		uri_list->_buffer[i] = CORBA_string_dup (strv[i]);
	}
	CORBA_sequence_set_release (uri_list, CORBA_TRUE);

	return uri_list;
}

297
void
298
nautilus_application_startup (NautilusApplication *application,
299
			      gboolean kill_shell,
300
			      gboolean restart_shell,
301 302
			      gboolean stop_desktop,
			      gboolean start_desktop,
303
			      const char *urls[])
304
{
305 306
	CORBA_Environment ev;
	Nautilus_Shell shell;
307 308 309
	OAF_RegistrationResult result;
	const char *message, *detailed_message;
	GnomeDialog *dialog;
310 311
	Nautilus_URIList *url_list;

312 313
	/* Perform check for nautilus being run as super user */
	if (!check_for_and_run_as_super_user ()) {
314
		return;
315
	}
Ramiro Estrugo's avatar
Ramiro Estrugo committed
316 317 318

	/* Run the first time startup druid if needed. */
	if (need_to_show_first_time_druid ()) {
319
		nautilus_first_time_druid_show (application, start_desktop, urls);
320
		return;
321
	}
Ramiro Estrugo's avatar
Ramiro Estrugo committed
322
	
323
	/* Check the user's ~/.nautilus directories and post warnings
324
	 * if there are problems.
325
	 */
326
	nautilus_application_check_user_directories (application);
327

328 329 330
	/* initialize the sound machinery */
	nautilus_sound_initialize ();
	
331 332
	CORBA_exception_init (&ev);

333 334 335 336 337 338 339 340 341
	/* Start up the factory. */
	for (;;) {
		/* Try to register the file manager view factory with OAF. */
		result = oaf_active_server_register
			(FACTORY_IID,
			 bonobo_object_corba_objref (BONOBO_OBJECT (application)));
		switch (result) {
		case OAF_REG_SUCCESS:
			/* We are registered with OAF and all is right with the world. */
342 343
		case OAF_REG_ALREADY_ACTIVE:
			/* Another copy of . */
344
			message = NULL;
345
			detailed_message = NULL;
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
			break;
		case OAF_REG_NOT_LISTED:
			/* Can't register myself due to trouble locating the
			 * nautilus.oafinfo file. This has happened when you
			 * launch Nautilus with an LD_LIBRARY_PATH that
			 * doesn't include the directory containg the oaf
			 * library. It could also happen if the
			 * nautilus.oafinfo file was not present for some
			 * reason. Sometimes killing oafd and gconfd fixes
			 * this problem but we don't exactly understand why,
			 * since neither of the above causes explain it.
			 */
			message = _("Nautilus can't be used now. "
				    "Rebooting the computer or installing "
				    "Nautilus again may fix the problem.");
361
			/* FIXME bugzilla.eazel.com 2536: The guesses and stuff here are lame. */
362 363
			detailed_message = _("Nautilus can't be used now. "
					     "Rebooting the computer or installing "
364
					     "Nautilus again may fix the problem.\n\n"
365 366 367 368
					     "OAF couldn't locate the nautilus.oafinfo file. "
					     "One cause of this seems to be an LD_LIBRARY_PATH "
					     "that does not include the oaf library's directory. "
					     "Another possible cause would be bad install "
369
					     "with a missing nautilus.oafinfo file.\n\n"
370
					     "Sometimes killing oafd and gconfd fixes "
371
					     "the problem, but we don't know why.\n\n"
372 373 374 375 376 377 378 379 380 381
					     "We need a much less confusing message here for Nautilus 1.0.");
			break;
		default:
			/* This should never happen. */
			g_warning ("bad error code from oaf_active_server_register");
		case OAF_REG_ERROR:
			/* Some misc. error (can never happen with current
			 * version of OAF). Show dialog and terminate the
			 * program.
			 */
382
			/* FIXME bugzilla.eazel.com 2537: Looks like this does happen with the
383 384 385 386
			 * current OAF. I guess I read the code
			 * wrong. Need to figure out when and make a
			 * good message.
			 */
387 388 389 390 391
			message = _("Nautilus can't be used now, due to an unexpected error.");
			detailed_message = _("Nautilus can't be used now, due to an unexpected error "
					     "from OAF when attempting to register the file manager view server.");
			break;
		}
392 393 394 395 396 397 398 399 400 401 402 403

		/* Get the shell object. */
		if (message == NULL) {
			shell = oaf_activate_from_id (SHELL_IID, 0, NULL, NULL);
			if (!CORBA_Object_is_nil (shell, &ev)) {
				break;
			}

			/* If we couldn't find ourselves it's a bad problem so
			 * we better stop looping.
			 */
			if (result == OAF_REG_SUCCESS) {
404
				/* FIXME bugzilla.eazel.com 2538: When can this happen? */
405 406 407 408 409 410
				message = _("Nautilus can't be used now, due to an unexpected error.");
				detailed_message = _("Nautilus can't be used now, due to an unexpected error "
						     "from OAF when attempting to locate the factory.");
			}
		}

411
		if (message != NULL) {
412
			dialog = nautilus_error_dialog_with_details (message, NULL, detailed_message, NULL);
413 414
			/* We need the main event loop so the user has a chance to see the dialog. */
			nautilus_main_event_loop_register (GTK_OBJECT (dialog));
415
			goto out;
416 417 418
		}
	}

419 420
	if (kill_shell) {
		Nautilus_Shell_quit (shell, &ev);
421 422
	} else if (restart_shell) {
		Nautilus_Shell_restart (shell, &ev);
423 424 425 426
	} else {
		if (start_desktop) {
			Nautilus_Shell_start_desktop (shell, &ev);
		}
427

428 429 430
		if (stop_desktop) {
			Nautilus_Shell_stop_desktop (shell, &ev);
		}
431

432 433 434 435 436
	  	/* Create the other windows. */
		if (urls != NULL) {
			url_list = nautilus_make_uri_list_from_strv (urls);
			Nautilus_Shell_open_windows (shell, url_list, &ev);
			CORBA_free (url_list);
437
		} else if (!stop_desktop) {
438 439
			Nautilus_Shell_open_default_window (shell, &ev);
		}
440
	}
441

442
	/* We're done with the shell now, so let it go. */
443
	bonobo_object_release_unref (shell, &ev);
444

445
 out:
446
	CORBA_exception_free (&ev);
447 448 449
}

static void
450 451
nautilus_application_create_desktop_window (NautilusApplication *application)
{
452 453
	g_return_if_fail (nautilus_application_desktop_window == NULL);
	g_return_if_fail (NAUTILUS_IS_APPLICATION (application));
454

455 456
	nautilus_application_desktop_window = nautilus_desktop_window_new (application);
	gtk_widget_show (GTK_WIDGET (nautilus_application_desktop_window));
457 458 459 460
}

void
nautilus_application_open_desktop (NautilusApplication *application)
461
{
462 463
	if (nautilus_application_desktop_window == NULL) {
		nautilus_application_create_desktop_window (application);
464 465 466 467 468 469
	}
}

void
nautilus_application_close_desktop (void)
{
470
	if (nautilus_application_desktop_window != NULL) {
471
		gtk_widget_destroy (GTK_WIDGET (nautilus_application_desktop_window));
472
		nautilus_application_desktop_window = NULL;
473
	}	
474 475
}

476 477 478
void
nautilus_application_close_all_windows (void)
{
479
	while (nautilus_application_window_list != NULL) {
480 481 482 483
		nautilus_window_close (NAUTILUS_WINDOW (nautilus_application_window_list->data));
	}
}

484
static void
485
nautilus_application_destroyed_window (GtkObject *object, NautilusApplication *application)
486
{
487
	nautilus_application_window_list = g_slist_remove (nautilus_application_window_list, object);
488 489
}

490 491 492 493 494 495 496 497 498 499 500 501 502
static gboolean
nautilus_window_delete_event_callback (GtkWidget *widget,
				       GdkEvent *event,
				       gpointer user_data)
{
	NautilusWindow *window;

	window = NAUTILUS_WINDOW (widget);
	nautilus_window_close (window);

	return TRUE;
}				       

503
NautilusWindow *
504
nautilus_application_create_window (NautilusApplication *application)
505
{
506
	NautilusWindow *window;
507 508

	g_return_val_if_fail (NAUTILUS_IS_APPLICATION (application), NULL);
509
	
510
	window = NAUTILUS_WINDOW (gtk_widget_new (nautilus_window_get_type (),
511
						  "app", GTK_OBJECT (application),
512
						  "app_id", "nautilus", NULL));
513
	
514 515 516 517
	gtk_signal_connect (GTK_OBJECT (window), 
			    "delete_event", GTK_SIGNAL_FUNC (nautilus_window_delete_event_callback),
                    	    NULL);

518
	gtk_signal_connect (GTK_OBJECT (window),
519
			    "destroy", nautilus_application_destroyed_window,
520 521
			    application);

522
	nautilus_application_window_list = g_slist_prepend (nautilus_application_window_list, window);
523

Gene Z. Ragan's avatar
CVS:  
Gene Z. Ragan committed
524
	/* Do not yet show the window. It will be shown later on if it can
525 526 527
	 * successfully display its initial URI. Otherwise it will be destroyed
	 * without ever having seen the light of day.
	 */
528

529
	return window;
530
}
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561

/*
 * check_for_super_user:
 *
 * Puts out a warning if the user is running nautilus as root.
 */
static gboolean
check_for_and_run_as_super_user (void)
{
	GtkWidget *warning_dlg;
	gint result;
	if (geteuid () != 0) {
		return TRUE;
	}

	warning_dlg = gnome_message_box_new (
		_("You are running Nautilus as root.\n\n"
		  "As root, you can damage your system if you are not careful, and\n"
		  "Nautilus will not stop you from doing it."),
		GNOME_MESSAGE_BOX_WARNING,
		GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL);

	result = gnome_dialog_run_and_close (GNOME_DIALOG (warning_dlg));

	/* If they pressed cancel, quit the application */
	if (result == 1) {
		return FALSE;
	}

	return TRUE;
}
Ramiro Estrugo's avatar
Ramiro Estrugo committed
562

563 564 565 566 567 568 569 570 571 572 573 574 575 576
/* callback for showing or hiding the desktop based on the user's preference */
static void
desktop_changed_callback (gpointer user_data)
{
	NautilusApplication *application;
	
	application = NAUTILUS_APPLICATION (user_data);
	if ( nautilus_preferences_get_boolean (NAUTILUS_PREFERENCES_SHOW_DESKTOP, FALSE)) {
		nautilus_application_open_desktop (application);
	} else {
		nautilus_application_close_desktop ();
	}
}

Ramiro Estrugo's avatar
Ramiro Estrugo committed
577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610
/*
 * need_to_show_first_time_druid
 *
 * Determine whether Nautilus needs to show the first time druid.
 * 
 * Note that the flag file indicating whether the druid has been
 * presented is: ~/.nautilus/first-time-wizard.
 *
 * Another alternative could be to use preferences to store this flag
 * However, there because of bug 1229 this is not yet possible.
 *
 * Also, for debugging purposes, it is convenient to have just one file
 * to kill in order to test the startup wizard:
 *
 * rm -f ~/.nautilus/first-time-wizard
 *
 * In order to accomplish the same thing with preferences, you would have
 * to either kill ALL your preferences or spend time digging in ~/.gconf
 * xml files finding the right one.
 */
static gboolean
need_to_show_first_time_druid (void)
{
	gboolean result;
	char *user_directory;
	char *druid_flag_file_name;

	user_directory = nautilus_get_user_directory ();

	druid_flag_file_name = g_strdup_printf ("%s/%s",
						user_directory,
						"first-time-wizard-flag");
	g_free (user_directory);

611
	result = !g_file_exists (druid_flag_file_name);	
Ramiro Estrugo's avatar
Ramiro Estrugo committed
612 613 614 615
	g_free (druid_flag_file_name);

	return result;
}