Get the "Open in a New Window" shortcut right-click menu to actually

work (I had removed a line by mistake), and fix a crash that would
happen if user opened a new view, closed it and then created a new
folder.

svn path=/trunk/; revision=10657
This commit is contained in:
Ettore Perazzoli
2001-07-01 18:30:11 +00:00
parent 2a9973b6fb
commit ac60e853cb
3 changed files with 49 additions and 12 deletions

View File

@ -1,3 +1,25 @@
2001-07-01 Ettore Perazzoli <ettore@ximian.com>
* e-shell-view.c: Fixing a bug that could cause Evolution to crash
if a new ShellView was created and then destroyed, and then a new
folder would appear in the folder tree. Sigh, this code with the
delayed_selection is pretty messed up, but at least this will add
some consistency to it and make it safe.
(cleanup_delayed_selection): New function to disconnect the
"new_folder_cb" callback if the `delayed_selection' is not NULL,
and also free the `delayed_selection' itself.
(new_folder_cb): Use it.
(destroy): Call it here, otherwise we might [a] leak [b] cause a
crash as soon as a new folder appears in the folder tree, as
"new_folder" gets emitted and our connected signal handler has no
EShellView to handle the signal on.
(e_shell_view_display_uri): Call it here before re-setting the
`delayed_selection'.
* e-shortcuts-view.c (open_shortcut_in_new_window_cb): Add
invocation for `open_shortcut_helper()' back in [it was gone, for
unknown reasons].
2001-07-01 Ettore Perazzoli <ettore@ximian.com>
* e-storage-set-view.c (tree_drag_begin): If the node doesn't have

View File

@ -159,6 +159,10 @@ static void update_for_current_uri (EShellView *shell_view);
static void update_offline_toggle_status (EShellView *shell_view);
static const char *get_storage_set_path_from_uri (const char *uri);
/* Boo. */
static void new_folder_cb (EStorageSet *storage_set, const char *path, void *data);
/* Utility functions. */
@ -215,6 +219,22 @@ bonobo_widget_is_dead (BonoboWidget *bonobo_widget)
return is_dead;
}
static void
cleanup_delayed_selection (EShellView *shell_view)
{
EShellViewPrivate *priv;
priv = shell_view->priv;
if (priv->delayed_selection != NULL) {
g_free (priv->delayed_selection);
priv->delayed_selection = NULL;
gtk_signal_disconnect_by_func (GTK_OBJECT (e_shell_get_storage_set (priv->shell)),
GTK_SIGNAL_FUNC (new_folder_cb),
shell_view);
}
}
/* Folder bar pop-up handling. */
@ -400,8 +420,6 @@ pop_up_folder_bar (EShellView *shell_view)
/* Switching views on a tree view click. */
static void new_folder_cb (EStorageSet *storage_set, const char *path, void *data);
static int
set_folder_timeout (gpointer data)
{
@ -437,13 +455,7 @@ switch_on_folder_tree_click (EShellView *shell_view,
gtk_timeout_remove (priv->set_folder_timeout);
g_free (priv->set_folder_uri);
if (priv->delayed_selection) {
g_free (priv->delayed_selection);
priv->delayed_selection = NULL;
gtk_signal_disconnect_by_func (GTK_OBJECT (e_shell_get_storage_set (priv->shell)),
GTK_SIGNAL_FUNC (new_folder_cb),
shell_view);
}
cleanup_delayed_selection (shell_view);
if (priv->folder_bar_mode == E_SHELL_VIEW_SUBWINDOW_TRANSIENT) {
e_shell_view_display_uri (shell_view, uri);
@ -482,8 +494,8 @@ new_folder_cb (EStorageSet *storage_set,
GTK_SIGNAL_FUNC (new_folder_cb),
shell_view);
g_free (priv->uri);
priv->uri = priv->delayed_selection;
priv->delayed_selection = NULL;
priv->uri = g_strdup (priv->delayed_selection);
cleanup_delayed_selection (shell_view);
e_shell_view_display_uri (shell_view, priv->uri);
}
}
@ -915,6 +927,8 @@ destroy (GtkObject *object)
g_free (priv->uri);
cleanup_delayed_selection (shell_view);
if (priv->set_folder_timeout != 0)
gtk_timeout_remove (priv->set_folder_timeout);
@ -1847,6 +1861,7 @@ e_shell_view_display_uri (EShellView *shell_view,
g_assert (GTK_IS_WIDGET (control));
show_existing_view (shell_view, uri, control);
} else if (create_new_view_for_uri (shell_view, uri)) {
cleanup_delayed_selection (shell_view);
priv->delayed_selection = g_strdup (uri);
gtk_signal_connect_after (GTK_OBJECT (e_shell_get_storage_set (priv->shell)), "new_folder",
GTK_SIGNAL_FUNC (new_folder_cb), shell_view);

View File

@ -408,7 +408,7 @@ static void
open_shortcut_in_new_window_cb (GtkWidget *widget,
void *data)
{
open_shortcut_helper ((ShortcutRightClickMenuData *) data, TRUE);
}