nautilus r14156 - in trunk: . libnautilus-private src src/file-manager



Author: cneumair
Date: Tue May 13 10:48:12 2008
New Revision: 14156
URL: http://svn.gnome.org/viewvc/nautilus?rev=14156&view=rev

Log:
2008-05-13  Christian Neumair  <cneumair gnome org>

	* libnautilus-private/nautilus-view.c
	(nautilus_view_pop_up_location_context_menu):
	* libnautilus-private/nautilus-view.h:
	* src/file-manager/fm-actions.h:
	* src/file-manager/fm-directory-view.c
	(action_self_properties_callback),
	(action_location_properties_callback),
	(fm_directory_view_finalize),
	(action_location_mount_volume_callback),
	(action_location_unmount_volume_callback),
	(action_location_eject_volume_callback),
	(action_location_format_volume_callback),
	(action_location_open_folder_window_callback),
	(action_location_cut_callback), (action_location_copy_callback),
	(action_location_trash_callback),
	(action_location_delete_callback),
	(real_update_location_menu_volumes), (real_update_location_menu),
	(fm_directory_view_pop_up_background_context_menu),
	(real_pop_up_location_context_menu),
	(location_popup_file_attributes_ready),
	(unschedule_pop_up_location_context_menu),
	(schedule_pop_up_location_context_menu),
	(fm_directory_view_pop_up_location_context_menu), (load_directory):
	* src/file-manager/fm-directory-view.h:
	* src/file-manager/nautilus-directory-view-ui.xml:
	* src/nautilus-location-bar.c (label_button_pressed_callback):
	* src/nautilus-navigation-window.c
	(nautilus_navigation_window_init),
	(path_bar_button_pressed_callback), (path_bar_path_set_callback):
	* src/nautilus-pathbar.c (nautilus_path_bar_class_init),
	(nautilus_path_bar_update_path),
	(nautilus_path_bar_get_path_for_button):
	* src/nautilus-pathbar.h:
	* src/nautilus-spatial-window.c (location_button_pressed_callback):
	Allow to open location popup menu for any location, and not just for
	currently open folder. Enable location popup menu for all path bar
	buttons. Add volume operations to location context menu. Fix
	separators in location context menu. Fixes #309844.
	Do not unref file when opening properties dialog from background
	context menu.


Modified:
   trunk/ChangeLog
   trunk/libnautilus-private/nautilus-view.c
   trunk/libnautilus-private/nautilus-view.h
   trunk/src/file-manager/fm-actions.h
   trunk/src/file-manager/fm-directory-view.c
   trunk/src/file-manager/fm-directory-view.h
   trunk/src/file-manager/nautilus-directory-view-ui.xml
   trunk/src/nautilus-location-bar.c
   trunk/src/nautilus-navigation-window.c
   trunk/src/nautilus-pathbar.c
   trunk/src/nautilus-pathbar.h
   trunk/src/nautilus-spatial-window.c

Modified: trunk/libnautilus-private/nautilus-view.c
==============================================================================
--- trunk/libnautilus-private/nautilus-view.c	(original)
+++ trunk/libnautilus-private/nautilus-view.c	Tue May 13 10:48:12 2008
@@ -269,11 +269,12 @@
 
 void
 nautilus_view_pop_up_location_context_menu (NautilusView   *view,
-					    GdkEventButton *event)
+					    GdkEventButton *event,
+					    const char     *location)
 {
 	g_return_if_fail (NAUTILUS_IS_VIEW (view));
 
 	if (NAUTILUS_VIEW_GET_IFACE (view)->pop_up_location_context_menu != NULL) {
-		(* NAUTILUS_VIEW_GET_IFACE (view)->pop_up_location_context_menu) (view, event);
+		(* NAUTILUS_VIEW_GET_IFACE (view)->pop_up_location_context_menu) (view, event, location);
 	}
 }

