summaryrefslogtreecommitdiff
path: root/libnautilus-private
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2003-06-27 18:33:58 +0000
committerAlexander Larsson <alexl@src.gnome.org>2003-06-27 18:33:58 +0000
commita03252970245493a3f0e01e470c0a447178f0352 (patch)
treeb655747b3f862b36dc98e82b27798e7d6f6e2f2d /libnautilus-private
parentadf1efcf0fb38cdaeea9ddcbe7878aafcdbb9a27 (diff)
downloadnautilus-a03252970245493a3f0e01e470c0a447178f0352.tar.gz
Implement .hidden files, synchronosly, for file:// only.
2003-06-27 Alexander Larsson <alexl@redhat.com> * components/tree/nautilus-tree-view.c: (create_tree): * libnautilus-private/nautilus-directory-async.c: (should_skip_file), (dequeue_pending_idle_callback), (remove_callback), (file_list_cancel), (count_non_skipped_files), (read_dot_hidden_file), (start_monitoring_file_list), (deep_count_one), (mime_list_one): * libnautilus-private/nautilus-directory-private.h: * libnautilus-private/nautilus-directory.c: (nautilus_directory_init), (nautilus_directory_finalize): * libnautilus-private/nautilus-file.c: (is_file_hidden), (nautilus_file_should_show): Implement .hidden files, synchronosly, for file:// only. * components/tree/nautilus-tree-view.c (create_tree): Change root name to "Filesystem"
Diffstat (limited to 'libnautilus-private')
-rw-r--r--libnautilus-private/nautilus-directory-async.c85
-rw-r--r--libnautilus-private/nautilus-directory-private.h2
-rw-r--r--libnautilus-private/nautilus-directory.c4
-rw-r--r--libnautilus-private/nautilus-file.c13
4 files changed, 96 insertions, 8 deletions
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c
index 6910b456c..6feb7d064 100644
--- a/libnautilus-private/nautilus-directory-async.c
+++ b/libnautilus-private/nautilus-directory-async.c
@@ -731,7 +731,7 @@ is_dot_or_dot_dot (const char *name)
}
static gboolean
-should_skip_file (GnomeVFSFileInfo *info)
+should_skip_file (NautilusDirectory *directory, GnomeVFSFileInfo *info)
{
static gboolean show_hidden_files_changed_callback_installed = FALSE;
static gboolean show_backup_files_changed_callback_installed = FALSE;
@@ -766,7 +766,9 @@ should_skip_file (GnomeVFSFileInfo *info)
return TRUE;
}
- if (!show_hidden_files && nautilus_file_name_matches_hidden_pattern (info->name)) {
+ if (!show_hidden_files && (nautilus_file_name_matches_hidden_pattern (info->name) ||
+ (directory != NULL &&
+ g_hash_table_lookup (directory->details->hidden_file_hash, info->name) != NULL))) {
return TRUE;
}
if (!show_backup_files && nautilus_file_name_matches_backup_pattern (info->name)) {
@@ -846,7 +848,7 @@ dequeue_pending_idle_callback (gpointer callback_data)
* moving this into the actual callback instead of
* waiting for the idle function.
*/
- if (!should_skip_file (file_info)) {
+ if (!should_skip_file (directory, file_info)) {
directory->details->load_file_count += 1;
/* Add the MIME type to the set. */
@@ -970,6 +972,12 @@ directory_load_cancel (NautilusDirectory *directory)
}
}
+static gboolean
+remove_callback (gpointer key, gpointer value, gpointer user_data)
+{
+ return TRUE;
+}
+
static void
file_list_cancel (NautilusDirectory *directory)
{
@@ -985,6 +993,8 @@ file_list_cancel (NautilusDirectory *directory)
directory->details->pending_file_info = NULL;
}
+ g_hash_table_foreach_remove (directory->details->hidden_file_hash, remove_callback, NULL);
+
load_directory_state_destroy (directory);
}
@@ -1398,7 +1408,7 @@ count_non_skipped_files (GList *list)
count = 0;
for (node = list; node != NULL; node = node->next) {
- if (!should_skip_file (node->data)) {
+ if (!should_skip_file (NULL, node->data)) {
count += 1;
}
}
@@ -1944,6 +1954,66 @@ get_file_count_filter (NautilusDirectory *directory)
#endif
+static void
+read_dot_hidden_file (NautilusDirectory *directory)
+{
+ char *dot_hidden_uri;
+ GnomeVFSURI *dot_hidden_vfs_uri;
+ GnomeVFSResult result;
+ int i, file_size;
+ char *file_contents;
+
+
+ /* FIXME: We only support .hidden on file: uri's for the moment.
+ * Need to figure out if we should do this async or sync to extend
+ * it to all types of uris.
+ */
+ if (eel_strcasecmp (directory->details->vfs_uri->method_string, "file") != 0) {
+ return;
+ }
+
+ /* FIXME: what we really need is a uri_append_file_name call
+ * that works on strings, so we can avoid the VFS parsing step.
+ */
+ dot_hidden_vfs_uri = gnome_vfs_uri_append_file_name (directory->details->vfs_uri, ".hidden");
+ dot_hidden_uri = gnome_vfs_uri_to_string (dot_hidden_vfs_uri, GNOME_VFS_URI_HIDE_NONE);
+ gnome_vfs_uri_unref (dot_hidden_vfs_uri);
+
+ result = eel_read_entire_file (dot_hidden_uri, &file_size, &file_contents);
+ g_free (dot_hidden_uri);
+
+ if (result != GNOME_VFS_OK) {
+ return;
+ }
+
+ /* Now parse the data */
+ i = 0;
+ while (i < file_size) {
+ int start;
+
+ start = i;
+ while (i < file_size && file_contents[i] != '\n') {
+ i++;
+ }
+
+ if (i > start) {
+ char *tmp, *tmp2;
+
+ tmp = g_strndup (file_contents + start, i - start);
+ tmp2 = gnome_vfs_escape_string (tmp);
+ g_free (tmp);
+
+ g_hash_table_insert (directory->details->hidden_file_hash,
+ tmp2, tmp2);
+ }
+
+ i++;
+
+ }
+
+ g_free (file_contents);
+}
+
/* Start monitoring the file list if it isn't already. */
static void
start_monitoring_file_list (NautilusDirectory *directory)
@@ -1972,6 +2042,9 @@ start_monitoring_file_list (NautilusDirectory *directory)
directory->details->load_directory_file->details->loading_directory = TRUE;
directory->details->load_file_count = 0;
directory->details->load_mime_list_hash = istr_set_new ();
+
+ read_dot_hidden_file (directory);
+
#ifdef DEBUG_LOAD_DIRECTORY
g_message ("load_directory called to monitor file list of %s", directory->details->uri);
#endif
@@ -2214,7 +2287,7 @@ deep_count_one (NautilusDirectory *directory,
NautilusFile *file;
char *escaped_name, *uri;
- if (should_skip_file (info))
+ if (should_skip_file (NULL, info))
return;
file = directory->details->deep_count_file;
@@ -2383,7 +2456,7 @@ static void
mime_list_one (NautilusDirectory *directory,
GnomeVFSFileInfo *info)
{
- if (should_skip_file (info)) {
+ if (should_skip_file (NULL, info)) {
return;
}
diff --git a/libnautilus-private/nautilus-directory-private.h b/libnautilus-private/nautilus-directory-private.h
index 038c58afd..c5c3bb771 100644
--- a/libnautilus-private/nautilus-directory-private.h
+++ b/libnautilus-private/nautilus-directory-private.h
@@ -105,6 +105,8 @@ struct NautilusDirectoryDetails
LinkInfoReadState *link_info_read_state;
GList *file_operations_in_progress; /* list of FileOperation * */
+
+ GHashTable *hidden_file_hash;
};
/* A request for information about one or more files. */
diff --git a/libnautilus-private/nautilus-directory.c b/libnautilus-private/nautilus-directory.c
index 1161da7b8..5038161cc 100644
--- a/libnautilus-private/nautilus-directory.c
+++ b/libnautilus-private/nautilus-directory.c
@@ -134,6 +134,8 @@ nautilus_directory_init (gpointer object, gpointer klass)
directory->details->high_priority_queue = nautilus_file_queue_new ();
directory->details->low_priority_queue = nautilus_file_queue_new ();
directory->details->idle_queue = nautilus_idle_queue_new ();
+
+ directory->details->hidden_file_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
}
void
@@ -201,6 +203,8 @@ nautilus_directory_finalize (GObject *object)
g_assert (directory->details->file_list == NULL);
g_hash_table_destroy (directory->details->file_hash);
+ g_hash_table_destroy (directory->details->hidden_file_hash);
+
nautilus_file_queue_destroy (directory->details->high_priority_queue);
nautilus_file_queue_destroy (directory->details->low_priority_queue);
nautilus_idle_queue_destroy (directory->details->idle_queue);
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 700453d90..bc502ee1d 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -2104,13 +2104,22 @@ nautilus_file_is_backup_file (NautilusFile *file)
(file->details->relative_uri);
}
+static gboolean
+is_file_hidden (NautilusFile *file)
+{
+ return g_hash_table_lookup (file->details->directory->details->hidden_file_hash,
+ file->details->relative_uri) != NULL;
+
+}
+
gboolean
nautilus_file_should_show (NautilusFile *file,
gboolean show_hidden,
gboolean show_backup)
{
- return (show_hidden || ! nautilus_file_is_hidden_file (file)) &&
- (show_backup || ! nautilus_file_is_backup_file (file));
+ return (show_hidden || (!nautilus_file_is_hidden_file (file) && !is_file_hidden (file))) &&
+ (show_backup || !nautilus_file_is_backup_file (file));
+
}
gboolean