summaryrefslogtreecommitdiff
path: root/libnautilus-private
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2006-06-16 14:19:55 +0000
committerAlexander Larsson <alexl@src.gnome.org>2006-06-16 14:19:55 +0000
commit71b1be1b0b357d280bb9ad536129c154cdac4ca0 (patch)
tree670be0899b5ebe4c9852f9d1a416f83846e6b629 /libnautilus-private
parent7f6e6cb7b6cd0ca4e73218479a626cd4b5355dc8 (diff)
downloadnautilus-71b1be1b0b357d280bb9ad536129c154cdac4ca0.tar.gz
Add show_advanced_permissions setting Remove show_special_flags setting,
2006-06-16 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-global-preferences.[ch]: * libnautilus-private/apps_nautilus_preferences.schemas.in: Add show_advanced_permissions setting Remove show_special_flags setting, its always on in advanced mode. * libnautilus-private/nautilus-file-operations.[ch]: Add nautilus_file_set_permissions_recursive * src/file-manager/fm-properties-window.c: Change permission page. Implement both simple and advanced mode. Add recursive permissions setting. HIGify some spacing.
Diffstat (limited to 'libnautilus-private')
-rw-r--r--libnautilus-private/apps_nautilus_preferences.schemas.in15
-rw-r--r--libnautilus-private/nautilus-file-operations.c233
-rw-r--r--libnautilus-private/nautilus-file-operations.h8
-rw-r--r--libnautilus-private/nautilus-global-preferences.c4
-rw-r--r--libnautilus-private/nautilus-global-preferences.h2
5 files changed, 252 insertions, 10 deletions
diff --git a/libnautilus-private/apps_nautilus_preferences.schemas.in b/libnautilus-private/apps_nautilus_preferences.schemas.in
index 158942d21..aae44bd4b 100644
--- a/libnautilus-private/apps_nautilus_preferences.schemas.in
+++ b/libnautilus-private/apps_nautilus_preferences.schemas.in
@@ -259,20 +259,21 @@
</schema>
<schema>
- <key>/schemas/apps/nautilus/preferences/show_special_flags</key>
- <applyto>/apps/nautilus/preferences/show_special_flags</applyto>
+ <key>/schemas/apps/nautilus/preferences/show_advanced_permissions</key>
+ <applyto>/apps/nautilus/preferences/show_advanced_permissions</applyto>
<owner>nautilus</owner>
<type>bool</type>
- <default>true</default>
+ <default>false</default>
<locale name="C">
- <short>Enable 'special' flags in file preferences dialog</short>
+ <short>Show advanced permissions in in the file property dialog</short>
<long>
- If set to true, then Nautilus lets you edit some of the more
- esoteric options of a file in the file preferences dialog.
+ If set to true, then Nautilus lets you edit and display file
+ permissions in a more unix-like way, accessing some more
+ esoteric options.
</long>
</locale>
</schema>
-
+
<schema>
<key>/schemas/apps/nautilus/preferences/sort_directories_first</key>
<applyto>/apps/nautilus/preferences/sort_directories_first</applyto>
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index 9fc8e7497..a1e79dd54 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -2868,6 +2868,239 @@ nautilus_file_operations_empty_trash (GtkWidget *parent_view)
}
}
+struct RecursivePermissionsInfo {
+ GnomeVFSAsyncHandle *handle;
+ GnomeVFSURI *current_dir;
+ GnomeVFSURI *current_file;
+ GList *files;
+ GList *directories;
+ GnomeVFSFilePermissions file_permissions;
+ GnomeVFSFilePermissions file_mask;
+ GnomeVFSFilePermissions dir_permissions;
+ GnomeVFSFilePermissions dir_mask;
+ NautilusSetPermissionsCallback callback;
+ gpointer callback_data;
+};
+
+struct FileInfo {
+ char *name;
+ GnomeVFSFilePermissions permissions;
+};
+
+struct DirInfo {
+ GnomeVFSURI *uri;
+ GnomeVFSFilePermissions permissions;
+};
+
+static void set_permissions_run (struct RecursivePermissionsInfo *info);
+
+static void
+set_permissions_set_file_info (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ GnomeVFSFileInfo *old_file_info,
+ gpointer callback_data)
+{
+ struct RecursivePermissionsInfo *info;
+ GnomeVFSFileInfo *vfs_info;
+ GnomeVFSURI *uri;
+ char *uri_str;
+ struct FileInfo *file_info;
+
+ info = callback_data;
+
+ if (result == GNOME_VFS_OK && info->current_file != NULL) {
+ uri_str = gnome_vfs_uri_to_string (info->current_file, GNOME_VFS_URI_HIDE_NONE);
+ nautilus_file_changes_queue_file_changed (uri_str);
+ g_free (uri_str);
+ }
+
+ if (info->current_file) {
+ gnome_vfs_uri_unref (info->current_file);
+ }
+ if (info->files == NULL) {
+ /* No more files, process more dirs */
+ set_permissions_run (info);
+ return;
+ }
+
+ file_info = info->files->data;
+ info->files = g_list_delete_link (info->files, info->files);
+
+ uri = gnome_vfs_uri_append_file_name (info->current_dir,
+ file_info->name);
+ info->current_file = uri;
+
+ vfs_info = gnome_vfs_file_info_new ();
+ vfs_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
+ vfs_info->permissions =
+ (file_info->permissions & ~info->file_mask) |
+ info->file_permissions;
+
+ gnome_vfs_async_set_file_info (&info->handle, uri, vfs_info,
+ GNOME_VFS_SET_FILE_INFO_PERMISSIONS,
+ GNOME_VFS_FILE_INFO_DEFAULT,
+ GNOME_VFS_PRIORITY_DEFAULT,
+ set_permissions_set_file_info,
+ info);
+
+ gnome_vfs_file_info_unref (vfs_info);
+ g_free (file_info->name);
+ g_free (file_info);
+
+}
+
+static void
+set_permissions_got_files (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ GList *list,
+ guint entries_read,
+ gpointer callback_data)
+{
+ struct RecursivePermissionsInfo *info;
+ GnomeVFSFileInfo *vfs_info;
+ GList *l;
+
+ info = callback_data;
+
+ if (result == GNOME_VFS_OK || result == GNOME_VFS_ERROR_EOF) {
+ for (l = list; l != NULL; l = l->next) {
+ vfs_info = l->data;
+
+ if (strcmp (vfs_info->name, ".") == 0 ||
+ strcmp (vfs_info->name, "..") == 0 ||
+ !(vfs_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)) {
+ continue;
+ }
+
+ if (vfs_info->type == GNOME_VFS_FILE_TYPE_DIRECTORY) {
+ struct DirInfo *dir_info;
+
+ dir_info = g_new (struct DirInfo, 1);
+ dir_info->uri = gnome_vfs_uri_append_file_name (info->current_dir,
+ vfs_info->name);
+ dir_info->permissions = vfs_info->permissions;
+ info->directories = g_list_prepend (info->directories,
+ dir_info);
+ } else {
+ struct FileInfo *file_info;
+ file_info = g_new (struct FileInfo, 1);
+ file_info->name = g_strdup (vfs_info->name);
+ file_info->permissions = vfs_info->permissions;
+ info->files = g_list_prepend (info->files, file_info);
+ }
+ }
+ }
+
+
+ if (result != GNOME_VFS_OK) {
+ /* Finished with this dir, work on the files */
+ info->current_file = NULL;
+ set_permissions_set_file_info (NULL, GNOME_VFS_OK, NULL, info);
+ }
+
+}
+
+/* Also called for the toplevel dir */
+static void
+set_permissions_load_dir (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ GnomeVFSFileInfo *file_info,
+ gpointer callback_data)
+{
+ struct RecursivePermissionsInfo *info;
+ char *uri_str;
+
+ info = callback_data;
+
+ if (result == GNOME_VFS_OK && handle != NULL) {
+ uri_str = gnome_vfs_uri_to_string (info->current_dir, GNOME_VFS_URI_HIDE_NONE);
+ nautilus_file_changes_queue_file_changed (uri_str);
+ g_free (uri_str);
+ }
+
+ gnome_vfs_async_load_directory_uri (&info->handle,
+ info->current_dir,
+ GNOME_VFS_FILE_INFO_DEFAULT,
+ 50,
+ GNOME_VFS_PRIORITY_DEFAULT,
+ set_permissions_got_files,
+ info);
+}
+
+static void
+set_permissions_run (struct RecursivePermissionsInfo *info)
+{
+ struct DirInfo *dir_info;
+ GnomeVFSFileInfo *vfs_info;
+
+ gnome_vfs_uri_unref (info->current_dir);
+
+ if (info->directories == NULL) {
+ /* No more directories, finished! */
+ info->callback (info->callback_data);
+ /* All parts of info should be freed now */
+ g_free (info);
+ return;
+ }
+
+ dir_info = info->directories->data;
+ info->directories = g_list_delete_link (info->directories, info->directories);
+
+ info->current_dir = dir_info->uri;
+
+ vfs_info = gnome_vfs_file_info_new ();
+ vfs_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
+ vfs_info->permissions =
+ (dir_info->permissions & ~info->dir_mask) |
+ info->dir_permissions;
+
+ gnome_vfs_async_set_file_info (&info->handle,
+ info->current_dir,
+ vfs_info,
+ GNOME_VFS_SET_FILE_INFO_PERMISSIONS,
+ GNOME_VFS_FILE_INFO_DEFAULT,
+ GNOME_VFS_PRIORITY_DEFAULT,
+ set_permissions_load_dir,
+ info);
+
+ gnome_vfs_file_info_unref (vfs_info);
+ g_free (dir_info);
+}
+
+void
+nautilus_file_set_permissions_recursive (const char *directory,
+ GnomeVFSFilePermissions file_permissions,
+ GnomeVFSFilePermissions file_mask,
+ GnomeVFSFilePermissions dir_permissions,
+ GnomeVFSFilePermissions dir_mask,
+ NautilusSetPermissionsCallback callback,
+ gpointer callback_data)
+{
+ struct RecursivePermissionsInfo *info;
+
+ info = g_new (struct RecursivePermissionsInfo, 1);
+
+ info->files = NULL;
+ info->directories = NULL;
+ info->file_permissions = file_permissions;
+ info->file_mask = file_mask;
+ info->dir_permissions = dir_permissions;
+ info->dir_mask = dir_mask;
+ info->callback = callback;
+ info->callback_data = callback_data;
+
+ info->current_dir = gnome_vfs_uri_new (directory);
+
+ if (info->current_dir == NULL) {
+ info->callback (info->callback_data);
+ g_free (info);
+ return;
+ }
+
+ set_permissions_load_dir (NULL, GNOME_VFS_OK, NULL, info);
+}
+
+
#if !defined (NAUTILUS_OMIT_SELF_CHECK)
void
diff --git a/libnautilus-private/nautilus-file-operations.h b/libnautilus-private/nautilus-file-operations.h
index 23ffbe92d..82afcc242 100644
--- a/libnautilus-private/nautilus-file-operations.h
+++ b/libnautilus-private/nautilus-file-operations.h
@@ -37,6 +37,7 @@ typedef void (* NautilusNewFolderCallback) (const char *new_folder_uri,
gpointer callback_data);
typedef void (* NautilusNewFileCallback) (const char *new_file_uri,
gpointer callback_data);
+typedef void (* NautilusSetPermissionsCallback) (gpointer callback_data);
/* FIXME: int copy_action should be an enum */
@@ -70,5 +71,12 @@ void nautilus_file_operations_new_file_from_template (GtkWidget *p
void nautilus_file_operations_delete (const GList *item_uris,
GtkWidget *parent_view);
+void nautilus_file_set_permissions_recursive (const char *directory,
+ GnomeVFSFilePermissions file_permissions,
+ GnomeVFSFilePermissions file_mask,
+ GnomeVFSFilePermissions folder_permissions,
+ GnomeVFSFilePermissions folder_mask,
+ NautilusSetPermissionsCallback callback,
+ gpointer callback_data);
#endif /* NAUTILUS_FILE_OPERATIONS_H */
diff --git a/libnautilus-private/nautilus-global-preferences.c b/libnautilus-private/nautilus-global-preferences.c
index 4baf35bb2..53578c64f 100644
--- a/libnautilus-private/nautilus-global-preferences.c
+++ b/libnautilus-private/nautilus-global-preferences.c
@@ -323,9 +323,9 @@ static const PreferenceDefault preference_defaults[] = {
NULL, NULL,
"speed_tradeoff"
},
- { NAUTILUS_PREFERENCES_SHOW_SPECIAL_FLAGS,
+ { NAUTILUS_PREFERENCES_SHOW_ADVANCED_PERMISSIONS,
PREFERENCE_BOOLEAN,
- GINT_TO_POINTER (TRUE)
+ GINT_TO_POINTER (FALSE)
},
{ NAUTILUS_PREFERENCES_SORT_DIRECTORIES_FIRST,
PREFERENCE_BOOLEAN,
diff --git a/libnautilus-private/nautilus-global-preferences.h b/libnautilus-private/nautilus-global-preferences.h
index bb9e8e852..df22aa14f 100644
--- a/libnautilus-private/nautilus-global-preferences.h
+++ b/libnautilus-private/nautilus-global-preferences.h
@@ -58,7 +58,7 @@ G_BEGIN_DECLS
/* Display */
#define NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES "/desktop/gnome/file_views/show_hidden_files"
#define NAUTILUS_PREFERENCES_SHOW_BACKUP_FILES "/desktop/gnome/file_views/show_backup_files"
-#define NAUTILUS_PREFERENCES_SHOW_SPECIAL_FLAGS "preferences/show_special_flags"
+#define NAUTILUS_PREFERENCES_SHOW_ADVANCED_PERMISSIONS "preferences/show_advanced_permissions"
#define NAUTILUS_PREFERENCES_DATE_FORMAT "preferences/date_format"
typedef enum