Modified: trunk/libnautilus-private/nautilus-view.h
==============================================================================
--- trunk/libnautilus-private/nautilus-view.h	(original)
+++ trunk/libnautilus-private/nautilus-view.h	Tue May 13 10:48:12 2008
@@ -114,11 +114,14 @@
 	/* Request popup of context menu referring to the open location.
 	 * This is triggered in spatial windows by right-clicking the location button,
 	 * in navigational windows by right-clicking the "Location:" label in the
-	 * navigation bar.
+	 * navigation bar or any of the buttons in the pathbar.
+	 * The location parameter specifies the location this popup should be displayed for.
+	 * If it is NULL, the currently displayed location should be used.
 	 * The view may display the popup synchronously, asynchronously
 	 * or not react to the popup request at all. */
 	void           (* pop_up_location_context_menu) (NautilusView   *view,
-							 GdkEventButton *event);
+							 GdkEventButton *event,
+							 const char     *location);
 
 	/* Padding for future expansion */
 	void (*_reserved1) (void);
@@ -156,7 +159,8 @@
 gboolean          nautilus_view_can_zoom_out               (NautilusView      *view);
 NautilusZoomLevel nautilus_view_get_zoom_level             (NautilusView      *view);
 void              nautilus_view_pop_up_location_context_menu (NautilusView    *view,
-							      GdkEventButton  *event);
+							      GdkEventButton  *event,
+							      const char      *location);
 void              nautilus_view_grab_focus                 (NautilusView      *view);
 
 G_END_DECLS

Modified: trunk/src/file-manager/fm-actions.h
==============================================================================
--- trunk/src/file-manager/fm-actions.h	(original)
+++ trunk/src/file-manager/fm-actions.h	Tue May 13 10:48:12 2008
@@ -36,6 +36,7 @@
 #define FM_ACTION_PROPERTIES "Properties"
 #define FM_ACTION_PROPERTIES_ACCEL "PropertiesAccel"
 #define FM_ACTION_SELF_PROPERTIES "SelfProperties"
+#define FM_ACTION_LOCATION_PROPERTIES "LocationProperties"
 #define FM_ACTION_NO_TEMPLATES "No Templates"
 #define FM_ACTION_EMPTY_TRASH "Empty Trash"
 #define FM_ACTION_SAVE_SEARCH "Save Search"
@@ -67,6 +68,10 @@
 #define FM_ACTION_SELF_UNMOUNT_VOLUME "Self Unmount Volume"
 #define FM_ACTION_SELF_EJECT_VOLUME "Self Eject Volume"
 #define FM_ACTION_SELF_FORMAT_VOLUME "Self Format Volume"
+#define FM_ACTION_LOCATION_MOUNT_VOLUME "Location Mount Volume"
+#define FM_ACTION_LOCATION_UNMOUNT_VOLUME "Location Unmount Volume"
+#define FM_ACTION_LOCATION_EJECT_VOLUME "Location Eject Volume"
+#define FM_ACTION_LOCATION_FORMAT_VOLUME "Location Format Volume"
 #define FM_ACTION_SCRIPTS "Scripts"
 #define FM_ACTION_NEW_DOCUMENTS "New Documents"
 #define FM_ACTION_NEW_EMPTY_FILE "New Empty File"

Modified: trunk/src/file-manager/fm-directory-view.c
==============================================================================
--- trunk/src/file-manager/fm-directory-view.c	(original)
+++ trunk/src/file-manager/fm-directory-view.c	Tue May 13 10:48:12 2008
@@ -181,6 +181,8 @@
 	NautilusWindowInfo *window;
 	NautilusDirectory *model;
 	NautilusFile *directory_as_file;
+	NautilusFile *location_popup_directory_as_file;
+	GdkEventButton *location_popup_event;
 	GtkActionGroup *dir_action_group;
 	guint dir_merge_id;
 
@@ -378,6 +380,10 @@
 						     gpointer   callback_data);
 static void action_location_delete_callback         (GtkAction *action,
 						     gpointer   callback_data);
+static void action_location_properties_callback     (GtkAction *action,
+						     gpointer   callback_data);
+
+static void unschedule_pop_up_location_context_menu (FMDirectoryView *view);
 
 EEL_CLASS_BOILERPLATE (FMDirectoryView, fm_directory_view, GTK_TYPE_SCROLLED_WINDOW)
 
