EClientSelector: Pre-fetch relevant EClient instance.

Asyncrhonously fetch all relevant EClient instances during instance
initialization to try and get them cached ahead of time, and so that
all status icons are present when the tree view is shown.
This commit is contained in:
Matthew Barnes
2013-02-22 10:37:19 -05:00
parent eff9783d94
commit e82cb12e16

View File

@ -131,6 +131,21 @@ client_selector_client_created_cb (EClientCache *client_cache,
client_selector_update_row (selector, client);
}
static void
client_selector_prefetch_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
EClient *client;
/* We don't care about errors here. This is just to try and
* get the EClient instances we'll need cached ahead of time. */
client = e_client_selector_get_client_finish (
E_CLIENT_SELECTOR (source_object), result, NULL);
g_clear_object (&client);
}
static void
client_selector_client_notify_cb (EClientCache *client_cache,
EClient *client,
@ -224,9 +239,12 @@ client_selector_constructed (GObject *object)
{
EClientSelector *selector;
EClientCache *client_cache;
ESourceRegistry *registry;
GtkTreeView *tree_view;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
const gchar *extension_name;
GList *list, *link;
gulong handler_id;
selector = E_CLIENT_SELECTOR (object);
@ -270,6 +288,24 @@ client_selector_constructed (GObject *object)
selector->priv->client_notify_online_handler_id = handler_id;
g_object_unref (client_cache);
/* Pre-fetch EClient instances for all relevant ESources.
* This is just to try and make sure they get cached ahead
* of time, so we need not worry about reporting errors. */
registry = e_source_selector_get_registry (
E_SOURCE_SELECTOR (selector));
extension_name = e_source_selector_get_extension_name (
E_SOURCE_SELECTOR (selector));
list = e_source_registry_list_sources (registry, extension_name);
for (link = list; link != NULL; link = g_list_next (link))
e_client_selector_get_client (
selector, E_SOURCE (link->data), NULL,
client_selector_prefetch_cb, NULL);
g_list_free_full (list, (GDestroyNotify) g_object_unref);
}
static void