[nautilus] Make it possible for Nautilus Scripts to access the other pane.



commit 5d236a20aadd291196e6ead3a2220e9c0258b126
Author: Holger Berndt <berndth gmx de>
Date:   Sat Jun 13 16:27:12 2009 +0200

    Make it possible for Nautilus Scripts to access the other pane.
    
    This is accomplished by placing additional variables into the
    environment of the script, analoguous to the single-pane ones:
     - NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS
     - NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_URIS
     - NAUTILUS_SCRIPT_NEXT_PANE_CURRENT_URI
    
    If there is no second pane in the window, these are set to empty
    strings.

 libnautilus-private/nautilus-window-info.c |    7 +++
 libnautilus-private/nautilus-window-info.h |    2 +
 src/file-manager/fm-directory-view.c       |   80 +++++++++++++++++++++------
 src/nautilus-window.c                      |   17 ++++++
 4 files changed, 88 insertions(+), 18 deletions(-)
---
diff --git a/libnautilus-private/nautilus-window-info.c b/libnautilus-private/nautilus-window-info.c
index 224033b..787e398 100644
--- a/libnautilus-private/nautilus-window-info.c
+++ b/libnautilus-private/nautilus-window-info.c
@@ -285,3 +285,10 @@ nautilus_window_info_get_active_slot (NautilusWindowInfo *window)
 	return (* NAUTILUS_WINDOW_INFO_GET_IFACE (window)->get_active_slot) (window);
 }
 
+struct FMDirectoryView *
+nautilus_window_info_get_directory_view_of_next_pane (NautilusWindowInfo *window)
+{
+	g_return_val_if_fail (NAUTILUS_IS_WINDOW_INFO (window), NULL);
+
+	return (* NAUTILUS_WINDOW_INFO_GET_IFACE (window)->get_directory_view_of_next_pane) (window);	
+}
diff --git a/libnautilus-private/nautilus-window-info.h b/libnautilus-private/nautilus-window-info.h
index cb61673..63a7325 100644
--- a/libnautilus-private/nautilus-window-info.h
+++ b/libnautilus-private/nautilus-window-info.h
@@ -146,6 +146,7 @@ struct _NautilusWindowInfoIface
 	gboolean (* next_pane_is_writable) (NautilusWindowInfo *window);
 	void (* copy_move_selection_to_next_pane) (NautilusWindowInfo *window,
 						   gboolean want_copy);
+	struct FMDirectoryView * (* get_directory_view_of_next_pane) (NautilusWindowInfo *window);
 };
 
 GType                             nautilus_window_info_get_type                 (void);
@@ -175,6 +176,7 @@ GtkUIManager *                    nautilus_window_info_get_ui_manager
 gboolean                          nautilus_window_info_next_pane_is_writable    (NautilusWindowInfo                *window);
 void                              nautilus_window_info_copy_move_selection_to_next_pane (NautilusWindowInfo        *window,
 										 gboolean                   want_copy);
+struct FMDirectoryView *         nautilus_window_info_get_directory_view_of_next_pane (NautilusWindowInfo         *window);
 
 G_END_DECLS
 
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index 408be6c..1192474 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -5013,17 +5013,11 @@ get_file_uris_as_newline_delimited_string (GList *selection)
 	return get_file_paths_or_uris_as_newline_delimited_string (selection, FALSE);
 }
 
-/*
- * Set up some environment variables that scripts can use
- * to take advantage of the current Nautilus state.
- */
+/* returns newly allocated strings for setting the environment variables */
 static void