@@ -1382,7 +1388,29 @@
 	g_assert (FM_IS_DIRECTORY_VIEW (callback_data));
 
 	view = FM_DIRECTORY_VIEW (callback_data);
-	files = g_list_append (NULL, view->details->directory_as_file);
+
+	if (view->details->directory_as_file != NULL) {
+		files = g_list_append (NULL, nautilus_file_ref (view->details->directory_as_file));
+
+		fm_properties_window_present (files, GTK_WIDGET (view));
+
+		nautilus_file_list_free (files);
+	}
+}
+
+static void
+action_location_properties_callback (GtkAction *action,
+				     gpointer   callback_data)
+{
+	FMDirectoryView *view;
+	GList           *files;
+
+	g_assert (FM_IS_DIRECTORY_VIEW (callback_data));
+
+	view = FM_DIRECTORY_VIEW (callback_data);
+	g_assert (NAUTILUS_IS_FILE (view->details->location_popup_directory_as_file));
+
+	files = g_list_append (NULL, nautilus_file_ref (view->details->location_popup_directory_as_file));
 
 	fm_properties_window_present (files, GTK_WIDGET (view));
 
@@ -1967,6 +1995,11 @@
 	eel_preferences_remove_callback (NAUTILUS_PREFERENCES_SORT_DIRECTORIES_FIRST,
 					 sort_directories_first_changed_callback, view);
 
+	unschedule_pop_up_location_context_menu (view);
+	if (view->details->location_popup_event != NULL) {
+		gdk_event_free ((GdkEvent *) view->details->location_popup_event);
+	}
+
 	g_hash_table_destroy (view->details->non_ready_files);
 
 	g_free (view->details);
@@ -5992,6 +6025,81 @@
 }
 
 static void
+action_location_mount_volume_callback (GtkAction *action,
+				       gpointer data)
+{
+	NautilusFile *file;
+	FMDirectoryView *view;
+	GMountOperation *mount_op;
+
+	view = FM_DIRECTORY_VIEW (data);
+
+	file = view->details->location_popup_directory_as_file;
+	if (file == NULL) {
+		return;
+	}
+
+	mount_op = eel_mount_operation_new (fm_directory_view_get_containing_window (view));
+	nautilus_file_mount (file, mount_op, NULL, NULL, NULL);
+	g_object_unref (mount_op);
+}
+
+static void
+action_location_unmount_volume_callback (GtkAction *action,
+					 gpointer data)
+{
+	NautilusFile *file;
+	FMDirectoryView *view;
+
+	view = FM_DIRECTORY_VIEW (data);
+
+	file = view->details->location_popup_directory_as_file;
+	if (file == NULL) {
+		return;
+	}
+
+	nautilus_file_unmount (file);
+}
+
+static void
+action_location_eject_volume_callback (GtkAction *action,
+				       gpointer data)
+{
+	NautilusFile *file;
+	FMDirectoryView *view;
+
+	view = FM_DIRECTORY_VIEW (data);
+
+	file = view->details->location_popup_directory_as_file;
+	if (file == NULL) {
+		return;
+	}
+	
+	nautilus_file_eject (file);
+}
+
+static void 
+action_location_format_volume_callback (GtkAction *action,
+					gpointer   data)
+{
+	NautilusFile *file;
+	FMDirectoryView *view;
+
+	view = FM_DIRECTORY_VIEW (data);
+
+	file = view->details->location_popup_directory_as_file;
+	if (file == NULL) {
+		return;
+	}
+
+#ifdef TODO_GIO
+	if (something) {
+		g_spawn_command_line_async ("gfloppy", NULL);
+	}
+#endif
+}
+
+static void
 connect_to_server_response_callback (GtkDialog *dialog,
 				     int response_id,
 				     gpointer data)
