aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/gui/component/e-book-shell-module.c1
-rw-r--r--calendar/modules/e-cal-shell-module.c1
-rw-r--r--calendar/modules/e-memo-shell-module.c1
-rw-r--r--calendar/modules/e-task-shell-module.c1
-rw-r--r--doc/reference/shell/eshell-sections.txt1
-rw-r--r--doc/reference/shell/tmpl/e-shell-module.sgml1
-rw-r--r--mail/e-mail-shell-module.c89
-rw-r--r--mail/e-mail-shell-module.h3
-rw-r--r--mail/filtertypes.xml4
-rw-r--r--mail/searchtypes.xml2
-rw-r--r--mail/vfoldertypes.xml2
-rw-r--r--shell/e-shell-module.c27
-rw-r--r--shell/e-shell-module.h8
-rw-r--r--shell/e-shell-window.c7
-rw-r--r--shell/test/e-test-shell-module.c7
15 files changed, 135 insertions, 20 deletions
diff --git a/addressbook/gui/component/e-book-shell-module.c b/addressbook/gui/component/e-book-shell-module.c
index e4648e138d..80bbc8318e 100644
--- a/addressbook/gui/component/e-book-shell-module.c
+++ b/addressbook/gui/component/e-book-shell-module.c
@@ -436,6 +436,7 @@ static EShellModuleInfo module_info = {
MODULE_SORT_ORDER,
/* Methods */
+ /* start */ NULL,
book_module_is_busy,
book_module_shutdown,
e_book_shell_module_migrate
diff --git a/calendar/modules/e-cal-shell-module.c b/calendar/modules/e-cal-shell-module.c
index 9d78f6e6c8..b3d296c3b0 100644
--- a/calendar/modules/e-cal-shell-module.c
+++ b/calendar/modules/e-cal-shell-module.c
@@ -507,6 +507,7 @@ static EShellModuleInfo module_info = {
MODULE_SCHEMES,
MODULE_SORT_ORDER,
+ /* start */ NULL,
/* is_busy */ NULL,
/* shutdown */ NULL,
e_cal_shell_module_migrate
diff --git a/calendar/modules/e-memo-shell-module.c b/calendar/modules/e-memo-shell-module.c
index 8c373f6604..873bdb26d0 100644
--- a/calendar/modules/e-memo-shell-module.c
+++ b/calendar/modules/e-memo-shell-module.c
@@ -479,6 +479,7 @@ static EShellModuleInfo module_info = {
MODULE_SCHEMES,
MODULE_SORT_ORDER,
+ /* start */ NULL,
/* is_busy */ NULL,
/* shutdown */ NULL,
e_memo_shell_module_migrate
diff --git a/calendar/modules/e-task-shell-module.c b/calendar/modules/e-task-shell-module.c
index 9c6258a156..345150222a 100644
--- a/calendar/modules/e-task-shell-module.c
+++ b/calendar/modules/e-task-shell-module.c
@@ -486,6 +486,7 @@ static EShellModuleInfo module_info = {
MODULE_SCHEMES,
MODULE_SORT_ORDER,
+ /* start */ NULL,
/* is_busy */ NULL,
/* shutdown */ NULL,
e_task_shell_module_migrate
diff --git a/doc/reference/shell/eshell-sections.txt b/doc/reference/shell/eshell-sections.txt
index 1e888cf03a..99feb83d58 100644
--- a/doc/reference/shell/eshell-sections.txt
+++ b/doc/reference/shell/eshell-sections.txt
@@ -20,6 +20,7 @@ e_shell_get_online
e_shell_set_online
e_shell_get_preferences_window
e_shell_event
+e_shell_start
e_shell_is_busy
e_shell_do_quit
e_shell_quit
diff --git a/doc/reference/shell/tmpl/e-shell-module.sgml b/doc/reference/shell/tmpl/e-shell-module.sgml
index 883ae1a9af..9957aeb9d9 100644
--- a/doc/reference/shell/tmpl/e-shell-module.sgml
+++ b/doc/reference/shell/tmpl/e-shell-module.sgml
@@ -50,6 +50,7 @@ EShellModule
@aliases:
@schemes:
@sort_order:
+@start:
@is_busy:
@shutdown:
@migrate:
diff --git a/mail/e-mail-shell-module.c b/mail/e-mail-shell-module.c
index f699edf7c3..2ae8bd5a5a 100644
--- a/mail/e-mail-shell-module.c
+++ b/mail/e-mail-shell-module.c
@@ -827,6 +827,32 @@ mail_shell_module_window_created_cb (EShell *shell,
}
}
+static void
+mail_shell_module_start (EShellModule *shell_module)
+{
+ EShell *shell;
+ EShellSettings *shell_settings;
+ gboolean enable_search_folders;
+
+ shell = e_shell_module_get_shell (shell_module);
+ shell_settings = e_shell_get_shell_settings (shell);
+
+ g_debug ("Jumpstarting Mail");
+
+ enable_search_folders = e_shell_settings_get_boolean (
+ shell_settings, "mail-enable-search-folders");
+ if (enable_search_folders)
+ vfolder_load_storage ();
+
+ mail_autoreceive_init (session);
+
+ if (g_getenv ("CAMEL_FLUSH_CHANGES") != NULL)
+ mail_sync_timeout_source_id = g_timeout_add_seconds (
+ mail_config_get_sync_timeout (),
+ (GSourceFunc) mail_shell_module_mail_sync,
+ shell_module);
+}
+
static EShellModuleInfo module_info = {
MODULE_NAME,
@@ -834,6 +860,7 @@ static EShellModuleInfo module_info = {
MODULE_SCHEMES,
MODULE_SORT_ORDER,
+ mail_shell_module_start,
/* is_busy */ NULL,
/* shutdown */ NULL,
e_mail_shell_module_migrate
@@ -844,12 +871,9 @@ e_shell_module_init (GTypeModule *type_module)
{
EShell *shell;
EShellModule *shell_module;
- EShellSettings *shell_settings;
- gboolean enable_search_folders;
shell_module = E_SHELL_MODULE (type_module);
shell = e_shell_module_get_shell (shell_module);
- shell_settings = e_shell_get_shell_settings (shell);
e_shell_module_set_info (
shell_module, &module_info,
@@ -913,19 +937,6 @@ e_shell_module_init (GTypeModule *type_module)
* since the preferences bind to the shell settings. */
e_mail_shell_module_init_settings (shell);
mail_shell_module_init_preferences (shell);
-
- enable_search_folders = e_shell_settings_get_boolean (
- shell_settings, "mail-enable-search-folders");
- if (enable_search_folders)
- vfolder_load_storage ();
-
- mail_autoreceive_init (session);
-
- if (g_getenv ("CAMEL_FLUSH_CHANGES") != NULL)
- mail_sync_timeout_source_id = g_timeout_add_seconds (
- mail_config_get_sync_timeout (),
- (GSourceFunc) mail_shell_module_mail_sync,
- shell_module);
}
/******************************** Public API *********************************/
@@ -1101,3 +1112,49 @@ e_mail_shell_module_stores_foreach (EShellModule *shell_module,
while (g_hash_table_iter_next (&iter, &key, &value))
func (key, ((StoreInfo *) value)->name, user_data);
}
+
+/******************* Code below here belongs elsewhere. *******************/
+
+#include "filter/filter-option.h"
+#include "shell/e-shell-settings.h"
+#include "mail/e-mail-label-list-store.h"
+
+GSList *
+e_mail_labels_get_filter_options (void)
+{
+ EShell *shell;
+ EShellSettings *shell_settings;
+ EMailLabelListStore *list_store;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GSList *list = NULL;
+ gboolean valid;
+
+ shell = e_shell_get_default ();
+ shell_settings = e_shell_get_shell_settings (shell);
+ list_store = e_shell_settings_get_object (
+ shell_settings, "mail-label-list-store");
+
+ model = GTK_TREE_MODEL (list_store);
+ valid = gtk_tree_model_get_iter_first (model, &iter);
+
+ while (valid) {
+ struct _filter_option *option;
+ gchar *name, *tag;
+
+ name = e_mail_label_list_store_get_name (list_store, &iter);
+ tag = e_mail_label_list_store_get_tag (list_store, &iter);
+
+ option = g_new0 (struct _filter_option, 1);
+ option->title = e_str_without_underscores (name);
+ option->value = tag; /* takes ownership */
+
+ g_free (name);
+
+ valid = gtk_tree_model_iter_next (model, &iter);
+ }
+
+ g_object_unref (list_store);
+
+ return list;
+}
diff --git a/mail/e-mail-shell-module.h b/mail/e-mail-shell-module.h
index de19861ac6..d72df698a5 100644
--- a/mail/e-mail-shell-module.h
+++ b/mail/e-mail-shell-module.h
@@ -76,6 +76,9 @@ void e_mail_shell_module_stores_foreach
GHFunc func,
gpointer user_data);
+/* XXX Find a better place for this function. */
+GSList * e_mail_labels_get_filter_options(void);
+
G_END_DECLS
#endif /* E_MAIL_SHELL_MODULE_H */
diff --git a/mail/filtertypes.xml b/mail/filtertypes.xml
index f2f69c4c06..a93b887271 100644
--- a/mail/filtertypes.xml
+++ b/mail/filtertypes.xml
@@ -636,7 +636,7 @@
</option>
</input>
<input type="optionlist" name="versus">
- <dynamic func="e_util_labels_get_filter_options"/>
+ <dynamic func="e_mail_labels_get_filter_options"/>
</input>
</part>
@@ -923,7 +923,7 @@
<title>Set Label</title>
<code>(set-label ${label})</code>
<input type="optionlist" name="label">
- <dynamic func="e_util_labels_get_filter_options"/>
+ <dynamic func="e_mail_labels_get_filter_options"/>
</input>
</part>
<part name="colour">
diff --git a/mail/searchtypes.xml b/mail/searchtypes.xml
index 83941d875c..ba349993f7 100644
--- a/mail/searchtypes.xml
+++ b/mail/searchtypes.xml
@@ -569,7 +569,7 @@
</option>
</input>
<input type="optionlist" name="versus">
- <dynamic func="e_util_labels_get_filter_options"/>
+ <dynamic func="e_mail_labels_get_filter_options"/>
</input>
</part>
diff --git a/mail/vfoldertypes.xml b/mail/vfoldertypes.xml
index 11ed7cc0af..9fd117b67d 100644
--- a/mail/vfoldertypes.xml
+++ b/mail/vfoldertypes.xml
@@ -569,7 +569,7 @@
</option>
</input>
<input type="optionlist" name="versus">
- <dynamic func="e_util_labels_get_filter_options"/>
+ <dynamic func="e_mail_labels_get_filter_options"/>
</input>
</part>
diff --git a/shell/e-shell-module.c b/shell/e-shell-module.c
index 11226557c2..e3f6fe37b9 100644
--- a/shell/e-shell-module.c
+++ b/shell/e-shell-module.c
@@ -53,6 +53,8 @@ struct _EShellModulePrivate {
/* Initializes the loaded type module. */
void (*init) (GTypeModule *type_module);
+
+ guint started : 1;
};
enum {
@@ -445,6 +447,30 @@ e_shell_module_add_activity (EShellModule *shell_module,
}
/**
+ * e_shell_module_start:
+ * @shell_module: an #EShellModule
+ *
+ * Tells the @shell_module to begin loading data or running background
+ * tasks which may consume significant resources. This gets called in
+ * reponse to the user switching to the corresponding shell view for
+ * the first time. The function is idempotent for each shell module.
+ **/
+void
+e_shell_module_start (EShellModule *shell_module)
+{
+ EShellModuleInfo *module_info;
+
+ g_return_if_fail (E_IS_SHELL_MODULE (shell_module));
+
+ module_info = &shell_module->priv->info;
+
+ if (module_info->start != NULL && !shell_module->priv->started)
+ module_info->start (shell_module);
+
+ shell_module->priv->started = TRUE;
+}
+
+/**
* e_shell_module_is_busy:
* @shell_module: an #EShellModule
*
@@ -576,6 +602,7 @@ e_shell_module_set_info (EShellModule *shell_module,
module_info->schemes = g_intern_string (info->schemes);
module_info->sort_order = info->sort_order;
+ module_info->start = info->start;
module_info->is_busy = info->is_busy;
module_info->shutdown = info->shutdown;
module_info->migrate = info->migrate;
diff --git a/shell/e-shell-module.h b/shell/e-shell-module.h
index 0f7016532d..4d6274bdf6 100644
--- a/shell/e-shell-module.h
+++ b/shell/e-shell-module.h
@@ -73,6 +73,12 @@ typedef struct _EShellModulePrivate EShellModulePrivate;
* @sort_order: Used to determine the order of modules listed in
* the main menu and in the switcher. See
* e_shell_module_compare().
+ * @start: Callback for notifying the module to begin loading data
+ * and running background tasks. This is called the first
+ * time the corresponding shell view class is instantiated.
+ * It allows the module to delay initialization steps that
+ * consume significant resources until they are actually
+ * needed.
* @is_busy: Callback for querying whether the module has
* operations in progress that cannot be cancelled
* or finished immediately. Returning %TRUE prevents
@@ -96,6 +102,7 @@ struct _EShellModuleInfo {
const gchar *schemes;
gint sort_order;
+ void (*start) (EShellModule *shell_module);
gboolean (*is_busy) (EShellModule *shell_module);
gboolean (*shutdown) (EShellModule *shell_module);
gboolean (*migrate) (EShellModule *shell_module,
@@ -133,6 +140,7 @@ GType e_shell_module_get_shell_view_type
(EShellModule *shell_module);
void e_shell_module_add_activity (EShellModule *shell_module,
EActivity *activity);
+void e_shell_module_start (EShellModule *shell_module);
gboolean e_shell_module_is_busy (EShellModule *shell_module);
gboolean e_shell_module_shutdown (EShellModule *shell_module);
gboolean e_shell_module_migrate (EShellModule *shell_module,
diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c
index 2de5349ecf..30dd3e627e 100644
--- a/shell/e-shell-window.c
+++ b/shell/e-shell-window.c
@@ -45,12 +45,19 @@ shell_window_new_view (EShellWindow *shell_window,
const gchar *title)
{
GHashTable *loaded_views;
+ EShell *shell;
+ EShellModule *shell_module;
EShellView *shell_view;
GtkNotebook *notebook;
GtkAction *action;
GtkWidget *widget;
gint page_num;
+ /* First off, start the shell module. */
+ shell = e_shell_window_get_shell (shell_window);
+ shell_module = e_shell_get_module_by_name (shell, view_name);
+ e_shell_module_start (shell_module);
+
/* Determine the page number for the new shell view. */
notebook = GTK_NOTEBOOK (shell_window->priv->content_notebook);
diff --git a/shell/test/e-test-shell-module.c b/shell/test/e-test-shell-module.c
index a7d2389fb7..0098866400 100644
--- a/shell/test/e-test-shell-module.c
+++ b/shell/test/e-test-shell-module.c
@@ -69,6 +69,12 @@ static GtkActionEntry source_entries[] = {
G_CALLBACK (action_test_source_new_cb) }
};
+static void
+test_module_start (EShellModule *shell_module)
+{
+ g_debug ("%s", G_STRFUNC);
+}
+
static gboolean
test_module_is_busy (EShellModule *shell_module)
{
@@ -149,6 +155,7 @@ static EShellModuleInfo module_info = {
MODULE_SORT_ORDER,
/* Methods */
+ test_module_start,
test_module_is_busy,
test_module_shutdown,
test_module_migrate