diff options
-rw-r--r-- | doc/reference/shell/eshell-sections.txt | 1 | ||||
-rw-r--r-- | doc/reference/shell/tmpl/e-shell-window.sgml | 18 | ||||
-rw-r--r-- | plugins/templates/templates.c | 22 | ||||
-rw-r--r-- | shell/e-shell-window.c | 70 | ||||
-rw-r--r-- | shell/e-shell-window.h | 7 |
5 files changed, 108 insertions, 10 deletions
diff --git a/doc/reference/shell/eshell-sections.txt b/doc/reference/shell/eshell-sections.txt index 7dc8df9e72..f65ce604a2 100644 --- a/doc/reference/shell/eshell-sections.txt +++ b/doc/reference/shell/eshell-sections.txt @@ -290,6 +290,7 @@ EShellWindow e_shell_window_new e_shell_window_get_shell e_shell_window_get_shell_view +e_shell_window_peek_shell_view e_shell_window_get_shell_view_action e_shell_window_get_ui_manager e_shell_window_get_action diff --git a/doc/reference/shell/tmpl/e-shell-window.sgml b/doc/reference/shell/tmpl/e-shell-window.sgml index 89da4a143c..383c782da2 100644 --- a/doc/reference/shell/tmpl/e-shell-window.sgml +++ b/doc/reference/shell/tmpl/e-shell-window.sgml @@ -23,6 +23,14 @@ EShellWindow </para> +<!-- ##### SIGNAL EShellWindow::shell-view-created ##### --> +<para> + +</para> + +@eshellwindow: the object which received the signal. +@arg1: + <!-- ##### ARG EShellWindow:active-view ##### --> <para> @@ -103,6 +111,16 @@ EShellWindow @Returns: +<!-- ##### FUNCTION e_shell_window_peek_shell_view ##### --> +<para> + +</para> + +@shell_window: +@view_name: +@Returns: + + <!-- ##### FUNCTION e_shell_window_get_shell_view_action ##### --> <para> diff --git a/plugins/templates/templates.c b/plugins/templates/templates.c index 1ed02dd22d..b88e26d29d 100644 --- a/plugins/templates/templates.c +++ b/plugins/templates/templates.c @@ -767,6 +767,15 @@ init_composer_actions (GtkUIManager *ui_manager, return TRUE; } +static void +mail_shell_view_created_cb (EShellWindow *shell_window, + EShellView *shell_view) +{ + g_signal_connect ( + shell_view, "update-actions", + G_CALLBACK (update_actions_cb), NULL); +} + gboolean init_shell_actions (GtkUIManager *ui_manager, EShellWindow *shell_window) @@ -775,8 +784,6 @@ init_shell_actions (GtkUIManager *ui_manager, GtkActionGroup *action_group; guint merge_id; - shell_view = e_shell_window_get_shell_view (shell_window, "mail"); - /* This is where we keep dynamically-built menu items. */ e_shell_window_add_action_group (shell_window, "templates"); action_group = e_lookup_action_group (ui_manager, "templates"); @@ -787,9 +794,14 @@ init_shell_actions (GtkUIManager *ui_manager, G_OBJECT (action_group), "merge-id", GUINT_TO_POINTER (merge_id)); - g_signal_connect ( - shell_view, "update-actions", - G_CALLBACK (update_actions_cb), NULL); + /* Be careful not to instantiate the mail view ourselves. */ + shell_view = e_shell_window_peek_shell_view (shell_window, "mail"); + if (shell_view != NULL) + mail_shell_view_created_cb (shell_window, shell_view); + else + g_signal_connect ( + shell_window, "shell-view-created::mail", + G_CALLBACK (mail_shell_view_created_cb), NULL); return TRUE; } diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c index d3d6107e24..d159406e08 100644 --- a/shell/e-shell-window.c +++ b/shell/e-shell-window.c @@ -40,7 +40,13 @@ enum { PROP_UI_MANAGER }; +enum { + SHELL_VIEW_CREATED, + LAST_SIGNAL +}; + static gpointer parent_class; +static gulong signals[LAST_SIGNAL]; static void shell_window_menubar_update_new_menu (EShellWindow *shell_window) @@ -753,6 +759,26 @@ shell_window_class_init (EShellWindowClass *class) _("The shell window's GtkUIManager"), GTK_TYPE_UI_MANAGER, G_PARAM_READABLE)); + + /** + * EShellWindow::shell-view-created + * @shell_window: the #EShellWindow which emitted the signal + * @shell_view: the new #EShellView + * + * Emitted when a new #EShellView is instantiated by way of + * e_shell_window_get_shell_view(). The signal detail denotes + * the new view name, which can be used to obtain notification + * of when a particular #EShellView is created. + **/ + signals[SHELL_VIEW_CREATED] = g_signal_new ( + "shell-view-created", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + G_STRUCT_OFFSET (EShellWindowClass, shell_view_created), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + E_TYPE_SHELL_VIEW); } static void @@ -849,6 +875,9 @@ e_shell_window_get_shell (EShellWindow *shell_window) * active view name, as returned by e_shell_window_get_active_view(), * should be requested. * + * The function emits a #EShellWindow::shell-view-created signal with + * @view_name as the signal detail when it instantiates an #EShellView. + * * Returns: the requested #EShellView, or %NULL if no such view is * registered **/ @@ -858,21 +887,52 @@ e_shell_window_get_shell_view (EShellWindow *shell_window, { EShellView *shell_view; EShellWindowClass *class; - GHashTable *loaded_views; g_return_val_if_fail (E_IS_SHELL_WINDOW (shell_window), NULL); g_return_val_if_fail (view_name != NULL, NULL); - loaded_views = shell_window->priv->loaded_views; - shell_view = g_hash_table_lookup (loaded_views, view_name); - + shell_view = e_shell_window_peek_shell_view (shell_window, view_name); if (shell_view != NULL) return shell_view; class = E_SHELL_WINDOW_GET_CLASS (shell_window); g_return_val_if_fail (class->create_shell_view != NULL, NULL); - return class->create_shell_view (shell_window, view_name); + shell_view = class->create_shell_view (shell_window, view_name); + + g_signal_emit ( + shell_window, signals[SHELL_VIEW_CREATED], + g_quark_from_string (view_name), shell_view); + + return shell_view; +} + +/** + * e_shell_window_peek_shell_view: + * @shell_window: an #EShellWindow + * @view_name: name of a shell view + * + * Returns the #EShellView named @view_name (see the + * <structfield>name</structfield> field in #EShellBackendInfo), or + * %NULL if the requested view has not yet been instantiated. Unlike + * e_shell_window_get_shell_view(), this function will not instantiate + * the view itself. + * + * Returns: the requested #EShellView, or %NULL if no such view is + * instantiated + **/ +EShellView * +e_shell_window_peek_shell_view (EShellWindow *shell_window, + const gchar *view_name) +{ + GHashTable *loaded_views; + + g_return_val_if_fail (E_IS_SHELL_WINDOW (shell_window), NULL); + g_return_val_if_fail (view_name != NULL, NULL); + + loaded_views = shell_window->priv->loaded_views; + + return g_hash_table_lookup (loaded_views, view_name); } /** diff --git a/shell/e-shell-window.h b/shell/e-shell-window.h index 4ac76ba5d4..0bd71075c9 100644 --- a/shell/e-shell-window.h +++ b/shell/e-shell-window.h @@ -73,6 +73,10 @@ struct _EShellWindow { struct _EShellWindowClass { GtkWindowClass parent_class; + /* Signals */ + void (*shell_view_created) (EShellWindow *shell_window, + struct _EShellView *shell_view); + /* These are all protected methods. Not for public use. */ GtkWidget * (*construct_menubar) (EShellWindow *shell_window); GtkWidget * (*construct_toolbar) (EShellWindow *shell_window); @@ -92,6 +96,9 @@ EShell * e_shell_window_get_shell (EShellWindow *shell_window); struct _EShellView * e_shell_window_get_shell_view (EShellWindow *shell_window, const gchar *view_name); +struct _EShellView * + e_shell_window_peek_shell_view (EShellWindow *shell_window, + const gchar *view_name); GtkAction * e_shell_window_get_shell_view_action (EShellWindow *shell_window, const gchar *view_name); |