@@ -6145,7 +6253,7 @@
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = view->details->directory_as_file;
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	fm_directory_view_activate_file (view,
@@ -6164,7 +6272,7 @@
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	files = g_list_append (NULL, file);
@@ -6182,7 +6290,7 @@
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	files = g_list_append (NULL, file);
@@ -6200,7 +6308,7 @@
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	files = g_list_append (NULL, file);
@@ -6221,7 +6329,7 @@
 
 	view = FM_DIRECTORY_VIEW (callback_data);
 
-	file = fm_directory_view_get_directory_as_file (view);
+	file = view->details->location_popup_directory_as_file;
 	g_return_if_fail (file != NULL);
 
 	location = nautilus_file_get_location (file);
@@ -6475,6 +6583,28 @@
   /* label, accelerator */       N_("_Delete"), "",
   /* tooltip */                  N_("Delete this folder, without moving to the Trash"),
                                  G_CALLBACK (action_location_delete_callback) },
+
+  /* name, stock id */         { "Location Mount Volume", NULL,
+  /* label, accelerator */       N_("_Mount Volume"), NULL,
+  /* tooltip */                  N_("Mount the volume associated with this folder"),
+                                 G_CALLBACK (action_location_mount_volume_callback) },
+  /* name, stock id */         { "Location Unmount Volume", NULL,
+  /* label, accelerator */       N_("_Unmount Volume"), NULL,
+  /* tooltip */                  N_("Unmount the volume associated with this folder"),
+                                 G_CALLBACK (action_location_unmount_volume_callback) },
+  /* name, stock id */         { "Location Eject Volume", NULL,
+  /* label, accelerator */       N_("_Eject"), NULL,
+  /* tooltip */                  N_("Eject the volume associated with this folder"),
+                                 G_CALLBACK (action_location_eject_volume_callback) },
+  /* name, stock id */         { "Location Format Volume", NULL,
+  /* label, accelerator */       N_("_Format"), NULL,
+  /* tooltip */                  N_("Format the volume associated with this folder"),
+                                 G_CALLBACK (action_location_format_volume_callback) },
+
+  /* name, stock id */         { "LocationProperties", GTK_STOCK_PROPERTIES,
+  /* label, accelerator */       N_("_Properties"), NULL,
+  /* tooltip */                  N_("View or modify the properties of this folder"),
+                                 G_CALLBACK (action_location_properties_callback) },
 };
 
 static const GtkToggleActionEntry directory_view_toggle_entries[] = {
@@ -6932,6 +7062,45 @@
 }
 
 static void
+real_update_location_menu_volumes (FMDirectoryView *view)
+{
+	GtkAction *action;
+	NautilusFile *file;
+	gboolean show_mount;
+	gboolean show_unmount;
+	gboolean show_eject;
+	gboolean show_connect;
+	gboolean show_format;
+
+	g_assert (FM_IS_DIRECTORY_VIEW (view));
+	g_assert (NAUTILUS_IS_FILE (view->details->location_popup_directory_as_file));
+
+	file = NAUTILUS_FILE (view->details->location_popup_directory_as_file);
+	file_should_show_foreach (file,
+				  &show_mount,
+				  &show_unmount,
+				  &show_eject,
+				  &show_connect,
+				  &show_format);
+
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_MOUNT_VOLUME);
+	gtk_action_set_visible (action, show_mount);
+
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_UNMOUNT_VOLUME);
+	gtk_action_set_visible (action, show_unmount);
+
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_EJECT_VOLUME);
+	gtk_action_set_visible (action, show_eject);
+
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_FORMAT_VOLUME);
+	gtk_action_set_visible (action, show_format);
+}
+
+static void
 real_update_paste_menu (FMDirectoryView *view,
 			GList *selection,
 			gint selection_count)
@@ -7003,7 +7172,12 @@
 					      FM_ACTION_LOCATION_OPEN_FOLDER_WINDOW);
 	gtk_action_set_visible (action, show_open_folder_window);
 
