diff options
-rw-r--r-- | ChangeLog | 25 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-async.c | 2 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-metafile-monitor.c | 17 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-private.h | 3 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory.c | 21 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-metafile-server.idl | 1 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-metafile.c | 40 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-metafile.h | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-async.c | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-metafile-monitor.c | 17 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-private.h | 3 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory.c | 21 | ||||
-rw-r--r-- | libnautilus-private/nautilus-metafile-server.idl | 1 | ||||
-rw-r--r-- | libnautilus-private/nautilus-metafile.c | 40 | ||||
-rw-r--r-- | libnautilus-private/nautilus-metafile.h | 2 |
15 files changed, 175 insertions, 22 deletions
@@ -1,3 +1,28 @@ +2001-02-28 Michael Engber <engber@eazel.com> + + reviewed by: Darin Adler <darin@eazel.com> + + * libnautilus-extensions/nautilus-directory-async.c: + (metafile_read_mark_done): + * libnautilus-extensions/nautilus-directory-metafile-monitor.c: + (nautilus_metafile_monitor_get_epv), (corba_metafile_changed), + (corba_metafile_ready): + * libnautilus-extensions/nautilus-directory-private.h: + * libnautilus-extensions/nautilus-directory.c: + (nautilus_directory_find_file_by_relative_uri), + (nautilus_directory_find_file_by_internal_uri): + * libnautilus-extensions/nautilus-metafile-server.idl: + * libnautilus-extensions/nautilus-metafile.c: (corba_set), + (corba_set_list), + (nautilus_metafile_notify_metafile_ready), + (call_metafile_changed), + (call_metafile_changed_for_all_files_mentioned_in_metafile), + (call_metafile_changed_for_one_file): + * libnautilus-extensions/nautilus-metafile.h: + When a metafile is read in - change signals are sent to all + files rather than just the ones with metadata. Also fixed + it so change notifications to the "." file will happen. Bug 7044. + 2001-02-28 Andy Hertzfeld <andy@eazel.com> fixed bug 7138, non-ASCII characters in author's names causes diff --git a/libnautilus-extensions/nautilus-directory-async.c b/libnautilus-extensions/nautilus-directory-async.c index 0b90aae1d..027918fe8 100644 --- a/libnautilus-extensions/nautilus-directory-async.c +++ b/libnautilus-extensions/nautilus-directory-async.c @@ -458,7 +458,7 @@ metafile_read_mark_done (NautilusDirectory *directory) nautilus_metafile_apply_pending_changes (directory); /* Tell change-watchers that we have update information. */ - call_metafile_changed_for_all_files_mentioned_in_metafile (directory); + nautilus_metafile_notify_metafile_ready (directory); /* Let the callers that were waiting for the metafile know. */ nautilus_directory_async_state_changed (directory); diff --git a/libnautilus-extensions/nautilus-directory-metafile-monitor.c b/libnautilus-extensions/nautilus-directory-metafile-monitor.c index 5bae8862e..5d82ce45b 100644 --- a/libnautilus-extensions/nautilus-directory-metafile-monitor.c +++ b/libnautilus-extensions/nautilus-directory-metafile-monitor.c @@ -44,6 +44,9 @@ static void corba_metafile_changed (PortableServer_Servant servant, const Nautilus_FileNameList *file_names, CORBA_Environment *ev); +static void corba_metafile_ready (PortableServer_Servant servant, + CORBA_Environment *ev); + NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusMetafileMonitor, nautilus_metafile_monitor, BONOBO_OBJECT_TYPE) static void @@ -58,6 +61,7 @@ nautilus_metafile_monitor_get_epv (void) static POA_Nautilus_MetafileMonitor__epv epv; epv.metafile_changed = corba_metafile_changed; + epv.metafile_ready = corba_metafile_ready; return &epv; } @@ -139,7 +143,7 @@ corba_metafile_changed (PortableServer_Servant servant, file_list = NULL; for (buf_pos = 0; buf_pos < file_names->_length; ++buf_pos) { - file = nautilus_directory_find_file_by_relative_uri + file = nautilus_directory_find_file_by_internal_uri (monitor->details->directory, file_names->_buffer [buf_pos]); if (file != NULL) { @@ -157,3 +161,14 @@ corba_metafile_changed (PortableServer_Servant servant, g_list_free (file_list); } } + +static void +corba_metafile_ready (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + NautilusMetafileMonitor *monitor; + + monitor = NAUTILUS_METAFILE_MONITOR (bonobo_object_from_servant (servant)); + + emit_change_signals_for_all_files (monitor->details->directory); +}
\ No newline at end of file diff --git a/libnautilus-extensions/nautilus-directory-private.h b/libnautilus-extensions/nautilus-directory-private.h index e4bc4e09a..46a56bf57 100644 --- a/libnautilus-extensions/nautilus-directory-private.h +++ b/libnautilus-extensions/nautilus-directory-private.h @@ -180,6 +180,7 @@ void nautilus_directory_emit_files_changed (NautilusD GList *changed_files); void nautilus_directory_emit_change_signals (NautilusDirectory *directory, GList *changed_files); +void emit_change_signals_for_all_files (NautilusDirectory *directory); void nautilus_directory_emit_done_loading (NautilusDirectory *directory); void nautilus_directory_emit_load_error (NautilusDirectory *directory, GnomeVFSResult error_result); @@ -194,6 +195,8 @@ NautilusFile * nautilus_directory_find_file_by_name (NautilusD const char *relative_uri); NautilusFile * nautilus_directory_find_file_by_relative_uri (NautilusDirectory *directory, const char *relative_uri); +NautilusFile * nautilus_directory_find_file_by_internal_uri (NautilusDirectory *directory, + const char *relative_uri); void nautilus_directory_add_file (NautilusDirectory *directory, NautilusFile *file); void nautilus_directory_remove_file (NautilusDirectory *directory, diff --git a/libnautilus-extensions/nautilus-directory.c b/libnautilus-extensions/nautilus-directory.c index 02a816c11..02dc17c02 100644 --- a/libnautilus-extensions/nautilus-directory.c +++ b/libnautilus-extensions/nautilus-directory.c @@ -240,7 +240,7 @@ filtering_changed_callback (gpointer callback_data) g_hash_table_foreach (directories, invalidate_one_count, NULL); } -static void +void emit_change_signals_for_all_files (NautilusDirectory *directory) { GList *files; @@ -709,6 +709,25 @@ nautilus_directory_find_file_by_relative_uri (NautilusDirectory *directory, return node == NULL ? NULL : NAUTILUS_FILE (node->data); } +NautilusFile * +nautilus_directory_find_file_by_internal_uri (NautilusDirectory *directory, + const char *relative_uri) +{ + NautilusFile *result; + + if (nautilus_strcmp (relative_uri, ".") == 0) { + result = nautilus_directory_get_existing_corresponding_file (directory); + if (result != NULL) { + nautilus_file_unref (result); + g_return_val_if_fail (!GTK_OBJECT_DESTROYED (result), NULL); + } + } else { + result = nautilus_directory_find_file_by_relative_uri (directory, relative_uri); + } + + return result; +} + void nautilus_directory_emit_files_added (NautilusDirectory *directory, GList *added_files) diff --git a/libnautilus-extensions/nautilus-metafile-server.idl b/libnautilus-extensions/nautilus-metafile-server.idl index 7fdd262e5..5d0500399 100644 --- a/libnautilus-extensions/nautilus-metafile-server.idl +++ b/libnautilus-extensions/nautilus-metafile-server.idl @@ -35,6 +35,7 @@ module Nautilus { */ interface MetafileMonitor : ::Bonobo::Unknown { void metafile_changed (in FileNameList file_names); + void metafile_ready (); }; typedef sequence<string> MetadataList; diff --git a/libnautilus-extensions/nautilus-metafile.c b/libnautilus-extensions/nautilus-metafile.c index 0c99cbb50..783f912a7 100644 --- a/libnautilus-extensions/nautilus-metafile.c +++ b/libnautilus-extensions/nautilus-metafile.c @@ -121,7 +121,7 @@ static void copy_file_metadata (NautilusDirectory *source_directory, static void remove_file_metadata (NautilusDirectory *directory, const char *file_name); -static void call_metatfile_changed_for_one_file (NautilusDirectory *directory, +static void call_metafile_changed_for_one_file (NautilusDirectory *directory, const CORBA_char *file_name); NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusMetafile, nautilus_metafile, BONOBO_OBJECT_TYPE) @@ -325,7 +325,7 @@ corba_set (PortableServer_Servant servant, directory = metafile->details->directory; if (set_file_metadata (directory, file_name, key, default_value, metadata)) { - call_metatfile_changed_for_one_file (directory, file_name); + call_metafile_changed_for_one_file (directory, file_name); } } @@ -353,7 +353,7 @@ corba_set_list (PortableServer_Servant servant, metadata_list = g_list_reverse (metadata_list); if (set_file_metadata_list (directory, file_name, list_key, list_subkey, metadata_list)) { - call_metatfile_changed_for_one_file (directory, file_name); + call_metafile_changed_for_one_file (directory, file_name); } g_list_free (metadata_list); @@ -534,8 +534,31 @@ corba_unregister_monitor (PortableServer_Servant servant, } } +void +nautilus_metafile_notify_metafile_ready (NautilusDirectory *directory) +{ + GList *node; + CORBA_Environment ev; + Nautilus_MetafileMonitor monitor; + DirectoryMonitorListEntry *entry; + + entry = g_hash_table_lookup (directory_monitor_lists, directory); + + if (entry != NULL) { + CORBA_exception_init (&ev); + + for (node = entry->monitors; node != NULL; node = node->next) { + monitor = node->data; + Nautilus_MetafileMonitor_metafile_ready (monitor, &ev); + /* FIXME bugzilla.eazel.com 6664: examine ev for errors */ + } + + CORBA_exception_free (&ev); + } +} + static void -call_metatfile_changed (NautilusDirectory *directory, +call_metafile_changed (NautilusDirectory *directory, const Nautilus_FileNameList *file_names) { GList *node; @@ -589,23 +612,23 @@ call_metafile_changed_for_all_files_mentioned_in_metafile (NautilusDirectory *di file_list_filler_ghfunc, &file_names); - call_metatfile_changed (directory, &file_names); + call_metafile_changed (directory, &file_names); g_free (file_names._buffer); } } static void -call_metatfile_changed_for_one_file (NautilusDirectory *directory, +call_metafile_changed_for_one_file (NautilusDirectory *directory, const CORBA_char *file_name) { - Nautilus_FileNameList file_names; + Nautilus_FileNameList file_names = {0}; file_names._maximum = 1; file_names._length = 1; file_names._buffer = (CORBA_char **) &file_name; - call_metatfile_changed (directory, &file_names); + call_metafile_changed (directory, &file_names); } typedef struct { @@ -1451,3 +1474,4 @@ nautilus_metafile_set_metafile_contents (NautilusDirectory *directory, } } } + diff --git a/libnautilus-extensions/nautilus-metafile.h b/libnautilus-extensions/nautilus-metafile.h index 45f9e52e4..ca2f65bda 100644 --- a/libnautilus-extensions/nautilus-metafile.h +++ b/libnautilus-extensions/nautilus-metafile.h @@ -61,6 +61,8 @@ NautilusMetafile *nautilus_metafile_new (const char *directory_uri); void call_metafile_changed_for_all_files_mentioned_in_metafile (NautilusDirectory *directory); +void nautilus_metafile_notify_metafile_ready (NautilusDirectory *directory); + void nautilus_metafile_apply_pending_changes (NautilusDirectory *directory); void nautilus_metafile_destroy (NautilusDirectory *directory); diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index 0b90aae1d..027918fe8 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -458,7 +458,7 @@ metafile_read_mark_done (NautilusDirectory *directory) nautilus_metafile_apply_pending_changes (directory); /* Tell change-watchers that we have update information. */ - call_metafile_changed_for_all_files_mentioned_in_metafile (directory); + nautilus_metafile_notify_metafile_ready (directory); /* Let the callers that were waiting for the metafile know. */ nautilus_directory_async_state_changed (directory); diff --git a/libnautilus-private/nautilus-directory-metafile-monitor.c b/libnautilus-private/nautilus-directory-metafile-monitor.c index 5bae8862e..5d82ce45b 100644 --- a/libnautilus-private/nautilus-directory-metafile-monitor.c +++ b/libnautilus-private/nautilus-directory-metafile-monitor.c @@ -44,6 +44,9 @@ static void corba_metafile_changed (PortableServer_Servant servant, const Nautilus_FileNameList *file_names, CORBA_Environment *ev); +static void corba_metafile_ready (PortableServer_Servant servant, + CORBA_Environment *ev); + NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusMetafileMonitor, nautilus_metafile_monitor, BONOBO_OBJECT_TYPE) static void @@ -58,6 +61,7 @@ nautilus_metafile_monitor_get_epv (void) static POA_Nautilus_MetafileMonitor__epv epv; epv.metafile_changed = corba_metafile_changed; + epv.metafile_ready = corba_metafile_ready; return &epv; } @@ -139,7 +143,7 @@ corba_metafile_changed (PortableServer_Servant servant, file_list = NULL; for (buf_pos = 0; buf_pos < file_names->_length; ++buf_pos) { - file = nautilus_directory_find_file_by_relative_uri + file = nautilus_directory_find_file_by_internal_uri (monitor->details->directory, file_names->_buffer [buf_pos]); if (file != NULL) { @@ -157,3 +161,14 @@ corba_metafile_changed (PortableServer_Servant servant, g_list_free (file_list); } } + +static void +corba_metafile_ready (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + NautilusMetafileMonitor *monitor; + + monitor = NAUTILUS_METAFILE_MONITOR (bonobo_object_from_servant (servant)); + + emit_change_signals_for_all_files (monitor->details->directory); +}
\ No newline at end of file diff --git a/libnautilus-private/nautilus-directory-private.h b/libnautilus-private/nautilus-directory-private.h index e4bc4e09a..46a56bf57 100644 --- a/libnautilus-private/nautilus-directory-private.h +++ b/libnautilus-private/nautilus-directory-private.h @@ -180,6 +180,7 @@ void nautilus_directory_emit_files_changed (NautilusD GList *changed_files); void nautilus_directory_emit_change_signals (NautilusDirectory *directory, GList *changed_files); +void emit_change_signals_for_all_files (NautilusDirectory *directory); void nautilus_directory_emit_done_loading (NautilusDirectory *directory); void nautilus_directory_emit_load_error (NautilusDirectory *directory, GnomeVFSResult error_result); @@ -194,6 +195,8 @@ NautilusFile * nautilus_directory_find_file_by_name (NautilusD const char *relative_uri); NautilusFile * nautilus_directory_find_file_by_relative_uri (NautilusDirectory *directory, const char *relative_uri); +NautilusFile * nautilus_directory_find_file_by_internal_uri (NautilusDirectory *directory, + const char *relative_uri); void nautilus_directory_add_file (NautilusDirectory *directory, NautilusFile *file); void nautilus_directory_remove_file (NautilusDirectory *directory, diff --git a/libnautilus-private/nautilus-directory.c b/libnautilus-private/nautilus-directory.c index 02a816c11..02dc17c02 100644 --- a/libnautilus-private/nautilus-directory.c +++ b/libnautilus-private/nautilus-directory.c @@ -240,7 +240,7 @@ filtering_changed_callback (gpointer callback_data) g_hash_table_foreach (directories, invalidate_one_count, NULL); } -static void +void emit_change_signals_for_all_files (NautilusDirectory *directory) { GList *files; @@ -709,6 +709,25 @@ nautilus_directory_find_file_by_relative_uri (NautilusDirectory *directory, return node == NULL ? NULL : NAUTILUS_FILE (node->data); } +NautilusFile * +nautilus_directory_find_file_by_internal_uri (NautilusDirectory *directory, + const char *relative_uri) +{ + NautilusFile *result; + + if (nautilus_strcmp (relative_uri, ".") == 0) { + result = nautilus_directory_get_existing_corresponding_file (directory); + if (result != NULL) { + nautilus_file_unref (result); + g_return_val_if_fail (!GTK_OBJECT_DESTROYED (result), NULL); + } + } else { + result = nautilus_directory_find_file_by_relative_uri (directory, relative_uri); + } + + return result; +} + void nautilus_directory_emit_files_added (NautilusDirectory *directory, GList *added_files) diff --git a/libnautilus-private/nautilus-metafile-server.idl b/libnautilus-private/nautilus-metafile-server.idl index 7fdd262e5..5d0500399 100644 --- a/libnautilus-private/nautilus-metafile-server.idl +++ b/libnautilus-private/nautilus-metafile-server.idl @@ -35,6 +35,7 @@ module Nautilus { */ interface MetafileMonitor : ::Bonobo::Unknown { void metafile_changed (in FileNameList file_names); + void metafile_ready (); }; typedef sequence<string> MetadataList; diff --git a/libnautilus-private/nautilus-metafile.c b/libnautilus-private/nautilus-metafile.c index 0c99cbb50..783f912a7 100644 --- a/libnautilus-private/nautilus-metafile.c +++ b/libnautilus-private/nautilus-metafile.c @@ -121,7 +121,7 @@ static void copy_file_metadata (NautilusDirectory *source_directory, static void remove_file_metadata (NautilusDirectory *directory, const char *file_name); -static void call_metatfile_changed_for_one_file (NautilusDirectory *directory, +static void call_metafile_changed_for_one_file (NautilusDirectory *directory, const CORBA_char *file_name); NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusMetafile, nautilus_metafile, BONOBO_OBJECT_TYPE) @@ -325,7 +325,7 @@ corba_set (PortableServer_Servant servant, directory = metafile->details->directory; if (set_file_metadata (directory, file_name, key, default_value, metadata)) { - call_metatfile_changed_for_one_file (directory, file_name); + call_metafile_changed_for_one_file (directory, file_name); } } @@ -353,7 +353,7 @@ corba_set_list (PortableServer_Servant servant, metadata_list = g_list_reverse (metadata_list); if (set_file_metadata_list (directory, file_name, list_key, list_subkey, metadata_list)) { - call_metatfile_changed_for_one_file (directory, file_name); + call_metafile_changed_for_one_file (directory, file_name); } g_list_free (metadata_list); @@ -534,8 +534,31 @@ corba_unregister_monitor (PortableServer_Servant servant, } } +void +nautilus_metafile_notify_metafile_ready (NautilusDirectory *directory) +{ + GList *node; + CORBA_Environment ev; + Nautilus_MetafileMonitor monitor; + DirectoryMonitorListEntry *entry; + + entry = g_hash_table_lookup (directory_monitor_lists, directory); + + if (entry != NULL) { + CORBA_exception_init (&ev); + + for (node = entry->monitors; node != NULL; node = node->next) { + monitor = node->data; + Nautilus_MetafileMonitor_metafile_ready (monitor, &ev); + /* FIXME bugzilla.eazel.com 6664: examine ev for errors */ + } + + CORBA_exception_free (&ev); + } +} + static void -call_metatfile_changed (NautilusDirectory *directory, +call_metafile_changed (NautilusDirectory *directory, const Nautilus_FileNameList *file_names) { GList *node; @@ -589,23 +612,23 @@ call_metafile_changed_for_all_files_mentioned_in_metafile (NautilusDirectory *di file_list_filler_ghfunc, &file_names); - call_metatfile_changed (directory, &file_names); + call_metafile_changed (directory, &file_names); g_free (file_names._buffer); } } static void -call_metatfile_changed_for_one_file (NautilusDirectory *directory, +call_metafile_changed_for_one_file (NautilusDirectory *directory, const CORBA_char *file_name) { - Nautilus_FileNameList file_names; + Nautilus_FileNameList file_names = {0}; file_names._maximum = 1; file_names._length = 1; file_names._buffer = (CORBA_char **) &file_name; - call_metatfile_changed (directory, &file_names); + call_metafile_changed (directory, &file_names); } typedef struct { @@ -1451,3 +1474,4 @@ nautilus_metafile_set_metafile_contents (NautilusDirectory *directory, } } } + diff --git a/libnautilus-private/nautilus-metafile.h b/libnautilus-private/nautilus-metafile.h index 45f9e52e4..ca2f65bda 100644 --- a/libnautilus-private/nautilus-metafile.h +++ b/libnautilus-private/nautilus-metafile.h @@ -61,6 +61,8 @@ NautilusMetafile *nautilus_metafile_new (const char *directory_uri); void call_metafile_changed_for_all_files_mentioned_in_metafile (NautilusDirectory *directory); +void nautilus_metafile_notify_metafile_ready (NautilusDirectory *directory); + void nautilus_metafile_apply_pending_changes (NautilusDirectory *directory); void nautilus_metafile_destroy (NautilusDirectory *directory); |