From cb0ed210287eb3f4b81376a0cbe72661af0f7756 Mon Sep 17 00:00:00 2001 From: Ettore Perazzoli Date: Thu, 18 Oct 2001 19:58:22 +0000 Subject: Fix the WM problems related to the folder selection dialog being out-of-proc. Now it can be set to be a transient window correctly, and fakes its WindowGroup hint appropriately. svn path=/trunk/; revision=13765 --- e-util/ChangeLog | 4 ++++ e-util/e-dialog-utils.c | 18 ++++++++++++++++ e-util/e-dialog-utils.h | 8 +++++-- filter/ChangeLog | 6 ++++++ filter/filter-folder.c | 1 + filter/vfolder-rule.c | 1 + mail/ChangeLog | 6 ++++++ mail/mail-account-gui.c | 4 +++- mail/mail-callbacks.c | 4 +++- shell/ChangeLog | 11 ++++++++++ shell/Evolution-Shell.idl | 4 +++- shell/Makefile.am | 2 ++ shell/e-shell.c | 47 +++++++++++++++++++++++++++++++++++++++++- shell/evolution-shell-client.c | 13 ++++++++++-- shell/evolution-shell-client.h | 2 ++ 15 files changed, 123 insertions(+), 8 deletions(-) diff --git a/e-util/ChangeLog b/e-util/ChangeLog index fed6610258..6a41fd9f8e 100644 --- a/e-util/ChangeLog +++ b/e-util/ChangeLog @@ -1,3 +1,7 @@ +2001-10-17 Ettore Perazzoli + + * e-dialog-utils.c (e_set_dialog_parent_from_xid): New. + 2001-10-12 Chris Toshok * e-passwords.h: new parameter to e_passwords_init, and add diff --git a/e-util/e-dialog-utils.c b/e-util/e-dialog-utils.c index 0a6bf13386..68f0abfde8 100644 --- a/e-util/e-dialog-utils.c +++ b/e-util/e-dialog-utils.c @@ -147,3 +147,21 @@ e_set_dialog_parent (GtkWindow *dialog, gdk_window = gdk_window_foreign_new (xid); set_transient_for_gdk (dialog, gdk_window); } + +/** + * e_set_dialog_parent_from_xid: + * @dialog: + * @xid: + * + * Like %e_set_dialog_parent_from_xid, but use an XID to specify the parent + * window. + **/ +void +e_set_dialog_parent_from_xid (GtkWindow *dialog, + Window xid) +{ + g_return_if_fail (dialog != NULL); + g_return_if_fail (GTK_IS_WINDOW (dialog)); + + set_transient_for_gdk (dialog, gdk_window_foreign_new (xid)); +} diff --git a/e-util/e-dialog-utils.h b/e-util/e-dialog-utils.h index 578ea0d585..b92808d386 100644 --- a/e-util/e-dialog-utils.h +++ b/e-util/e-dialog-utils.h @@ -27,7 +27,11 @@ #include #include -void e_set_dialog_parent (GtkWindow *dialog, - GtkWidget *parent_widget); +#include /* Window */ + +void e_set_dialog_parent (GtkWindow *dialog, + GtkWidget *parent_widget); +void e_set_dialog_parent_from_xid (GtkWindow *dialog, + Window xid); #endif diff --git a/filter/ChangeLog b/filter/ChangeLog index faf77c3f95..63685b71cb 100644 --- a/filter/ChangeLog +++ b/filter/ChangeLog @@ -1,3 +1,9 @@ +2001-10-17 Ettore Perazzoli + + * filter-folder.c (button_clicked): Pass the toplevel to + `evolution_shell_client_user_select_folder()'. + * vfolder-rule.c (source_add): Likewise. + 2001-10-15 Jeffrey Stedfast * filter-folder.c (button_clicked): Kludge to raise the filter diff --git a/filter/filter-folder.c b/filter/filter-folder.c index 1d231e7bdf..2bcf6e58cd 100644 --- a/filter/filter-folder.c +++ b/filter/filter-folder.c @@ -229,6 +229,7 @@ button_clicked (GtkButton *button, FilterFolder *ff) def = ff->uri ? ff->uri : ""; evolution_shell_client_user_select_folder (global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))), _("Select Folder"), def, allowed_types, &evolution_uri, diff --git a/filter/vfolder-rule.c b/filter/vfolder-rule.c index b3b1f3f082..5108f83809 100644 --- a/filter/vfolder-rule.c +++ b/filter/vfolder-rule.c @@ -353,6 +353,7 @@ source_add(GtkWidget *widget, struct _source_data *data) def = ""; evolution_shell_client_user_select_folder (global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (widget)), _("Select Folder"), def, allowed_types, NULL, &uri); diff --git a/mail/ChangeLog b/mail/ChangeLog index abbeb326df..53accab1ae 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,9 @@ +2001-10-17 Ettore Perazzoli + + * mail-account-gui.c (folder_picker_clicked): Pass the toplevel to + `evolution_shell_client_user_select_folder()'. + * mail-callbacks.c (transfer_msg): Likewise. + 2001-10-18 * mail-send-recv.c (build_dialogue): call setup_send_data *after* diff --git a/mail/mail-account-gui.c b/mail/mail-account-gui.c index 30a7ec1ea5..78339bad69 100644 --- a/mail/mail-account-gui.c +++ b/mail/mail-account-gui.c @@ -819,7 +819,9 @@ folder_picker_clicked (GtkButton *button, gpointer user_data) physical_uri = evolution_uri = NULL; evolution_shell_client_user_select_folder ( - global_shell_client, _("Select Folder"), folder->uri, + global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))), + _("Select Folder"), folder->uri, allowed_types, &evolution_uri, &physical_uri); if (!physical_uri || !*physical_uri) { g_free (physical_uri); diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 2a4c9d227c..ff14c1b16a 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -1242,7 +1242,9 @@ transfer_msg (GtkWidget *widget, gpointer user_data, gboolean delete_from_source else desc = _("Copy message(s) to"); - evolution_shell_client_user_select_folder (global_shell_client, desc, last, + evolution_shell_client_user_select_folder (global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (widget)), + desc, last, allowed_types, &uri, &physical); if (!uri) return; diff --git a/shell/ChangeLog b/shell/ChangeLog index ab0dc96a8c..af878b1b36 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,14 @@ +2001-10-17 Ettore Perazzoli + + * e-shell.c (impl_Shell_selectUserFolder): Set the parent + according to the XID we get. + + * Evolution-Shell.idl: New arg @parent_xid in `::selectUserFolder'. + + * evolution-shell-client.c + (evolution_shell_client_user_select_folder): New arg @parent. + (user_select_folder): Likewise. Pass it to the CORBA method. + 2001-10-17 Ettore Perazzoli * main.c (idle_cb): Urgh. Remove stale line that caused diff --git a/shell/Evolution-Shell.idl b/shell/Evolution-Shell.idl index a7700c38d2..aa8ef84296 100644 --- a/shell/Evolution-Shell.idl +++ b/shell/Evolution-Shell.idl @@ -64,6 +64,7 @@ module Evolution { /** * selectUserFolder: + * @parent_xid: XID for the parent window (or zero if no parent window). * @listener: a listener interface to report the answer of the user. * @title: title for the folder selector dialog * @default_folder: physical or `evolution:' URI for the folder that must be @@ -75,7 +76,8 @@ module Evolution { * folder by using the "New..." button. The dialog only lets the user choose * a folder whose type is listed in @possible_types. */ - void selectUserFolder (in FolderSelectionListener listener, + void selectUserFolder (in long long parent_xid, + in FolderSelectionListener listener, in string title, in string default_folder, in FolderTypeNameList possible_types, diff --git a/shell/Makefile.am b/shell/Makefile.am index 8829330db2..2a060e9067 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -117,6 +117,8 @@ evolution_SOURCES = \ e-local-storage.h \ e-setup.c \ e-setup.h \ + e-shell-about-box.c \ + e-shell-about-box.h \ e-shell-constants.h \ e-shell-folder-commands.c \ e-shell-folder-commands.h \ diff --git a/shell/e-shell.c b/shell/e-shell.c index 6e97a6ff01..510fbe14a3 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -26,8 +26,13 @@ #endif #include + #include #include +#include + +#include + #include #include #include @@ -44,6 +49,8 @@ #include "Evolution.h" +#include "e-util/e-dialog-utils.h" + #include "e-activity-handler.h" #include "e-component-registry.h" #include "e-corba-shortcuts.h" @@ -372,6 +379,7 @@ corba_listener_destroy_notify (void *data) static void impl_Shell_selectUserFolder (PortableServer_Servant servant, + const CORBA_long_long parent_xid, const GNOME_Evolution_FolderSelectionListener listener, const CORBA_char *title, const CORBA_char *default_folder, @@ -407,6 +415,7 @@ impl_Shell_selectUserFolder (PortableServer_Servant servant, allowed_type_names, default_type); + listener_duplicate = CORBA_Object_duplicate (listener, ev); gtk_object_set_data_full (GTK_OBJECT (folder_selection_dialog), "corba_listener", listener_duplicate, corba_listener_destroy_notify); @@ -416,7 +425,43 @@ impl_Shell_selectUserFolder (PortableServer_Servant servant, gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "cancelled", GTK_SIGNAL_FUNC (folder_selection_dialog_cancelled_cb), shell); - gtk_widget_show (folder_selection_dialog); + if (parent_xid == 0) { + gtk_widget_show (folder_selection_dialog); + } else { + XClassHint class_hints; + XWMHints *parent_wm_hints; + int format; + + /* Set the WM class and the WindowGroup hint to be the same as + the foreign parent window's. This way smartass window + managers like Sawfish don't get confused. */ + + e_set_dialog_parent_from_xid (GTK_WINDOW (folder_selection_dialog), parent_xid); + + XGetClassHint (GDK_DISPLAY (), (Window) parent_xid, &class_hints); + + gtk_window_set_wmclass (GTK_WINDOW (folder_selection_dialog), + class_hints.res_name, class_hints.res_class); + + gtk_widget_show (folder_selection_dialog); + + while (folder_selection_dialog->window == NULL) + gtk_main_iteration (); + + parent_wm_hints = XGetWMHints (GDK_DISPLAY (), (Window) parent_xid); + + if (parent_wm_hints->flags & WindowGroupHint) { + XWMHints *wm_hints; + + wm_hints = XAllocWMHints (); + wm_hints->flags = WindowGroupHint; + wm_hints->window_group = parent_wm_hints->window_group; + XSetWMHints (GDK_DISPLAY (), GDK_WINDOW_XWINDOW (folder_selection_dialog->window), wm_hints); + XFree (wm_hints); + } + + XFree (parent_wm_hints); + } } static GNOME_Evolution_Storage diff --git a/shell/evolution-shell-client.c b/shell/evolution-shell-client.c index d71deff91f..3667d4bb4c 100644 --- a/shell/evolution-shell-client.c +++ b/shell/evolution-shell-client.c @@ -25,7 +25,9 @@ #include #endif +#include #include + #include #include @@ -196,6 +198,7 @@ count_string_items (const char *list[]) static void user_select_folder (EvolutionShellClient *shell_client, + GtkWindow *parent, const char *title, const char *default_folder, const char *possible_types[], @@ -206,6 +209,7 @@ user_select_folder (EvolutionShellClient *shell_client, GNOME_Evolution_Shell corba_shell; CORBA_Environment ev; GNOME_Evolution_Shell_FolderTypeNameList corba_type_name_list; + CORBA_long_long parent_xid; int num_possible_types; char *result; @@ -231,7 +235,9 @@ user_select_folder (EvolutionShellClient *shell_client, corba_type_name_list._maximum = num_possible_types; corba_type_name_list._buffer = (CORBA_char **) possible_types; - GNOME_Evolution_Shell_selectUserFolder (corba_shell, listener_interface, + parent_xid = (CORBA_long_long) GDK_WINDOW_XWINDOW (GTK_WIDGET (parent)->window); + + GNOME_Evolution_Shell_selectUserFolder (corba_shell, parent_xid, listener_interface, title, default_folder, &corba_type_name_list, "", &ev); @@ -368,6 +374,7 @@ evolution_shell_client_new (GNOME_Evolution_Shell corba_shell) /** * evolution_shell_client_user_select_folder: * @shell_client: A EvolutionShellClient object + * @parent: Parent window for the dialog (must be realized when invoking) * @title: The title for the folder selection dialog * @default_folder: URI (physical or evolution:) of the folder initially selected on the dialog * @uri_return: @@ -380,6 +387,7 @@ evolution_shell_client_new (GNOME_Evolution_Shell corba_shell) **/ void evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client, + GtkWindow *parent, const char *title, const char *default_folder, const char *possible_types[], @@ -390,8 +398,9 @@ evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client, g_return_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client)); g_return_if_fail (title != NULL); g_return_if_fail (default_folder != NULL); + g_return_if_fail (parent == NULL || GTK_WIDGET_REALIZED (parent)); - user_select_folder (shell_client, title, default_folder, possible_types, + user_select_folder (shell_client, parent, title, default_folder, possible_types, uri_return, physical_uri_return); } diff --git a/shell/evolution-shell-client.h b/shell/evolution-shell-client.h index f4fd194f58..e6a86af843 100644 --- a/shell/evolution-shell-client.h +++ b/shell/evolution-shell-client.h @@ -25,6 +25,7 @@ #define __EVOLUTION_SHELL_CLIENT_H__ #include +#include #include "Evolution.h" @@ -61,6 +62,7 @@ void evolution_shell_client_construct (EvolutionShe EvolutionShellClient *evolution_shell_client_new (GNOME_Evolution_Shell shell); void evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client, + GtkWindow *parent, const char *title, const char *default_folder, const char *possible_types[], -- cgit v1.2.3