-	file = view->details->directory_as_file;
+	file = view->details->location_popup_directory_as_file;
+	g_assert (NAUTILUS_IS_FILE (file));
+	g_assert (nautilus_file_check_if_ready (file, NAUTILUS_FILE_ATTRIBUTE_INFO |
+						      NAUTILUS_FILE_ATTRIBUTE_MOUNT |
+						      NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO));
+
 	is_special_link = NAUTILUS_IS_DESKTOP_ICON_FILE (file);
 	is_desktop_or_home_dir = nautilus_file_is_home (file)
 		|| nautilus_file_is_desktop_directory (file);
@@ -7043,8 +7217,10 @@
 		gtk_action_set_sensitive (action, can_delete_file);
 	}
 
+	real_update_location_menu_volumes (view);
+
 	/* we silently assume that fm_directory_view_supports_properties always returns the same value.
-	 * Therefore, we don't update the sensitivity of FM_ACTION_SELF_PROPERTIES */
+	 * Therefore, we don't update the sensitivity of FM_ACTION_LOCATION_PROPERTIES */
 }
 
 static void
@@ -7412,6 +7588,7 @@
 
 	update_context_menu_position_from_event (view, event);
 
+
 	eel_pop_up_context_menu (create_popup_menu 
 				      (view, FM_DIRECTORY_VIEW_POPUP_PATH_BACKGROUND),
 				      EEL_DEFAULT_POPUP_MENU_DISPLACEMENT,
@@ -7419,30 +7596,108 @@
 				      event);
 }
 
+static void
+real_pop_up_location_context_menu (FMDirectoryView *view)
+{
+	/* always update the menu before showing it. Shouldn't be too expensive. */
+	real_update_location_menu (view);
+
+	update_context_menu_position_from_event (view, view->details->location_popup_event);
+
+	eel_pop_up_context_menu (create_popup_menu 
+				      (view, FM_DIRECTORY_VIEW_POPUP_PATH_LOCATION),
+				      EEL_DEFAULT_POPUP_MENU_DISPLACEMENT,
+				      EEL_DEFAULT_POPUP_MENU_DISPLACEMENT,
+				      view->details->location_popup_event);
+}
+
+static void
+location_popup_file_attributes_ready (NautilusFile *file,
+				      gpointer      data)
+{
+	FMDirectoryView *view;
+
+	view = FM_DIRECTORY_VIEW (data);
+	g_assert (FM_IS_DIRECTORY_VIEW (view));
+
+	g_assert (file == view->details->location_popup_directory_as_file);
+
+	real_pop_up_location_context_menu (view);
+}
+
+static void
+unschedule_pop_up_location_context_menu (FMDirectoryView *view)
+{
+	if (view->details->location_popup_directory_as_file != NULL) {
+		g_assert (NAUTILUS_IS_FILE (view->details->location_popup_directory_as_file));
+		nautilus_file_cancel_call_when_ready (view->details->location_popup_directory_as_file,
+						      location_popup_file_attributes_ready,
+						      view);
+		nautilus_file_unref (view->details->location_popup_directory_as_file);
+		view->details->location_popup_directory_as_file = NULL;
+	}
+}
+
+static void
+schedule_pop_up_location_context_menu (FMDirectoryView *view,
+				       GdkEventButton  *event,
+				       NautilusFile    *file)
+{
+	g_assert (NAUTILUS_IS_FILE (file));
+
+	if (view->details->location_popup_event != NULL) {
+		gdk_event_free ((GdkEvent *) view->details->location_popup_event);
+	}
+	view->details->location_popup_event = (GdkEventButton *) gdk_event_copy ((GdkEvent *)event);
+
+	if (file == view->details->location_popup_directory_as_file) {
+		if (nautilus_file_check_if_ready (file, NAUTILUS_FILE_ATTRIBUTE_INFO |
+							NAUTILUS_FILE_ATTRIBUTE_MOUNT |
+							NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO)) {
+			real_pop_up_location_context_menu (view);
+		}
+	} else {
+		unschedule_pop_up_location_context_menu (view);
+
+		view->details->location_popup_directory_as_file = nautilus_file_ref (file);
+		nautilus_file_call_when_ready (view->details->location_popup_directory_as_file,
+					       NAUTILUS_FILE_ATTRIBUTE_INFO |
+					       NAUTILUS_FILE_ATTRIBUTE_MOUNT |
+					       NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO,
+					       location_popup_file_attributes_ready,
+					       view);
+	}
+}
+
 /**
  * fm_directory_view_pop_up_location_context_menu
  *
  * Pop up a context menu appropriate to the view globally.
  * @view: FMDirectoryView of interest.
  * @event: GdkEventButton triggering the popup.
+ * @location: The location the popup-menu should be created for,
+ * or NULL for the currently displayed location.
  *
  **/
 void 
 fm_directory_view_pop_up_location_context_menu (FMDirectoryView *view, 
-						GdkEventButton  *event)
+						GdkEventButton  *event,
+						const char      *location)
 {
-	g_assert (FM_IS_DIRECTORY_VIEW (view));
+	NautilusFile *file;
 
-	/* always update the menu before showing it. Shouldn't be too expensive. */
-	real_update_location_menu (view);
+	g_assert (FM_IS_DIRECTORY_VIEW (view));
 
-	update_context_menu_position_from_event (view, event);
+	if (location != NULL) {
+		file = nautilus_file_get_by_uri (location);
+	} else {
+		file = nautilus_file_ref (view->details->directory_as_file);
+	}
 
-	eel_pop_up_context_menu (create_popup_menu 
-				      (view, FM_DIRECTORY_VIEW_POPUP_PATH_LOCATION),
-				      EEL_DEFAULT_POPUP_MENU_DISPLACEMENT,
-				      EEL_DEFAULT_POPUP_MENU_DISPLACEMENT,
-				      event);
+	if (file != NULL) {
+		schedule_pop_up_location_context_menu (view, event, file);
+		nautilus_file_unref (file);
+	}
 }
 
 static void
