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"));
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);
}
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;
}
((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;
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),
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 ();
}