diff options
author | Darin Adler <darin@src.gnome.org> | 2000-08-05 00:33:18 +0000 |
---|---|---|
committer | Darin Adler <darin@src.gnome.org> | 2000-08-05 00:33:18 +0000 |
commit | 28c05cd26139f5b3b80afe8fc43500070aa94165 (patch) | |
tree | e5a8c43921781a064124a0ef9d440f128bbf1084 | |
parent | a32b5735007b8ea52d0e2fa154301a1c9efe56b0 (diff) | |
download | nautilus-28c05cd26139f5b3b80afe8fc43500070aa94165.tar.gz |
Fix bug where we would leak a remote UI handler. This caused bad problems
* src/file-manager/fm-directory-view.c:
(bonobo_control_activate_callback): Fix bug where we would leak
a remote UI handler. This caused bad problems when opening and
closing windows with the undo management. This fixes bugs 1949
and 1259.
* src/nautilus-window-private.h:
* src/nautilus-window.c: (nautilus_window_destroy):
* src/nautilus-window-menus.c: (append_bookmark_to_menu),
(nautilus_window_remove_go_menu_callback),
(nautilus_window_remove_bookmarks_menu_items),
(nautilus_window_remove_go_menu_items):
Fix bookmark signals to properly disconnect when the window goes
away. The old way of using connect_while_alive would not work
because we need to disconnect the signals one at a time sometimes
too and it's illegal to disconnect a "while_alive" signal any
other way.
* libnautilus-extensions/nautilus-directory-async.c:
(metafile_write_failure_close_callback),
(metafile_write_success_close_callback), (metafile_write_callback):
Fix handling of error codes from close when writing a metafile.
-rw-r--r-- | ChangeLog | 25 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-async.c | 64 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-async.c | 64 | ||||
-rw-r--r-- | src/file-manager/fm-directory-view.c | 14 | ||||
-rw-r--r-- | src/nautilus-navigation-window-menus.c | 27 | ||||
-rw-r--r-- | src/nautilus-navigation-window.c | 2 | ||||
-rw-r--r-- | src/nautilus-object-window.c | 2 | ||||
-rw-r--r-- | src/nautilus-spatial-window.c | 2 | ||||
-rw-r--r-- | src/nautilus-window-menus.c | 27 | ||||
-rw-r--r-- | src/nautilus-window-private.h | 2 | ||||
-rw-r--r-- | src/nautilus-window.c | 2 |
11 files changed, 163 insertions, 68 deletions
@@ -1,3 +1,28 @@ +2000-08-04 Darin Adler <darin@eazel.com> + + * src/file-manager/fm-directory-view.c: + (bonobo_control_activate_callback): Fix bug where we would leak + a remote UI handler. This caused bad problems when opening and + closing windows with the undo management. This fixes bugs 1949 + and 1259. + + * src/nautilus-window-private.h: + * src/nautilus-window.c: (nautilus_window_destroy): + * src/nautilus-window-menus.c: (append_bookmark_to_menu), + (nautilus_window_remove_go_menu_callback), + (nautilus_window_remove_bookmarks_menu_items), + (nautilus_window_remove_go_menu_items): + Fix bookmark signals to properly disconnect when the window goes + away. The old way of using connect_while_alive would not work + because we need to disconnect the signals one at a time sometimes + too and it's illegal to disconnect a "while_alive" signal any + other way. + + * libnautilus-extensions/nautilus-directory-async.c: + (metafile_write_failure_close_callback), + (metafile_write_success_close_callback), (metafile_write_callback): + Fix handling of error codes from close when writing a metafile. + 2000-08-04 Maciej Stachowiak <mjs@eazel.com> * components/tree/nautilus-tree-view.c: (insert_hack_node, diff --git a/libnautilus-extensions/nautilus-directory-async.c b/libnautilus-extensions/nautilus-directory-async.c index ed64f132e..54acd704f 100644 --- a/libnautilus-extensions/nautilus-directory-async.c +++ b/libnautilus-extensions/nautilus-directory-async.c @@ -106,17 +106,6 @@ static gboolean request_is_satisfied (NautilusDirectory *directory, Request *request); static void -empty_close_callback (GnomeVFSAsyncHandle *handle, - GnomeVFSResult result, - gpointer callback_data) -{ - if (result != GNOME_VFS_OK) { - g_warning ("close failed"); - } - /* Do nothing. */ -} - -static void cancel_directory_counts (NautilusDirectory *directory) { if (directory->details->count_in_progress != NULL) { @@ -476,25 +465,26 @@ metafile_write_failed (NautilusDirectory *directory) } static void -metafile_write_callback (GnomeVFSAsyncHandle *handle, - GnomeVFSResult result, - gconstpointer buffer, - GnomeVFSFileSize bytes_requested, - GnomeVFSFileSize bytes_read, - gpointer callback_data) +metafile_write_failure_close_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + gpointer callback_data) { NautilusDirectory *directory; directory = NAUTILUS_DIRECTORY (callback_data); - g_assert (directory->details->metafile_write_state->handle == handle); - g_assert (directory->details->metafile_write_state->buffer == buffer); - g_assert (directory->details->metafile_write_state->size == bytes_requested); - g_assert (directory->details->metafile_write_state->handle != NULL); - gnome_vfs_async_close (directory->details->metafile_write_state->handle, - empty_close_callback, - directory); - directory->details->metafile_write_state->handle = NULL; + metafile_write_failed (directory); +} + +static void +metafile_write_success_close_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + gpointer callback_data) +{ + NautilusDirectory *directory; + + directory = NAUTILUS_DIRECTORY (callback_data); + g_assert (directory->details->metafile_write_state->handle == NULL); if (result != GNOME_VFS_OK) { metafile_write_failed (directory); @@ -515,6 +505,30 @@ metafile_write_callback (GnomeVFSAsyncHandle *handle, } static void +metafile_write_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + gconstpointer buffer, + GnomeVFSFileSize bytes_requested, + GnomeVFSFileSize bytes_read, + gpointer callback_data) +{ + NautilusDirectory *directory; + + directory = NAUTILUS_DIRECTORY (callback_data); + g_assert (directory->details->metafile_write_state->handle == handle); + g_assert (directory->details->metafile_write_state->buffer == buffer); + g_assert (directory->details->metafile_write_state->size == bytes_requested); + + g_assert (directory->details->metafile_write_state->handle != NULL); + gnome_vfs_async_close (directory->details->metafile_write_state->handle, + result == GNOME_VFS_OK + ? metafile_write_success_close_callback + : metafile_write_failure_close_callback, + directory); + directory->details->metafile_write_state->handle = NULL; +} + +static void metafile_write_create_callback (GnomeVFSAsyncHandle *handle, GnomeVFSResult result, gpointer callback_data) diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index ed64f132e..54acd704f 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -106,17 +106,6 @@ static gboolean request_is_satisfied (NautilusDirectory *directory, Request *request); static void -empty_close_callback (GnomeVFSAsyncHandle *handle, - GnomeVFSResult result, - gpointer callback_data) -{ - if (result != GNOME_VFS_OK) { - g_warning ("close failed"); - } - /* Do nothing. */ -} - -static void cancel_directory_counts (NautilusDirectory *directory) { if (directory->details->count_in_progress != NULL) { @@ -476,25 +465,26 @@ metafile_write_failed (NautilusDirectory *directory) } static void -metafile_write_callback (GnomeVFSAsyncHandle *handle, - GnomeVFSResult result, - gconstpointer buffer, - GnomeVFSFileSize bytes_requested, - GnomeVFSFileSize bytes_read, - gpointer callback_data) +metafile_write_failure_close_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + gpointer callback_data) { NautilusDirectory *directory; directory = NAUTILUS_DIRECTORY (callback_data); - g_assert (directory->details->metafile_write_state->handle == handle); - g_assert (directory->details->metafile_write_state->buffer == buffer); - g_assert (directory->details->metafile_write_state->size == bytes_requested); - g_assert (directory->details->metafile_write_state->handle != NULL); - gnome_vfs_async_close (directory->details->metafile_write_state->handle, - empty_close_callback, - directory); - directory->details->metafile_write_state->handle = NULL; + metafile_write_failed (directory); +} + +static void +metafile_write_success_close_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + gpointer callback_data) +{ + NautilusDirectory *directory; + + directory = NAUTILUS_DIRECTORY (callback_data); + g_assert (directory->details->metafile_write_state->handle == NULL); if (result != GNOME_VFS_OK) { metafile_write_failed (directory); @@ -515,6 +505,30 @@ metafile_write_callback (GnomeVFSAsyncHandle *handle, } static void +metafile_write_callback (GnomeVFSAsyncHandle *handle, + GnomeVFSResult result, + gconstpointer buffer, + GnomeVFSFileSize bytes_requested, + GnomeVFSFileSize bytes_read, + gpointer callback_data) +{ + NautilusDirectory *directory; + + directory = NAUTILUS_DIRECTORY (callback_data); + g_assert (directory->details->metafile_write_state->handle == handle); + g_assert (directory->details->metafile_write_state->buffer == buffer); + g_assert (directory->details->metafile_write_state->size == bytes_requested); + + g_assert (directory->details->metafile_write_state->handle != NULL); + gnome_vfs_async_close (directory->details->metafile_write_state->handle, + result == GNOME_VFS_OK + ? metafile_write_success_close_callback + : metafile_write_failure_close_callback, + directory); + directory->details->metafile_write_state->handle = NULL; +} + +static void metafile_write_create_callback (GnomeVFSAsyncHandle *handle, GnomeVFSResult result, gpointer callback_data) diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index 61d4f3849..2de6eb7ad 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -675,6 +675,8 @@ bonobo_control_activate_callback (BonoboObject *control, gboolean state, gpointe { FMDirectoryView *view; BonoboUIHandler *local_ui_handler; + Bonobo_UIHandler remote_ui_handler; + CORBA_Environment ev; g_assert (FM_IS_DIRECTORY_VIEW (user_data)); @@ -683,12 +685,12 @@ bonobo_control_activate_callback (BonoboObject *control, gboolean state, gpointe local_ui_handler = bonobo_control_get_ui_handler (BONOBO_CONTROL (control)); if (state) { - /* FIXME bugzilla.eazel.com 1259: - * Doesn't the remote UI handler leak here? - */ - bonobo_ui_handler_set_container - (local_ui_handler, - bonobo_control_get_remote_ui_handler (BONOBO_CONTROL (control))); + CORBA_exception_init (&ev); + remote_ui_handler = bonobo_control_get_remote_ui_handler (BONOBO_CONTROL (control)); + bonobo_ui_handler_set_container (local_ui_handler, remote_ui_handler); + Bonobo_UIHandler_unref (remote_ui_handler, &ev); + CORBA_Object_release (remote_ui_handler, &ev); + CORBA_exception_free (&ev); /* Add new menu items and perhaps whole menus */ fm_directory_view_merge_menus (view); diff --git a/src/nautilus-navigation-window-menus.c b/src/nautilus-navigation-window-menus.c index eb6fe2a23..68ebf7f60 100644 --- a/src/nautilus-navigation-window-menus.c +++ b/src/nautilus-navigation-window-menus.c @@ -644,12 +644,11 @@ append_bookmark_to_menu (NautilusWindow *window, bookmark_holder, (GDestroyNotify) bookmark_holder_free); /* Let's get notified whenever a bookmark changes. */ - gtk_signal_connect_object_while_alive - (GTK_OBJECT (bookmark), "changed", - is_bookmarks_menu - ? schedule_refresh_dynamic_bookmarks - : schedule_refresh_go_menu, - GTK_OBJECT (window)); + gtk_signal_connect_object (GTK_OBJECT (bookmark), "changed", + is_bookmarks_menu + ? schedule_refresh_dynamic_bookmarks + : schedule_refresh_go_menu, + GTK_OBJECT (window)); } static char * @@ -1419,6 +1418,22 @@ nautilus_window_remove_go_menu_callback (NautilusWindow *window) } } +void +nautilus_window_remove_bookmarks_menu_items (NautilusWindow *window) +{ + remove_bookmarks_after (window, + NAUTILUS_MENU_PATH_BOOKMARKS_MENU, + NAUTILUS_MENU_PATH_EDIT_BOOKMARKS_ITEM); +} + +void +nautilus_window_remove_go_menu_items (NautilusWindow *window) +{ + remove_bookmarks_after (window, + NAUTILUS_MENU_PATH_GO_MENU, + NAUTILUS_MENU_PATH_SEPARATOR_BEFORE_HISTORY); +} + static void append_dynamic_bookmarks (NautilusWindow *window) { diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index 5daffd60b..3fdc4fe04 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -469,7 +469,9 @@ nautilus_window_destroy (GtkObject *object) NULL); nautilus_window_remove_bookmarks_menu_callback (window); + nautilus_window_remove_bookmarks_menu_items (window); nautilus_window_remove_go_menu_callback (window); + nautilus_window_remove_go_menu_items (window); nautilus_window_toolbar_remove_theme_callback(); /* Disconnect view signals here so they don't trigger when diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c index 5daffd60b..3fdc4fe04 100644 --- a/src/nautilus-object-window.c +++ b/src/nautilus-object-window.c @@ -469,7 +469,9 @@ nautilus_window_destroy (GtkObject *object) NULL); nautilus_window_remove_bookmarks_menu_callback (window); + nautilus_window_remove_bookmarks_menu_items (window); nautilus_window_remove_go_menu_callback (window); + nautilus_window_remove_go_menu_items (window); nautilus_window_toolbar_remove_theme_callback(); /* Disconnect view signals here so they don't trigger when diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c index 5daffd60b..3fdc4fe04 100644 --- a/src/nautilus-spatial-window.c +++ b/src/nautilus-spatial-window.c @@ -469,7 +469,9 @@ nautilus_window_destroy (GtkObject *object) NULL); nautilus_window_remove_bookmarks_menu_callback (window); + nautilus_window_remove_bookmarks_menu_items (window); nautilus_window_remove_go_menu_callback (window); + nautilus_window_remove_go_menu_items (window); nautilus_window_toolbar_remove_theme_callback(); /* Disconnect view signals here so they don't trigger when diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c index eb6fe2a23..68ebf7f60 100644 --- a/src/nautilus-window-menus.c +++ b/src/nautilus-window-menus.c @@ -644,12 +644,11 @@ append_bookmark_to_menu (NautilusWindow *window, bookmark_holder, (GDestroyNotify) bookmark_holder_free); /* Let's get notified whenever a bookmark changes. */ - gtk_signal_connect_object_while_alive - (GTK_OBJECT (bookmark), "changed", - is_bookmarks_menu - ? schedule_refresh_dynamic_bookmarks - : schedule_refresh_go_menu, - GTK_OBJECT (window)); + gtk_signal_connect_object (GTK_OBJECT (bookmark), "changed", + is_bookmarks_menu + ? schedule_refresh_dynamic_bookmarks + : schedule_refresh_go_menu, + GTK_OBJECT (window)); } static char * @@ -1419,6 +1418,22 @@ nautilus_window_remove_go_menu_callback (NautilusWindow *window) } } +void +nautilus_window_remove_bookmarks_menu_items (NautilusWindow *window) +{ + remove_bookmarks_after (window, + NAUTILUS_MENU_PATH_BOOKMARKS_MENU, + NAUTILUS_MENU_PATH_EDIT_BOOKMARKS_ITEM); +} + +void +nautilus_window_remove_go_menu_items (NautilusWindow *window) +{ + remove_bookmarks_after (window, + NAUTILUS_MENU_PATH_GO_MENU, + NAUTILUS_MENU_PATH_SEPARATOR_BEFORE_HISTORY); +} + static void append_dynamic_bookmarks (NautilusWindow *window) { diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h index b026b5a9d..1b773205e 100644 --- a/src/nautilus-window-private.h +++ b/src/nautilus-window-private.h @@ -61,5 +61,7 @@ void nautilus_window_begin_location_change (Nautilus guint distance); void nautilus_window_remove_bookmarks_menu_callback (NautilusWindow *window); void nautilus_window_remove_go_menu_callback (NautilusWindow *window); +void nautilus_window_remove_bookmarks_menu_items (NautilusWindow *window); +void nautilus_window_remove_go_menu_items (NautilusWindow *window); #endif /* NAUTILUS_WINDOW_PRIVATE_H */ diff --git a/src/nautilus-window.c b/src/nautilus-window.c index 5daffd60b..3fdc4fe04 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -469,7 +469,9 @@ nautilus_window_destroy (GtkObject *object) NULL); nautilus_window_remove_bookmarks_menu_callback (window); + nautilus_window_remove_bookmarks_menu_items (window); nautilus_window_remove_go_menu_callback (window); + nautilus_window_remove_go_menu_items (window); nautilus_window_toolbar_remove_theme_callback(); /* Disconnect view signals here so they don't trigger when |