@@ -7629,7 +7884,8 @@
          * change the directory's file metadata.
 	 */
 	attributes = 
-		NAUTILUS_FILE_ATTRIBUTE_METADATA |
+		NAUTILUS_FILE_ATTRIBUTE_INFO |
+		NAUTILUS_FILE_ATTRIBUTE_MOUNT |
 		NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO;
 	view->details->metadata_for_directory_as_file_pending = TRUE;
 	view->details->metadata_for_files_in_directory_pending = TRUE;

Modified: trunk/src/file-manager/fm-directory-view.h
==============================================================================
--- trunk/src/file-manager/fm-directory-view.h	(original)
+++ trunk/src/file-manager/fm-directory-view.h	Tue May 13 10:48:12 2008
@@ -414,7 +414,8 @@
 void                fm_directory_view_pop_up_selection_context_menu    (FMDirectoryView  *view,
 									GdkEventButton   *event); 
 void                fm_directory_view_pop_up_location_context_menu     (FMDirectoryView  *view,
-									GdkEventButton   *event); 
+									GdkEventButton   *event,
+									const char       *location); 
 void                fm_directory_view_send_selection_change            (FMDirectoryView *view);
 gboolean            fm_directory_view_should_show_file                 (FMDirectoryView  *view,
 									NautilusFile     *file);

Modified: trunk/src/file-manager/nautilus-directory-view-ui.xml
==============================================================================
--- trunk/src/file-manager/nautilus-directory-view-ui.xml	(original)
+++ trunk/src/file-manager/nautilus-directory-view-ui.xml	Tue May 13 10:48:12 2008
@@ -171,23 +171,22 @@
 		<menuitem name="LocationOpenAlternate" action="LocationOpenAlternate"/>
 		<menuitem name="LocationOpenFolderWindow" action="LocationOpenFolderWindow"/>
 	</placeholder>
-	<separator/>
+	<separator name="Location After Open Separator"/>
 	<placeholder name="Clipboard Actions">
 		<menuitem name="Cut" action="LocationCut"/>
 		<menuitem name="Copy" action="LocationCopy"/>
 	</placeholder>
-	<separator/>
+	<separator name="Location After Clipboard Separator"/>
 	<placeholder name="Dangerous File Actions">
 		<menuitem name="Trash" action="LocationTrash"/>
 		<menuitem name="Delete" action="LocationDelete"/>
 	</placeholder>