-set_script_environment_variables (FMDirectoryView *view, GList *selected_files)
+get_strings_for_environment_variables (FMDirectoryView *view, GList *selected_files,
+				       char **file_paths, char **uris, char **uri)
 {
-	char *file_paths;
-	char *uris;
-	char *uri;
-	char *geometry_string;
 	char *directory_uri;
 
 	/* We need to check that the directory uri starts with "file:" since
@@ -5033,24 +5027,43 @@ set_script_environment_variables (FMDirectoryView *view, GList *selected_files)
 	if (eel_str_has_prefix (directory_uri, "file:") ||
 	    eel_uri_is_desktop (directory_uri) ||
 	    eel_uri_is_trash (directory_uri)) {
-		file_paths = get_file_paths_as_newline_delimited_string (selected_files);
+		*file_paths = get_file_paths_as_newline_delimited_string (selected_files);
 	} else {
-		file_paths = g_strdup ("");
+		*file_paths = g_strdup ("");
 	}
 	g_free (directory_uri);
+
+	*uris = get_file_uris_as_newline_delimited_string (selected_files);
+
+	*uri = nautilus_directory_get_uri (view->details->model);
+	if (eel_uri_is_desktop (*uri)) {
+		g_free (*uri);
+		*uri = nautilus_get_desktop_directory_uri ();
+	}
+}
+
+/*
+ * Set up some environment variables that scripts can use
+ * to take advantage of the current Nautilus state.
+ */
+static void
+set_script_environment_variables (FMDirectoryView *view, GList *selected_files)
+{
+	char *file_paths;
+	char *uris;
+	char *uri;
+	char *geometry_string;
+	FMDirectoryView *next_view;
+
+	get_strings_for_environment_variables (view, selected_files,
+					       &file_paths, &uris, &uri);
 	
 	g_setenv ("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS", file_paths, TRUE);
 	g_free (file_paths);
 
-	uris = get_file_uris_as_newline_delimited_string (selected_files);
 	g_setenv ("NAUTILUS_SCRIPT_SELECTED_URIS", uris, TRUE);
 	g_free (uris);
 
-	uri = nautilus_directory_get_uri (view->details->model);
-	if (eel_uri_is_desktop (uri)) {
-		g_free (uri);
-		uri = nautilus_get_desktop_directory_uri ();
-	}
 	g_setenv ("NAUTILUS_SCRIPT_CURRENT_URI", uri, TRUE);
 	g_free (uri);
 
@@ -5058,6 +5071,31 @@ set_script_environment_variables (FMDirectoryView *view, GList *selected_files)
 		(GTK_WINDOW (fm_directory_view_get_containing_window (view)));
 	g_setenv ("NAUTILUS_SCRIPT_WINDOW_GEOMETRY", geometry_string, TRUE);
 	g_free (geometry_string);
+    
+    /* next pane */
+    next_view = nautilus_window_info_get_directory_view_of_next_pane (fm_directory_view_get_nautilus_window (view));
+    if (next_view) {
+		GList *next_pane_selected_files;
+		next_pane_selected_files = fm_directory_view_get_selection (next_view);
+
+		get_strings_for_environment_variables (next_view, next_pane_selected_files,
+						       &file_paths, &uris, &uri);
+		nautilus_file_list_free (next_pane_selected_files);
+    }
+    else {
+		file_paths = g_strdup("");
+		uris = g_strdup("");
+		uri = g_strdup("");        
+    }
+    
+	g_setenv ("NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS", file_paths, TRUE);
+	g_free (file_paths);
+	
+	g_setenv ("NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_URIS", uris, TRUE);
+	g_free (uris);
+	
+	g_setenv ("NAUTILUS_SCRIPT_NEXT_PANE_CURRENT_URI", uri, TRUE);
+	g_free (uri);    
 }
 
 /* Unset all the special script environment variables. */
@@ -5068,6 +5106,9 @@ unset_script_environment_variables (void)
 	g_unsetenv ("NAUTILUS_SCRIPT_SELECTED_URIS");
 	g_unsetenv ("NAUTILUS_SCRIPT_CURRENT_URI");
 	g_unsetenv ("NAUTILUS_SCRIPT_WINDOW_GEOMETRY");
+	g_unsetenv ("NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS");
+	g_unsetenv ("NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_URIS");
+	g_unsetenv ("NAUTILUS_SCRIPT_NEXT_PANE_CURRENT_URI");
 }
 
 static void
@@ -5658,7 +5699,10 @@ action_open_scripts_folder_callback (GtkAction *action,
 		   "NAUTILUS_SCRIPT_SELECTED_FILE_PATHS: newline-delimited paths for selected files (only if local)\n\n"
 		   "NAUTILUS_SCRIPT_SELECTED_URIS: newline-delimited URIs for selected files\n\n"
 		   "NAUTILUS_SCRIPT_CURRENT_URI: URI for current location\n\n"
-		   "NAUTILUS_SCRIPT_WINDOW_GEOMETRY: position and size of current window"),
+		   "NAUTILUS_SCRIPT_WINDOW_GEOMETRY: position and size of current window\n\n"
+		   "NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS: newline-delimited paths for selected files in the inactive pane of a split-view window (only if local)\n\n"
+		   "NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_URIS: newline-delimited URIs for selected files in the inactive pane of a split-view window\n\n"
+		   "NAUTILUS_SCRIPT_NEXT_PANE_CURRENT_URI: URI for current location in the inactive pane of a split-view window"),
 		 fm_directory_view_get_containing_window (view));
 }
 
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 7bc6fa4..4407e6f 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -1906,6 +1906,22 @@ nautilus_window_get_active_slot (NautilusWindow *window)
 	return window->details->active_pane->active_slot;
 }
 
+static FMDirectoryView *
+nautilus_window_get_directory_view_of_next_pane (NautilusWindow *window)
+{
+	NautilusWindowPane *next_pane;
+	g_assert (NAUTILUS_IS_WINDOW (window));
+	
+	next_pane = nautilus_window_get_next_pane (window);
+	
+	if (next_pane && FM_IS_DIRECTORY_VIEW (next_pane->active_slot->content_view)) {
+		return FM_DIRECTORY_VIEW (next_pane->active_slot->content_view);
+	}
+	else {
+		return NULL;
+	}
+}
+
 GList *
 nautilus_window_get_slots (NautilusWindow *window)
 {
@@ -1944,6 +1960,7 @@ nautilus_window_info_iface_init (NautilusWindowInfoIface *iface)
 	iface->get_hidden_files_mode = nautilus_window_get_hidden_files_mode;
 	iface->set_hidden_files_mode = nautilus_window_set_hidden_files_mode;
 	iface->get_active_slot = nautilus_window_get_active_slot;
+	iface->get_directory_view_of_next_pane = nautilus_window_get_directory_view_of_next_pane;
 }
 
 static void



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