diff options
author | Alexander Larsson <alexl@redhat.com> | 2006-06-16 14:19:55 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2006-06-16 14:19:55 +0000 |
commit | 71b1be1b0b357d280bb9ad536129c154cdac4ca0 (patch) | |
tree | 670be0899b5ebe4c9852f9d1a416f83846e6b629 /libnautilus-private | |
parent | 7f6e6cb7b6cd0ca4e73218479a626cd4b5355dc8 (diff) | |
download | nautilus-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.in | 15 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-operations.c | 233 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-operations.h | 8 | ||||
-rw-r--r-- | libnautilus-private/nautilus-global-preferences.c | 4 | ||||
-rw-r--r-- | libnautilus-private/nautilus-global-preferences.h | 2 |
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 |