aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--shell/ChangeLog15
-rw-r--r--shell/e-shell-folder-selection-dialog.c17
-rw-r--r--shell/e-shell.c3
-rw-r--r--shell/evolution-folder-selector-button.c37
4 files changed, 40 insertions, 32 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index b3266618b9..17fe672815 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,5 +1,20 @@
2003-04-07 Dan Winship <danw@ximian.com>
+ * evolution-folder-selector-button.c (clicked): Desensitize the
+ window's top-level container rather than desensitizing the window
+ itself, which causes strange problems [#40854]. Also fix up the
+ code that tries to watch for the parent window being destroyed.
+
+ * e-shell.c (impl_Shell_selectUserFolder): Use
+ e_dialog_set_transient_for_xid.
+
+ * e-shell-folder-selection-dialog.c (impl_response): Treat
+ GTK_RESPONSE_DELETE_EVENT the same as GTK_RESPONSE_CANCEL.
+ (e_shell_folder_selection_dialog_construct): No need to catch
+ "delete_event" signal.
+
+2003-04-07 Dan Winship <danw@ximian.com>
+
* Makefile.am ($(server_in_files)): Substitute version number into
the evolution binary name in the server file
(INCLUDES): define EVOLUTION_TOOLSDIR
diff --git a/shell/e-shell-folder-selection-dialog.c b/shell/e-shell-folder-selection-dialog.c
index 69b3f5cb0d..962d145ca3 100644
--- a/shell/e-shell-folder-selection-dialog.c
+++ b/shell/e-shell-folder-selection-dialog.c
@@ -240,6 +240,7 @@ impl_response (GtkDialog *dialog,
break;
case GTK_RESPONSE_CANCEL:
+ case GTK_RESPONSE_DELETE_EVENT:
g_signal_emit (folder_selection_dialog, signals[CANCELLED], 0);
gtk_widget_destroy (GTK_WIDGET (dialog));
break;
@@ -267,9 +268,6 @@ impl_response (GtkDialog *dialog,
g_free (default_type);
break;
-
- default: /* WM close button */
- gtk_widget_destroy (GTK_WIDGET (dialog));
}
}
@@ -344,16 +342,6 @@ folder_selected_cb (EStorageSetView *storage_set_view,
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
}
-static gint
-delete_event_cb (GtkWidget *w, GdkEvent *event, gpointer data)
-{
- EShellFolderSelectionDialog *dialog = data;
-
- g_signal_emit (dialog, signals[CANCELLED], 0);
-
- return TRUE;
-}
-
static void
double_click_cb (EStorageSetView *essv,
int row,
@@ -411,9 +399,6 @@ e_shell_folder_selection_dialog_construct (EShellFolderSelectionDialog *folder_s
gtk_window_set_modal (GTK_WINDOW (folder_selection_dialog), TRUE);
gtk_window_set_title (GTK_WINDOW (folder_selection_dialog), title);
- g_signal_connect (folder_selection_dialog, "delete_event",
- G_CALLBACK (delete_event_cb), folder_selection_dialog);
-
if (allow_creation)
gtk_dialog_add_buttons (GTK_DIALOG (folder_selection_dialog),
GTK_STOCK_NEW, RESPONSE_NEW,
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 826178413f..f8b1f2df89 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -550,6 +550,9 @@ impl_Shell_selectUserFolder (PortableServer_Servant servant,
g_signal_connect (folder_selection_dialog, "cancelled",
G_CALLBACK (folder_selection_dialog_cancelled_cb), shell);
+ if (parent_xid)
+ e_dialog_set_transient_for_xid (GTK_WINDOW (folder_selection_dialog), parent_xid);
+
#if NASTY_HACK_FOR_OUT_OF_PROC_COMPONENTS
if (parent_xid == 0) {
gtk_widget_show (folder_selection_dialog);
diff --git a/shell/evolution-folder-selector-button.c b/shell/evolution-folder-selector-button.c
index 0a01874c06..f3b9ab6179 100644
--- a/shell/evolution-folder-selector-button.c
+++ b/shell/evolution-folder-selector-button.c
@@ -142,15 +142,26 @@ clicked (GtkButton *button)
EvolutionFolderSelectorButton *folder_selector_button;
EvolutionFolderSelectorButtonPrivate *priv;
GNOME_Evolution_Folder *return_folder;
+ GtkWidget *toplevel_container;
GtkWindow *parent_window;
char *initial_uri;
- parent_window = (GtkWindow *)
- gtk_widget_get_ancestor (GTK_WIDGET (button),
- GTK_TYPE_WINDOW);
+ /* We want to disable the window the button is in, since the
+ * folder selection dialog may be in another process and the WM
+ * won't enforce modality cross-process. In Evo 1.2, this code
+ * called gtk_widget_set_sensitive on the button's parent
+ * window, but in GNOME 2 that seems to cause bad things to
+ * happen (the window doesn't resensitize properly at the end).
+ * So we desensitize the top-level container inside the window
+ * instead.
+ */
+ toplevel_container = GTK_WIDGET (button);
+ while (toplevel_container->parent &&
+ !GTK_IS_WINDOW (toplevel_container->parent))
+ toplevel_container = toplevel_container->parent;
+ parent_window = (GtkWindow *)toplevel_container->parent;
- gtk_widget_set_sensitive (GTK_WIDGET (parent_window), FALSE);
- g_object_ref (parent_window);
+ gtk_widget_set_sensitive (GTK_WIDGET (toplevel_container), FALSE);
folder_selector_button = EVOLUTION_FOLDER_SELECTOR_BUTTON (button);
priv = folder_selector_button->priv;
@@ -162,7 +173,7 @@ clicked (GtkButton *button)
g_signal_emit (folder_selector_button, signals[POPPED_UP], 0);
- g_object_add_weak_pointer (G_OBJECT (parent_window), (void **) &parent_window);
+ g_object_add_weak_pointer (G_OBJECT (button), (void **) &button);
evolution_shell_client_user_select_folder (priv->shell_client,
parent_window,
@@ -171,18 +182,12 @@ clicked (GtkButton *button)
(const char **)priv->possible_types,
&return_folder);
- g_object_remove_weak_pointer (G_OBJECT (parent_window), (void **) &parent_window);
-
- /* If the parent gets destroyed despite our best efforts (eg,
- * because its own parent got destroyed), then the folder
- * selector button will have been destroyed too and we need
- * to just bail out here.
- */
- if (parent_window == NULL)
+ /* Bail out if the parent window was destroyed */
+ if (button == NULL)
return;
+ g_object_remove_weak_pointer (G_OBJECT (button), (void **) &button);
- gtk_widget_set_sensitive (GTK_WIDGET (parent_window), TRUE);
- g_object_unref (parent_window);
+ gtk_widget_set_sensitive (GTK_WIDGET (toplevel_container), TRUE);
if (!return_folder) {
g_signal_emit (folder_selector_button, signals[CANCELED], 0);