diff options
Diffstat (limited to 'libnautilus-private/nautilus-directory-async.c')
-rw-r--r-- | libnautilus-private/nautilus-directory-async.c | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index 010e383c1..dc3013787 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -25,6 +25,7 @@ #include <config.h> #include "nautilus-metafile.h" +#include "nautilus-directory-metafile.h" #include "nautilus-directory-notify.h" #include "nautilus-directory-private.h" #include "nautilus-file-attributes.h" @@ -457,7 +458,7 @@ metafile_read_mark_done (NautilusDirectory *directory) nautilus_metafile_apply_pending_changes (directory); /* Tell change-watchers that we have update information. */ - nautilus_directory_emit_metadata_changed (directory); + call_metafile_changed_for_all_files_mentioned_in_metafile (directory); /* Let the callers that were waiting for the metafile know. */ nautilus_directory_async_state_changed (directory); @@ -704,7 +705,7 @@ metafile_read_start (NautilusDirectory *directory) g_assert (directory->details->metafile == NULL); - if (!is_anyone_waiting_for_metafile (directory)) { + if (!directory->details->load_metafile_for_server) { return; } @@ -1121,7 +1122,14 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory, nautilus_file_list_free (file_list); } } - + + /* We could just call update_metadata_monitors here, but we can be smarter + * since we know what monitor was just added. + */ + if (monitor->request.metafile && directory->details->metafile_monitor == NULL) { + nautilus_directory_register_metadata_monitor (directory); + } + /* Kick off I/O. */ nautilus_directory_async_state_changed (directory); } @@ -1482,6 +1490,24 @@ directory_load_callback (GnomeVFSAsyncHandle *handle, } } +static void +update_metadata_monitors (NautilusDirectory *directory) +{ + gboolean is_metadata_monitored; + + is_metadata_monitored = is_anyone_waiting_for_metafile (directory); + + if (directory->details->metafile_monitor == NULL) { + if (is_metadata_monitored) { + nautilus_directory_register_metadata_monitor (directory); + } + } else { + if (!is_metadata_monitored) { + nautilus_directory_unregister_metadata_monitor (directory); + } + } +} + void nautilus_directory_monitor_remove_internal (NautilusDirectory *directory, NautilusFile *file, @@ -1493,6 +1519,8 @@ nautilus_directory_monitor_remove_internal (NautilusDirectory *directory, remove_monitor (directory, file, client); + update_metadata_monitors (directory); + nautilus_directory_async_state_changed (directory); } @@ -1604,6 +1632,14 @@ nautilus_directory_call_when_ready_internal (NautilusDirectory *directory, (directory->details->call_when_ready_list, g_memdup (&callback, sizeof (callback))); + /* When we change the ready list we need to sync up metadata monitors. + * We could just call update_metadata_monitors here, but we can be smarter + * since we know what was just added. + */ + if (callback.request.metafile && directory->details->metafile_monitor == NULL) { + nautilus_directory_register_metadata_monitor (directory); + } + nautilus_directory_async_state_changed (directory); } @@ -1671,6 +1707,9 @@ nautilus_directory_cancel_callback_internal (NautilusDirectory *directory, ready_callback_key_compare); if (node != NULL) { remove_callback_link (directory, node); + /* When we change the ready list we need to sync up metadata monitors. */ + update_metadata_monitors (directory); + nautilus_directory_async_state_changed (directory); } } @@ -1799,6 +1838,11 @@ nautilus_async_destroying_file (NautilusFile *file) } } + /* When we change the monitor or ready list we need to sync up metadata monitors */ + if (changed) { + update_metadata_monitors (directory); + } + /* Check if it's a file that's currently being worked on. * If so, make that NULL so it gets canceled right away. */ @@ -1954,7 +1998,7 @@ request_is_satisfied (NautilusDirectory *directory, NautilusFile *file, Request *request) { - if (request->metafile && !directory->details->metafile_read) { + if (request->metafile && !nautilus_directory_is_metadata_read (directory)) { return FALSE; } @@ -2023,6 +2067,10 @@ call_ready_callbacks (NautilusDirectory *directory) } } if (node == NULL) { + if (called_any) { + /* When we change the ready list we need to sync up metadata monitors. */ + update_metadata_monitors (directory); + } return called_any; } |