-	<separator/>
-
-	<menuitem name="Self Mount Volume" action="Self Mount Volume"/>
-	<menuitem name="Self Unmount Volume" action="Self Unmount Volume"/>
-	<menuitem name="Self Eject Volume" action="Self Eject Volume"/>
-	<menuitem name="Self Format Volume" action="Self Format Volume"/>
+	<separator name="Location After Dangerous Separator"/>
+	<menuitem name="Location Mount Volume" action="Location Mount Volume"/>
+	<menuitem name="Location Unmount Volume" action="Location Unmount Volume"/>
+	<menuitem name="Location Eject Volume" action="Location Eject Volume"/>
+	<menuitem name="Location Format Volume" action="Location Format Volume"/>
 	<separator name="Properties Separator"/>
-	<menuitem name="Properties" action="SelfProperties"/>
+	<menuitem name="LocationProperties" action="LocationProperties"/>
 </popup>
 </ui>

Modified: trunk/src/nautilus-location-bar.c
==============================================================================
--- trunk/src/nautilus-location-bar.c	(original)
+++ trunk/src/nautilus-location-bar.c	Tue May 13 10:48:12 2008
@@ -276,7 +276,7 @@
 		return FALSE;
 	}
 
-	nautilus_view_pop_up_location_context_menu (view, event);
+	nautilus_view_pop_up_location_context_menu (view, event, NULL);
 
 	return FALSE;
 }

Modified: trunk/src/nautilus-navigation-window.c
==============================================================================
--- trunk/src/nautilus-navigation-window.c	(original)
+++ trunk/src/nautilus-navigation-window.c	Tue May 13 10:48:12 2008
@@ -116,6 +116,9 @@
 static void path_bar_location_changed_callback       (GtkWidget                *widget,
 						      GFile                    *path,
 						      NautilusNavigationWindow *window);
+static void path_bar_path_set_callback               (GtkWidget                *widget,
+						      GFile                    *location,
+						      NautilusNavigationWindow *window);
 static void always_use_location_entry_changed        (gpointer                  callback_data);
 static void always_use_browser_changed               (gpointer                  callback_data);
 
@@ -274,6 +277,8 @@
 	
 	g_signal_connect_object (window->path_bar, "path_clicked",
 				 G_CALLBACK (path_bar_location_changed_callback), window, 0);
+	g_signal_connect_object (window->path_bar, "path_set",
+				 G_CALLBACK (path_bar_path_set_callback), window, 0);
 	
 	gtk_box_pack_start (GTK_BOX (hbox),
 			    window->path_bar,
@@ -1027,6 +1032,66 @@
 	}
 }
 
+static gboolean
+path_bar_button_pressed_callback (GtkWidget *widget,
+				  GdkEventButton *event,
+				  NautilusNavigationWindow *window)
+{
+	NautilusView *view;
+	GFile *location;
+	char *uri;
+
+	if (event->button == 3) {
+		view = NAUTILUS_WINDOW (window)->content_view;
+		if (view != NULL) {
+			location = nautilus_path_bar_get_path_for_button (
+				NAUTILUS_PATH_BAR (window->path_bar), widget);
+			if (location != NULL) {
+				uri = g_file_get_uri (location);
+				nautilus_view_pop_up_location_context_menu (
+					view, event, uri);
+				g_object_unref (G_OBJECT (location));
+				g_free (uri);
+				return TRUE;
+			}
+		}
+	}
+
+
+	return FALSE;
+}
+
+static void
+path_bar_path_set_callback (GtkWidget *widget,
+			    GFile *location,
+			    NautilusNavigationWindow *window)
+{
+	GList *children, *l;
+	GtkWidget *child;
+
+	children = gtk_container_get_children (GTK_CONTAINER (widget));
+
+	for (l = children; l != NULL; l = l->next) {
+		child = GTK_WIDGET (l->data);
+
+		if (!GTK_IS_TOGGLE_BUTTON (child)) {
+			continue;
+		}
+
+		if (!g_signal_handler_find (child,
+					    G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
+					    0, 0, NULL, 
+					    path_bar_button_pressed_callback,
+					    window)) {
+			g_signal_connect (child, "button-press-event",
+					  G_CALLBACK (path_bar_button_pressed_callback),
+					  window);
+		}
+	}
+
+	g_list_free (children);
+}
+
 static void
 real_set_throbber_active (NautilusWindow *window, gboolean active)
 {

Modified: trunk/src/nautilus-pathbar.c
==============================================================================
--- trunk/src/nautilus-pathbar.c	(original)
+++ trunk/src/nautilus-pathbar.c	Tue May 13 10:48:12 2008
@@ -43,6 +43,7 @@
 
 enum {
         PATH_CLICKED,
+        PATH_SET,
         LAST_SIGNAL
 };
 
@@ -299,6 +300,15 @@
 		  g_cclosure_marshal_VOID__OBJECT,
 		  G_TYPE_NONE, 1,
 		  G_TYPE_FILE);
