On Fr, 2005-11-18 at 18:58 +0100, Christian Neumair wrote: > On Mi, 2005-10-19 at 11:54 +0200, Alexander Larsson wrote: > > On Tue, 2005-10-04 at 13:10 +0200, Christian Neumair wrote: > > > The attached two patches change the Nautilus semantics for dealing with > > > multiple files. The trick is to be notified about all activation URIs > > > and decide what to do with the individual files later. We can then > > > cumulate multiple files and pass them to the same application handler. > > > > > > From quickly taking a look at the patch it looks like we sometimes leak > > > the activation->files list, this can be resolved right before the > > > commit, though. > > (review) > > It's frustrating. I fail to see why the refcount is hosed after the file > activation. I'm sending what I have now back to the list for review. > Using gdb and printf-debugging didn't yield anything. The last patch just contained the src/ part. -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-file.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file.c,v retrieving revision 1.374 diff -u -p -r1.374 nautilus-file.c --- libnautilus-private/nautilus-file.c 20 Oct 2005 15:22:12 -0000 1.374 +++ libnautilus-private/nautilus-file.c 18 Nov 2005 18:00:17 -0000 @@ -5831,6 +5831,8 @@ nautilus_file_list_sort_by_display_name return g_list_sort (list, compare_by_display_name_cover); } +static GList *ready_data_list = NULL; + typedef struct { GList *file_list; @@ -5840,11 +5842,45 @@ typedef struct } FileListReadyData; static void +file_list_ready_data_free (FileListReadyData *data) +{ + GList *l; + + l = g_list_find (ready_data_list, data); + if (l != NULL) { + ready_data_list = g_list_delete_link (ready_data_list, l); + l = g_list_find (ready_data_list, data); + + nautilus_file_list_free (data->file_list); + g_list_free (data->remaining_files); + g_free (data); + } +} + +static FileListReadyData * +file_list_ready_data_new (GList *file_list, + NautilusFileListCallback callback, + gpointer callback_data) +{ + FileListReadyData *data; + + data = g_new0 (FileListReadyData, 1); + data->file_list = nautilus_file_list_copy (file_list); + data->remaining_files = g_list_copy (file_list); + data->callback = callback; + data->callback_data = callback_data; + + ready_data_list = g_list_prepend (ready_data_list, data); + + return data; +} + +static void file_list_file_ready_callback (NautilusFile *file, gpointer user_data) { FileListReadyData *data; - + data = user_data; data->remaining_files = g_list_remove (data->remaining_files, file); @@ -5852,13 +5888,12 @@ file_list_file_ready_callback (NautilusF if (data->callback) { (*data->callback) (data->file_list, data->callback_data); } - - nautilus_file_list_free (data->file_list); - g_free (data); + + file_list_ready_data_free (data); } } -void +NautilusFileListHandle * nautilus_file_list_call_when_ready (GList *file_list, NautilusFileAttributes attributes, NautilusFileListCallback callback, @@ -5866,20 +5901,44 @@ nautilus_file_list_call_when_ready (GLis { GList *l; FileListReadyData *data; - - g_return_if_fail (file_list != NULL); - data = g_new0 (FileListReadyData, 1); - data->file_list = nautilus_file_list_copy (file_list); - data->remaining_files = g_list_copy (file_list); - data->callback = callback; - data->callback_data = callback_data; - + g_return_val_if_fail (file_list != NULL, NULL); + + data = file_list_ready_data_new + (file_list, callback, callback_data); + for (l = file_list; l != NULL; l = l->next) { nautilus_file_call_when_ready (NAUTILUS_FILE (l->data), attributes, file_list_file_ready_callback, data); + } + + return (NautilusFileListHandle *) data; +} + +void +nautilus_file_list_cancel_call_when_ready (NautilusFileListHandle *handle) +{ + GList *l; + NautilusFile *file; + FileListReadyData *data; + + g_return_if_fail (handle != NULL); + + data = (FileListReadyData *) handle; + + l = g_list_find (ready_data_list, handle); + if (l != NULL) { + for (l = data->remaining_files; l != NULL; l = l->next) { + file = NAUTILUS_FILE (l->data); + + EEL_CALL_METHOD + (NAUTILUS_FILE_CLASS, file, + cancel_call_when_ready, (file, file_list_file_ready_callback, data)); + } + + file_list_ready_data_free (data); } } Index: libnautilus-private/nautilus-file.h =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file.h,v retrieving revision 1.108 diff -u -p -r1.108 nautilus-file.h --- libnautilus-private/nautilus-file.h 20 Oct 2005 15:22:12 -0000 1.108 +++ libnautilus-private/nautilus-file.h 18 Nov 2005 18:00:17 -0000 @@ -89,6 +89,8 @@ typedef char * (*NautilusTruncateCallbac int width, void *context); +typedef void NautilusFileListHandle; + /* GObject requirements. */ GType nautilus_file_get_type (void); @@ -339,10 +341,11 @@ void nautilus_file_li void nautilus_file_list_free (GList *file_list); GList * nautilus_file_list_copy (GList *file_list); GList * nautilus_file_list_sort_by_display_name (GList *file_list); -void nautilus_file_list_call_when_ready (GList *file_list, +NautilusFileListHandle* nautilus_file_list_call_when_ready (GList *file_list, NautilusFileAttributes attributes, NautilusFileListCallback callback, gpointer callback_data); +void nautilus_file_list_cancel_call_when_ready (NautilusFileListHandle *handle); /* Debugging */ void nautilus_file_dump (NautilusFile *file);
Attachment:
signature.asc
Description: This is a digitally signed message part