+static guint signals[LAST_SIGNAL] = {0};
+
+/* We signal key changes in batches, every X seconds: */
+static gboolean
+on_timeout_notify_changes (gpointer data)
+{
+ ModestAccountMgr *self = MODEST_ACCOUNT_MGR (data);
+ ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
+
+ /* TODO: Also store the account names, and notify one list for each account,
+ * if anything uses the account names. */
+
+ if (priv->changed_conf_keys) {
+ gchar *default_account =
+ modest_account_mgr_get_default_account (self);
+
+ g_signal_emit (G_OBJECT(self), signals[ACCOUNT_CHANGED_SIGNAL], 0,
+ default_account, priv->changed_conf_keys, FALSE);
+
+ g_free (default_account);
+
+ g_slist_foreach (priv->changed_conf_keys, (GFunc) g_free, NULL);
+ g_slist_free (priv->changed_conf_keys);
+ priv->changed_conf_keys = NULL;
+ }
+
+ return TRUE; /* Call this again later. */
+}
+
+static void
+on_key_change (ModestConf *conf, const gchar *key, ModestConfEvent event, gpointer user_data)
+{
+ ModestAccountMgr *self = MODEST_ACCOUNT_MGR (user_data);
+ ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
+ gboolean is_account_key;
+ gboolean is_server_account;
+ gchar* account = NULL;
+
+ /* there is only one not-really-account key which will still emit
+ * a signal: a change in MODEST_CONF_DEFAULT_ACCOUNT */
+ if (key && strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) {
+ /* Get the default account instead. */
+
+ /* Store the key for later notification in our timeout callback.
+ * Notifying for every key change would cause unnecessary work: */
+ priv->changed_conf_keys = g_slist_append (priv->changed_conf_keys,
+ (gpointer) g_strdup (key));
+ }
+
+ is_account_key = FALSE;
+ is_server_account = FALSE;
+ account = _modest_account_mgr_account_from_key (key, &is_account_key,
+ &is_server_account);
+
+ /* if this is not an account-related key change, ignore */
+ if (!account)
+ return;
+
+ /* account was removed. Do not emit an account removed signal
+ because it was already being done in the remove_account
+ method. Do not notify also the removal of the server
+ account keys for the same reason */
+ if ((is_account_key || is_server_account) &&
+ event == MODEST_CONF_EVENT_KEY_UNSET) {
+ g_free (account);
+ return;
+ }
+
+ /* is this account enabled? */
+ gboolean enabled = FALSE;
+ if (is_server_account)
+ enabled = TRUE;
+ else
+ enabled = modest_account_mgr_get_enabled (self, account);
+
+ /* Notify is server account was changed, default account was changed
+ * or when enabled/disabled changes:
+ */
+ if (enabled ||
+ g_str_has_suffix (key, MODEST_ACCOUNT_ENABLED) ||
+ strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) {
+ /* Store the key for later notification in our timeout callback.
+ * Notifying for every key change would cause unnecessary work: */
+ priv->changed_conf_keys = g_slist_append (NULL,
+ (gpointer) g_strdup (key));
+ }
+ g_free (account);
+}