summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarin Adler <darin@src.gnome.org>2000-08-05 00:33:18 +0000
committerDarin Adler <darin@src.gnome.org>2000-08-05 00:33:18 +0000
commit28c05cd26139f5b3b80afe8fc43500070aa94165 (patch)
treee5a8c43921781a064124a0ef9d440f128bbf1084
parenta32b5735007b8ea52d0e2fa154301a1c9efe56b0 (diff)
downloadnautilus-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--ChangeLog25
-rw-r--r--libnautilus-extensions/nautilus-directory-async.c64
-rw-r--r--libnautilus-private/nautilus-directory-async.c64
-rw-r--r--src/file-manager/fm-directory-view.c14
-rw-r--r--src/nautilus-navigation-window-menus.c27
-rw-r--r--src/nautilus-navigation-window.c2
-rw-r--r--src/nautilus-object-window.c2
-rw-r--r--src/nautilus-spatial-window.c2
-rw-r--r--src/nautilus-window-menus.c27
-rw-r--r--src/nautilus-window-private.h2
-rw-r--r--src/nautilus-window.c2
11 files changed, 163 insertions, 68 deletions
diff --git a/ChangeLog b/ChangeLog
index 3e53d8e1e..f8ecb406e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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