Bug #632676 - Only "Checking for new mail" in status bar and nothing else
authorMilan Crha <mcrha@redhat.com>
Tue, 9 Nov 2010 11:44:07 +0000 (12:44 +0100)
committerMilan Crha <mcrha@redhat.com>
Tue, 9 Nov 2010 11:44:07 +0000 (12:44 +0100)
camel/camel-folder.c
camel/camel-operation.c

index 828a78c..43b30d0 100644 (file)
@@ -864,12 +864,18 @@ folder_transfer_messages_to_sync (CamelFolder *source,
        gchar **ret_uid = NULL;
        gint i;
        GError *local_error = NULL;
+       GCancellable *local_cancellable = camel_operation_new ();
+       gulong handler_id = 0;
 
        if (transferred_uids) {
                *transferred_uids = g_ptr_array_new ();
                g_ptr_array_set_size (*transferred_uids, uids->len);
        }
 
+       /* to not propagate status messages from sub-functions into UI */
+       if (cancellable)
+               handler_id = g_signal_connect_swapped (cancellable, "cancelled", G_CALLBACK (g_cancellable_cancel), local_cancellable);
+
        if (delete_originals)
                camel_operation_push_message (
                        cancellable, _("Moving messages"));
@@ -888,7 +894,7 @@ folder_transfer_messages_to_sync (CamelFolder *source,
                        ret_uid = (gchar **)&((*transferred_uids)->pdata[i]);
                folder_transfer_message_to (
                        source, uids->pdata[i], dest, ret_uid,
-                       delete_originals, cancellable, &local_error);
+                       delete_originals, local_cancellable, &local_error);
                camel_operation_progress (
                        cancellable, i * 100 / uids->len);
        }
@@ -903,6 +909,9 @@ folder_transfer_messages_to_sync (CamelFolder *source,
 
        if (local_error != NULL)
                g_propagate_error (error, local_error);
+       g_object_unref (local_cancellable);
+       if (cancellable)
+               g_signal_handler_disconnect (cancellable, handler_id);
 
        return TRUE;
 }
index 7850bab..13626d9 100644 (file)
@@ -36,7 +36,8 @@
        ((obj), CAMEL_TYPE_OPERATION, CamelOperationPrivate))
 
 #define PROGRESS_DELAY         250  /* milliseconds */
-#define TRANSIENT_DELAY                4    /* seconds */
+#define TRANSIENT_DELAY                250  /* milliseconds */
+#define POP_MESSAGE_DELAY      999  /* milliseconds */
 
 typedef struct _StatusNode StatusNode;
 
@@ -425,7 +426,7 @@ camel_operation_push_message (GCancellable *cancellable,
                        status_node_ref (node),
                        (GDestroyNotify) status_node_unref);
        else
-               node->source_id = g_timeout_add_seconds_full (
+               node->source_id = g_timeout_add_full (
                        G_PRIORITY_DEFAULT, TRANSIENT_DELAY,
                        (GSourceFunc) operation_emit_status_cb,
                        status_node_ref (node),
@@ -477,12 +478,16 @@ camel_operation_pop_message (GCancellable *cancellable)
 
        node = g_queue_peek_head (&operation->priv->status_stack);
 
-       if (node != NULL && node->source_id == 0)
-               node->source_id = g_idle_add_full (
-                       G_PRIORITY_DEFAULT_IDLE,
+       if (node != NULL) {
+               if (node->source_id != 0)
+                       g_source_remove (node->source_id);
+
+               node->source_id = g_timeout_add_full (
+                       G_PRIORITY_DEFAULT, POP_MESSAGE_DELAY,
                        (GSourceFunc) operation_emit_status_cb,
                        status_node_ref (node),
                        (GDestroyNotify) status_node_unref);
+       }
 
        UNLOCK ();
 }