From ed458bfc2a20b5de9b95834dcf4a2e764f0f270e Mon Sep 17 00:00:00 2001 From: Ettore Perazzoli Date: Mon, 4 Dec 2000 16:09:27 +0000 Subject: New `createNewView' method in `Evolution::Shell'. Register the shell at startup; if a shell is already registered, use this CORBA method to make it open a new view and exit. Also, fixed a missing ref problem with EShortcut (it used to crash on exit when more than one view was open). svn path=/trunk/; revision=6774 --- shell/ChangeLog | 41 ++++++++++++++ shell/Evolution-Shell.idl | 8 +++ shell/GNOME_Evolution_Shell.oaf.in | 15 +++++ shell/GNOME_Evolution_Shell.oafinfo | 15 +++++ shell/Makefile.am | 7 ++- shell/e-shell-view.c | 63 +++++++++++++++------ shell/e-shell-view.h | 37 +++++++------ shell/e-shell.c | 106 ++++++++++++++++++++++++++---------- shell/e-shell.h | 29 ++++++---- shell/e-shortcuts-view.c | 2 + shell/evolution.oafinfo | 15 +++++ shell/main.c | 39 +++++++++++-- 12 files changed, 296 insertions(+), 81 deletions(-) create mode 100644 shell/GNOME_Evolution_Shell.oaf.in create mode 100644 shell/GNOME_Evolution_Shell.oafinfo create mode 100644 shell/evolution.oafinfo (limited to 'shell') diff --git a/shell/ChangeLog b/shell/ChangeLog index 5673ecb114..df600ac65c 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,44 @@ +2000-12-04 Ettore Perazzoli + + * e-shortcuts-view.c (e_shortcuts_view_construct): Ref the + shortcuts. + + * main.c (new_view_on_running_shell): New. + (idle_cb): If the shell cannot be created, then call + `new_view_on_running_shell'. + + * e-shell-view.c: New member `shell_view_interface' in + `EShellViewPrivate'. + (init): Init to NULL. + (setup_evolution_shell_view_interface): Set up. + (destroy): Unref. + + * e-shell.c (impl_Shell_getComponentByType): Renamed from + `impl_Shell_get_component_for_type'. + (impl_Shell_selectUserFolder): Renamed from + `impl_Shell_user_select_folder'. + (impl_Shell_getLocalStorage): Renamed from + `impl_Shell_get_local_storage'. + (impl_Shell_createStorageSetView): Renamed from + `impl_Shell_create_storage_set_view'. + (corba_class_init): Updated accordingly. + (impl_Shell_createNewView): New, implementation for the + `createNewView' CORBA method. + (corba_class_init): Install it. + + * Evolution-Shell.idl: New method `::createNewView'. + + * e-shell.c (register_shell): New. + (e_shell_construct): Return value changed to `gboolean'. New arg + @iid. Construct the Bonobo object before displaying the splash, + then try to register it with the specified @iid. If registration + fails, return %FALSE. Otherwise, just do everything normally and + return %TRUE. + (e_shell_new): Pass the OAFIID to `e_shell_construct()'. If it + fails, unref the object and return NULL. + + * evolution.oafinfo: New. + 2000-11-27 JP Rosevear * e-shell-view-menu.c (command_about_box): Add myself, anna, jesse diff --git a/shell/Evolution-Shell.idl b/shell/Evolution-Shell.idl index 7a06d902d4..f2124c40c8 100644 --- a/shell/Evolution-Shell.idl +++ b/shell/Evolution-Shell.idl @@ -34,6 +34,14 @@ module Evolution { typedef sequence FolderTypeList; + /** + * createNewView: + * @uri: URI for the view to open + * + * Return value: the new view. + */ + ShellView createNewView (in string uri); + /** * selectUserFolder: * @listener: a listener interface to report the answer of the user. diff --git a/shell/GNOME_Evolution_Shell.oaf.in b/shell/GNOME_Evolution_Shell.oaf.in new file mode 100644 index 0000000000..3f84707c93 --- /dev/null +++ b/shell/GNOME_Evolution_Shell.oaf.in @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/shell/GNOME_Evolution_Shell.oafinfo b/shell/GNOME_Evolution_Shell.oafinfo new file mode 100644 index 0000000000..3f84707c93 --- /dev/null +++ b/shell/GNOME_Evolution_Shell.oafinfo @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/shell/Makefile.am b/shell/Makefile.am index beb9ccbcbc..5e2c3e9a34 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -13,8 +13,6 @@ INCLUDES = \ -DEVOLUTION_GLADEDIR=\"$(datadir)/evolution/glade\" \ -DG_LOG_DOMAIN=\"evolution-shell\" -EXTRA_DIST = $(IDLS) - CLEANFILES = $(IDL_GENERATED) # CORBA stuff @@ -141,6 +139,11 @@ evolution_LDADD = \ $(GNOME_PRINT_LIBS) \ $(BONOBO_GNOME_LIBS) +oafdir = $(datadir)/oaf +oaf_DATA = evolution.oafinfo + +EXTRA_DIST = $(IDLS) $(oaf_DATA) + # Purify support if ENABLE_PURIFY diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c index 774de785d4..884396d149 100644 --- a/shell/e-shell-view.c +++ b/shell/e-shell-view.c @@ -62,6 +62,10 @@ struct _EShellViewPrivate { /* The shell. */ EShell *shell; + /* EvolutionShellView Bonobo object for implementing the + Evolution::ShellView interface. */ + EvolutionShellView *corba_interface; + /* The UI handler. */ BonoboUIComponent *ui_component; @@ -555,6 +559,9 @@ destroy (GtkObject *object) shell_view = E_SHELL_VIEW (object); priv = shell_view->priv; + if (priv->corba_interface != NULL) + bonobo_object_unref (BONOBO_OBJECT (priv->corba_interface)); + for (p = priv->sockets; p != NULL; p = p->next) { GtkWidget *socket_widget; int destroy_connection_id; @@ -636,6 +643,7 @@ init (EShellView *shell_view) priv = g_new (EShellViewPrivate, 1); priv->shell = NULL; + priv->corba_interface = NULL; priv->ui_component = NULL; priv->uri = NULL; priv->delayed_selection = NULL; @@ -735,7 +743,7 @@ stop_progress_bar (EShellView *shell_view) /* EvolutionShellView interface callbacks. */ static void -shell_view_interface_set_message_cb (EvolutionShellView *shell_view, +corba_interface_set_message_cb (EvolutionShellView *shell_view, const char *message, gboolean busy, void *data) @@ -770,7 +778,7 @@ shell_view_interface_set_message_cb (EvolutionShellView *shell_view, } static void -shell_view_interface_unset_message_cb (EvolutionShellView *shell_view, +corba_interface_unset_message_cb (EvolutionShellView *shell_view, void *data) { EShellView *view; @@ -785,7 +793,7 @@ shell_view_interface_unset_message_cb (EvolutionShellView *shell_view, } static void -shell_view_interface_change_current_view_cb (EvolutionShellView *shell_view, +corba_interface_change_current_view_cb (EvolutionShellView *shell_view, const char *uri, void *data) { @@ -799,7 +807,7 @@ shell_view_interface_change_current_view_cb (EvolutionShellView *shell_view, } static void -shell_view_interface_set_title (EvolutionShellView *shell_view, +corba_interface_set_title (EvolutionShellView *shell_view, const char *title, void *data) { @@ -895,6 +903,19 @@ e_shell_view_new (EShell *shell) return e_shell_view_construct (E_SHELL_VIEW (new), shell); } +const GNOME_Evolution_ShellView +e_shell_view_get_corba_interface (EShellView *shell_view) +{ + EShellViewPrivate *priv; + + g_return_val_if_fail (shell_view != NULL, CORBA_OBJECT_NIL); + g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), CORBA_OBJECT_NIL); + + priv = shell_view->priv; + + return bonobo_object_corba_objref (BONOBO_OBJECT (priv->corba_interface)); +} + static const char * get_storage_set_path_from_uri (const char *uri) @@ -1080,30 +1101,36 @@ set_current_notebook_page (EShellView *shell_view, } static void -setup_evolution_shell_view_interface (EShellView *shell_view, - GtkWidget *control) +setup_corba_interface (EShellView *shell_view, + GtkWidget *control) { + EShellViewPrivate *priv; BonoboControlFrame *control_frame; - EvolutionShellView *shell_view_interface; + EvolutionShellView *corba_interface; + + priv = shell_view->priv; control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (control)); - shell_view_interface = evolution_shell_view_new (); + corba_interface = evolution_shell_view_new (); - gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "set_message", - GTK_SIGNAL_FUNC (shell_view_interface_set_message_cb), + gtk_signal_connect_while_alive (GTK_OBJECT (corba_interface), "set_message", + GTK_SIGNAL_FUNC (corba_interface_set_message_cb), shell_view, GTK_OBJECT (shell_view)); - gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "unset_message", - GTK_SIGNAL_FUNC (shell_view_interface_unset_message_cb), + gtk_signal_connect_while_alive (GTK_OBJECT (corba_interface), "unset_message", + GTK_SIGNAL_FUNC (corba_interface_unset_message_cb), shell_view, GTK_OBJECT (shell_view)); - gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "change_current_view", - GTK_SIGNAL_FUNC (shell_view_interface_change_current_view_cb), + gtk_signal_connect_while_alive (GTK_OBJECT (corba_interface), "change_current_view", + GTK_SIGNAL_FUNC (corba_interface_change_current_view_cb), shell_view, GTK_OBJECT (shell_view)); - gtk_signal_connect_while_alive (GTK_OBJECT (shell_view_interface), "set_title", - GTK_SIGNAL_FUNC (shell_view_interface_set_title), + gtk_signal_connect_while_alive (GTK_OBJECT (corba_interface), "set_title", + GTK_SIGNAL_FUNC (corba_interface_set_title), shell_view, GTK_OBJECT (shell_view)); bonobo_object_add_interface (BONOBO_OBJECT (control_frame), - BONOBO_OBJECT (shell_view_interface)); + BONOBO_OBJECT (corba_interface)); + + bonobo_object_ref (BONOBO_OBJECT (corba_interface)); + priv->corba_interface = corba_interface; } @@ -1250,7 +1277,7 @@ get_control_for_uri (EShellView *shell_view, priv->sockets = g_list_prepend (priv->sockets, socket); - setup_evolution_shell_view_interface (shell_view, control); + setup_corba_interface (shell_view, control); return control; } diff --git a/shell/e-shell-view.h b/shell/e-shell-view.h index d3eb889fec..520f9842a3 100644 --- a/shell/e-shell-view.h +++ b/shell/e-shell-view.h @@ -70,30 +70,33 @@ struct _EShellViewClass { }; -GtkType e_shell_view_get_type (void); -EShellView *e_shell_view_construct (EShellView *shell_view, - EShell *shell); -EShellView *e_shell_view_new (EShell *shell); +GtkType e_shell_view_get_type (void); +EShellView *e_shell_view_construct (EShellView *shell_view, + EShell *shell); +EShellView *e_shell_view_new (EShell *shell); -gboolean e_shell_view_display_uri (EShellView *shell_view, - const char *uri); +const GNOME_Evolution_ShellView e_shell_view_get_corba_interface (EShellView *view); + +gboolean e_shell_view_display_uri (EShellView *shell_view, + const char *uri); void e_shell_view_set_shortcut_bar_mode (EShellView *shell_view, EShellViewSubwindowMode mode); -void e_shell_view_set_folder_bar_mode (EShellView *shell_view, - EShellViewSubwindowMode mode); EShellViewSubwindowMode e_shell_view_get_shortcut_bar_mode (EShellView *shell_view); -EShellViewSubwindowMode e_shell_view_get_folder_bar_mode (EShellView *shell_view); -EShell *e_shell_view_get_shell (EShellView *shell_view); -BonoboUIComponent *e_shell_view_get_bonobo_ui_component(EShellView *shell_view); -GtkWidget *e_shell_view_get_appbar (EShellView *shell_view); -const char *e_shell_view_get_current_uri (EShellView *shell_view); +void e_shell_view_set_folder_bar_mode (EShellView *shell_view, + EShellViewSubwindowMode mode); +EShellViewSubwindowMode e_shell_view_get_folder_bar_mode (EShellView *shell_view); + +EShell *e_shell_view_get_shell (EShellView *shell_view); +BonoboUIComponent *e_shell_view_get_bonobo_ui_component (EShellView *shell_view); +GtkWidget *e_shell_view_get_appbar (EShellView *shell_view); +const char *e_shell_view_get_current_uri (EShellView *shell_view); -gboolean e_shell_view_save_settings (EShellView *shell_view, - const char *prefix); -gboolean e_shell_view_load_settings (EShellView *shell_view, - const char *prefix); +gboolean e_shell_view_save_settings (EShellView *shell_view, + const char *prefix); +gboolean e_shell_view_load_settings (EShellView *shell_view, + const char *prefix); #ifdef __cplusplus } diff --git a/shell/e-shell.c b/shell/e-shell.c index a577635bb1..99be4848bf 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -48,8 +48,6 @@ #include "e-shell.h" -static gboolean save_settings_for_views (EShell *shell); - #define PARENT_TYPE BONOBO_OBJECT_TYPE static BonoboObjectClass *parent_class = NULL; @@ -175,9 +173,9 @@ create_servant (void) } static GNOME_Evolution_ShellComponent -impl_Shell_get_component_for_type (PortableServer_Servant servant, - const CORBA_char *type, - CORBA_Environment *ev) +impl_Shell_getComponentByType (PortableServer_Servant servant, + const CORBA_char *type, + CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionShellComponentClient *handler; @@ -202,6 +200,26 @@ impl_Shell_get_component_for_type (PortableServer_Servant servant, return CORBA_Object_duplicate (corba_component, ev); } +static GNOME_Evolution_ShellView +impl_Shell_createNewView (PortableServer_Servant servant, + const CORBA_char *uri, + CORBA_Environment *ev) +{ + BonoboObject *bonobo_object; + EShell *shell; + EShellView *shell_view; + GNOME_Evolution_ShellView shell_view_interface; + + bonobo_object = bonobo_object_from_servant (servant); + shell = E_SHELL (bonobo_object); + + shell_view = e_shell_new_view (shell, uri); + shell_view_interface = e_shell_view_get_corba_interface (shell_view); + + Bonobo_Unknown_ref (shell_view_interface, ev); + return CORBA_Object_duplicate ((CORBA_Object) shell_view_interface, ev); +} + static void corba_listener_destroy_notify (void *data) { @@ -216,12 +234,12 @@ corba_listener_destroy_notify (void *data) } static void -impl_Shell_user_select_folder (PortableServer_Servant servant, - const GNOME_Evolution_FolderSelectionListener listener, - const CORBA_char *title, - const CORBA_char *default_folder, - const GNOME_Evolution_Shell_FolderTypeList *corba_allowed_types, - CORBA_Environment *ev) +impl_Shell_selectUserFolder (PortableServer_Servant servant, + const GNOME_Evolution_FolderSelectionListener listener, + const CORBA_char *title, + const CORBA_char *default_folder, + const GNOME_Evolution_Shell_FolderTypeList *corba_allowed_types, + CORBA_Environment *ev) { GtkWidget *folder_selection_dialog; BonoboObject *bonobo_object; @@ -256,8 +274,8 @@ impl_Shell_user_select_folder (PortableServer_Servant servant, } static GNOME_Evolution_LocalStorage -impl_Shell_get_local_storage (PortableServer_Servant servant, - CORBA_Environment *ev) +impl_Shell_getLocalStorage (PortableServer_Servant servant, + CORBA_Environment *ev) { BonoboObject *bonobo_object; GNOME_Evolution_LocalStorage local_storage_interface; @@ -278,8 +296,8 @@ impl_Shell_get_local_storage (PortableServer_Servant servant, } static Bonobo_Control -impl_Shell_create_storage_set_view (PortableServer_Servant servant, - CORBA_Environment *ev) +impl_Shell_createStorageSetView (PortableServer_Servant servant, + CORBA_Environment *ev) { BonoboObject *bonobo_object; EShell *shell; @@ -293,6 +311,21 @@ impl_Shell_create_storage_set_view (PortableServer_Servant servant, return bonobo_object_corba_objref (BONOBO_OBJECT (control)); } + +/* OAF registration. */ + +static OAF_RegistrationResult +register_shell (EShell *shell, + const char *iid) +{ + CORBA_Object corba_object; + + /* FIXME: Multi-display stuff. */ + + corba_object = bonobo_object_corba_objref (BONOBO_OBJECT (shell)); + return oaf_active_server_register (iid, corba_object); +} + /* Initialization of the storages. */ @@ -580,10 +613,11 @@ corba_class_init (void) base_epv->default_POA = NULL; epv = g_new0 (POA_GNOME_Evolution_Shell__epv, 1); - epv->getComponentByType = impl_Shell_get_component_for_type; - epv->selectUserFolder = impl_Shell_user_select_folder; - epv->getLocalStorage = impl_Shell_get_local_storage; - epv->createStorageSetView = impl_Shell_create_storage_set_view; + epv->getComponentByType = impl_Shell_getComponentByType; + epv->createNewView = impl_Shell_createNewView; + epv->selectUserFolder = impl_Shell_selectUserFolder; + epv->getLocalStorage = impl_Shell_getLocalStorage; + epv->createStorageSetView = impl_Shell_createStorageSetView; vepv = &shell_vepv; vepv->_base_epv = base_epv; @@ -640,15 +674,19 @@ init (EShell *shell) * e_shell_construct: * @shell: An EShell object to construct * @corba_object: A CORBA Object implementing the Evolution::Shell interface + * @iid: OAFIID for registering the shell into the name server * @local_directory: Local directory for storing local information and folders * @show_splash: Whether to display a splash screen. * * Construct @shell so that it uses the specified @local_directory and * @corba_object. + * + * Return value: %FALSE if the shell cannot be registered; %TRUE otherwise. **/ -void +gboolean e_shell_construct (EShell *shell, GNOME_Evolution_Shell corba_object, + const char *iid, const char *local_directory, gboolean show_splash) { @@ -656,11 +694,16 @@ e_shell_construct (EShell *shell, EShellPrivate *priv; gchar *shortcut_path; - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (corba_object != CORBA_OBJECT_NIL); - g_return_if_fail (local_directory != NULL); - g_return_if_fail (g_path_is_absolute (local_directory)); + g_return_val_if_fail (shell != NULL, FALSE); + g_return_val_if_fail (E_IS_SHELL (shell), FALSE); + g_return_val_if_fail (corba_object != CORBA_OBJECT_NIL, FALSE); + g_return_val_if_fail (local_directory != NULL, FALSE); + g_return_val_if_fail (g_path_is_absolute (local_directory), FALSE); + + bonobo_object_construct (BONOBO_OBJECT (shell), corba_object); + + if (register_shell (shell, iid) != OAF_REG_SUCCESS) + return FALSE; if (! show_splash) { splash = NULL; @@ -672,8 +715,6 @@ e_shell_construct (EShell *shell, while (gtk_events_pending ()) gtk_main_iteration (); - bonobo_object_construct (BONOBO_OBJECT (shell), corba_object); - priv = shell->priv; priv->local_directory = g_strdup (local_directory); @@ -686,7 +727,7 @@ e_shell_construct (EShell *shell, /* CORBA storages must be set up before the components, because otherwise components cannot register their own storages. */ if (! setup_corba_storages (shell)) - return; + return FALSE; if (splash != NULL) setup_components (shell, E_SPLASH (splash)); @@ -713,6 +754,8 @@ e_shell_construct (EShell *shell, sleep (2); gtk_widget_destroy (splash); + + return TRUE; } /** @@ -743,7 +786,12 @@ e_shell_new (const char *local_directory, new = gtk_type_new (e_shell_get_type ()); corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new), servant); - e_shell_construct (new, corba_object, local_directory, show_splash); + if (! e_shell_construct (new, + corba_object, E_SHELL_OAFIID, + local_directory, show_splash)) { + bonobo_object_unref (BONOBO_OBJECT (new)); + return NULL; + } priv = new->priv; diff --git a/shell/e-shell.h b/shell/e-shell.h index 4eb5c2c462..3548de03c7 100644 --- a/shell/e-shell.h +++ b/shell/e-shell.h @@ -30,6 +30,8 @@ #include +#include /* For the registration stuff. */ + #ifdef __cplusplus extern "C" { #pragma } @@ -43,6 +45,7 @@ typedef struct _EShellClass EShellClass; #include "e-shortcuts.h" #include "e-shell-view.h" + #define E_TYPE_SHELL (e_shell_get_type ()) #define E_SHELL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL, EShell)) #define E_SHELL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL, EShellClass)) @@ -50,7 +53,6 @@ typedef struct _EShellClass EShellClass; #define E_IS_SHELL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL)) - struct _EShell { BonoboObject parent; @@ -64,16 +66,21 @@ struct _EShellClass { }; -GtkType e_shell_get_type (void); -void e_shell_construct (EShell *shell, - GNOME_Evolution_Shell corba_object, - const char *local_directory, - gboolean show_splash); - -EShell *e_shell_new (const char *local_directory, - gboolean show_splash); -EShellView *e_shell_new_view (EShell *shell, - const char *uri); +/* ID for registering the shell in the OAF name service. */ +#define E_SHELL_OAFIID "OAFIID:evolution:584cc84c-27d4-42c8-ae4d-39a64bdefbd2" + + +GtkType e_shell_get_type (void); +gboolean e_shell_construct (EShell *shell, + GNOME_Evolution_Shell corba_object, + const char *iid, + const char *local_directory, + gboolean show_splash); +EShell *e_shell_new (const char *local_directory, + gboolean show_splash); + +EShellView *e_shell_new_view (EShell *shell, + const char *uri); const char *e_shell_get_local_directory (EShell *shell); EShortcuts *e_shell_get_shortcuts (EShell *shell); diff --git a/shell/e-shortcuts-view.c b/shell/e-shortcuts-view.c index a4b60eee56..59eef10833 100644 --- a/shell/e-shortcuts-view.c +++ b/shell/e-shortcuts-view.c @@ -521,6 +521,8 @@ e_shortcuts_view_construct (EShortcutsView *shortcuts_view, g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); priv = shortcuts_view->priv; + + gtk_object_ref (GTK_OBJECT (priv->shortcuts)); priv->shortcuts = shortcuts; e_shortcut_bar_set_icon_callback (E_SHORTCUT_BAR (shortcuts_view), icon_callback, diff --git a/shell/evolution.oafinfo b/shell/evolution.oafinfo new file mode 100644 index 0000000000..3f84707c93 --- /dev/null +++ b/shell/evolution.oafinfo @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/shell/main.c b/shell/main.c index 76d0582bd0..421dc85ba9 100644 --- a/shell/main.c +++ b/shell/main.c @@ -35,12 +35,15 @@ #include "e-shell.h" + #define STARTUP_URI "evolution:/local/Inbox" + static EShell *shell = NULL; static char *evolution_directory = NULL; static gboolean no_splash = FALSE; + static void no_views_left_cb (EShell *shell, gpointer data) { @@ -54,8 +57,9 @@ destroy_cb (GtkObject *object, gpointer data) gtk_main_quit (); } + static void -development_warning () +development_warning (void) { GtkWidget *label, *warning_dialog; int ret; @@ -109,6 +113,33 @@ development_warning () gtk_object_destroy (GTK_OBJECT (warning_dialog)); } + +/* This is for doing stuff that requires the GTK+ loop to be running already. */ + +static void +new_view_on_running_shell (void) +{ + CORBA_Object corba_object; + GNOME_Evolution_ShellView shell_view; + CORBA_Environment ev; + + CORBA_exception_init (&ev); + + corba_object = oaf_activate_from_id (E_SHELL_OAFIID, 0, NULL, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, + _("Cannot initialize the Evolution shell.")); + return; + } + + shell_view = GNOME_Evolution_Shell_createNewView ((GNOME_Evolution_Shell) corba_object, STARTUP_URI, &ev); + + Bonobo_Unknown_unref ((Bonobo_Unknown) shell_view, &ev); + CORBA_Object_release ((CORBA_Object) shell_view, &ev); + + CORBA_exception_free (&ev); +} + static gint idle_cb (gpointer data) { @@ -118,8 +149,9 @@ idle_cb (gpointer data) g_free (evolution_directory); if (shell == NULL) { - e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, - _("Cannot initialize the Evolution shell.")); + /* A new shell cannot be created, so try to get a new view from + an already running one. */ + new_view_on_running_shell (); exit (1); } @@ -179,4 +211,3 @@ main (int argc, char **argv) return 0; } - -- cgit v1.2.3