diff --git a/ChangeLog b/ChangeLog index e4bf33bf35b888606b0f6472f66fa08c1190c3f2..cf7160cb10c93839b91f5da048905feebe5b2a69 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-06-28 Christian Neumair + + * src/nautilus-window-manage-views.c + (nautilus_window_report_selection_changed), + (nautilus_window_report_load_underway), + (nautilus_window_report_load_complete), (free_location_change), + (nautilus_window_report_view_failed), + (nautilus_window_stop_loading): + * src/nautilus-window-private.h: + Stop loading of new view instead of just unreffing it when freeing a + location change. + Ignore view signals of new view when stopping it. Otherwise we'd have + infinite recursion. + 2008-06-28 Christian Neumair * libnautilus-private/nautilus-icon-container.c (keyboard_move_to), diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c index 7e815f551d6bb060ced94b02f5c30365659418bb..078e1ea8cfe921bc579aabbf6f92ebad2488f13e 100644 --- a/src/nautilus-window-manage-views.c +++ b/src/nautilus-window-manage-views.c @@ -114,6 +114,10 @@ static void remove_extra_location_widgets (NautilusWindow void nautilus_window_report_selection_changed (NautilusWindowInfo *window) { + if (window->details->temporarily_ignore_view_signals) { + return; + } + g_signal_emit_by_name (window, "selection_changed"); } @@ -1212,6 +1216,10 @@ void nautilus_window_report_load_underway (NautilusWindow *window, NautilusView *view) { + if (window->details->temporarily_ignore_view_signals) { + return; + } + g_assert (NAUTILUS_IS_WINDOW (window)); if (view == window->new_content_view) { @@ -1511,6 +1519,10 @@ void nautilus_window_report_load_complete (NautilusWindow *window, NautilusView *view) { + if (window->details->temporarily_ignore_view_signals) { + return; + } + g_assert (NAUTILUS_IS_WINDOW (window)); /* Only handle this if we're expecting it. @@ -1575,6 +1587,10 @@ free_location_change (NautilusWindow *window) } if (window->new_content_view != NULL) { + window->details->temporarily_ignore_view_signals = TRUE; + nautilus_view_stop_loading (window->new_content_view); + window->details->temporarily_ignore_view_signals = FALSE; + disconnect_view (window, window->new_content_view); g_object_unref (window->new_content_view); window->new_content_view = NULL; @@ -1613,8 +1629,12 @@ nautilus_window_report_view_failed (NautilusWindow *window, { gboolean do_close_window; GFile *fallback_load_location; - g_warning ("A view failed. The UI will handle this with a dialog but this should be debugged."); + if (window->details->temporarily_ignore_view_signals) { + return; + } + + g_warning ("A view failed. The UI will handle this with a dialog but this should be debugged."); do_close_window = FALSE; fallback_load_location = NULL; @@ -1761,7 +1781,9 @@ nautilus_window_stop_loading (NautilusWindow *window) nautilus_view_stop_loading (window->content_view); if (window->new_content_view != NULL) { + window->details->temporarily_ignore_view_signals = TRUE; nautilus_view_stop_loading (window->new_content_view); + window->details->temporarily_ignore_view_signals = FALSE; } cancel_location_change (window); diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h index 69eaac8851f2a9546735254988f7a266c4d03e6f..440cf35d8ceee2b36ce7c8db03320e6c58e8a126 100644 --- a/src/nautilus-window-private.h +++ b/src/nautilus-window-private.h @@ -103,6 +103,12 @@ struct NautilusWindowDetails gboolean search_mode; GCancellable *find_mount_cancellable; + + /* Ensures that we do not react on signals of a + * view that is re-used as new view when its loading + * is cancelled + */ + gboolean temporarily_ignore_view_signals; }; struct _NautilusNavigationWindowDetails {