+	 path_bar_signals [PATH_SET] =
+		g_signal_new ("path-set",
+		  G_OBJECT_CLASS_TYPE (object_class),
+		  G_SIGNAL_RUN_FIRST,
+		  G_STRUCT_OFFSET (NautilusPathBarClass, path_set),
+		  NULL, NULL,
+		  g_cclosure_marshal_VOID__OBJECT,
+		  G_TYPE_NONE, 1,
+		  G_TYPE_FILE);
 }
 
 
@@ -1535,6 +1545,8 @@
 
         gtk_widget_pop_composite_child ();
 
+	g_signal_emit (path_bar, path_bar_signals [PATH_SET], 0, file_path);
+
         return result;
 }
 
@@ -1553,7 +1565,25 @@
 	return nautilus_path_bar_update_path (path_bar, file_path);
 }
 
+GFile *
+nautilus_path_bar_get_path_for_button (NautilusPathBar *path_bar,
+				       GtkWidget       *button)
+{
+	GList *list;
+ 
+	g_return_val_if_fail (NAUTILUS_IS_PATH_BAR (path_bar), NULL);
+	g_return_val_if_fail (GTK_IS_BUTTON (button), NULL);
+
+	for (list = path_bar->button_list; list; list = list->next) {
+		ButtonData *button_data;
+		button_data = BUTTON_DATA (list->data);
+		if (button_data->button == button) {
+			return g_object_ref (button_data->path);
+		}
+	}
 
+	return NULL;
+}
 
 /**
  * _nautilus_path_bar_up:

Modified: trunk/src/nautilus-pathbar.h
==============================================================================
--- trunk/src/nautilus-pathbar.h	(original)
+++ trunk/src/nautilus-pathbar.h	Tue May 13 10:48:12 2008
@@ -69,11 +69,15 @@
 
   	void (* path_clicked)   (NautilusPathBar  *path_bar,
 				 GFile             *location);
+  	void (* path_set)       (NautilusPathBar  *path_bar,
+				 GFile             *location);
 };
 
 GType    nautilus_path_bar_get_type (void) G_GNUC_CONST;
 
 gboolean nautilus_path_bar_set_path    (NautilusPathBar *path_bar, GFile *file);
+GFile *  nautilus_path_bar_get_path_for_button (NautilusPathBar *path_bar,
+						GtkWidget       *button);
 void     nautilus_path_bar_clear_buttons (NautilusPathBar *path_bar);
 
 void     nautilus_path_bar_up              (NautilusPathBar *path_bar);

Modified: trunk/src/nautilus-spatial-window.c
==============================================================================
--- trunk/src/nautilus-spatial-window.c	(original)
+++ trunk/src/nautilus-spatial-window.c	Tue May 13 10:48:12 2008
@@ -616,7 +616,7 @@
 {
 	if (event->button == 3 &&
 	    window->content_view != NULL) {
-		nautilus_view_pop_up_location_context_menu (window->content_view, event);
+		nautilus_view_pop_up_location_context_menu (window->content_view, event, NULL);
 	}
 
 	return FALSE;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]