[evolution] Bug #667398 - Automatic mark-as-seen too aggressive



commit 73fe6fb330ac9fab009d2bcb5766a2b908a201c7
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jan 10 19:30:23 2012 +0100

    Bug #667398 - Automatic mark-as-seen too aggressive

 mail/e-mail-reader.c   |   38 +++++++++++++++++++++++++++++++++++++-
 widgets/table/e-tree.c |   23 +++++++++++++++++++++++
 widgets/table/e-tree.h |    2 ++
 3 files changed, 62 insertions(+), 1 deletions(-)
---
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 12e3a8a..8f51972 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -2482,6 +2482,9 @@ mail_reader_message_seen_cb (EMailReaderClosure *closure)
 	formatter = e_mail_reader_get_formatter (reader);
 	message_list = e_mail_reader_get_message_list (reader);
 
+	if (e_tree_is_dragging (E_TREE (message_list)))
+		return FALSE;
+
 	current_uid = EM_FORMAT (formatter)->uid;
 	uid_is_current &= (g_strcmp0 (current_uid, message_uid) == 0);
 
@@ -2517,7 +2520,8 @@ schedule_timeout_mark_seen (EMailReader *reader)
 	shell_settings = e_shell_get_shell_settings (shell);
 
 	message_uid = message_list->cursor_uid;
-	if (message_uid == NULL)
+	if (message_uid == NULL ||
+	    e_tree_is_dragging (E_TREE (message_list)))
 		return FALSE;
 
 	schedule_timeout =
@@ -2550,6 +2554,24 @@ schedule_timeout_mark_seen (EMailReader *reader)
 	return schedule_timeout;
 }
 
+static gboolean
+discard_timeout_mark_seen_cb (EMailReader *reader)
+{
+	MessageList *message_list;
+
+	g_return_val_if_fail (reader != NULL, FALSE);
+
+	message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader));
+	g_return_val_if_fail (message_list != NULL, FALSE);
+
+	if (message_list->seen_id > 0) {
+		g_source_remove (message_list->seen_id);
+		message_list->seen_id = 0;
+	}
+
+	return FALSE;
+}
+
 static void
 mail_reader_message_loaded_cb (CamelFolder *folder,
                                GAsyncResult *result,
@@ -3758,10 +3780,24 @@ connect_signals:
 		message_list, "message-selected",
 		G_CALLBACK (mail_reader_message_selected_cb), reader);
 
+	/* re-schedule mark-as-seen,... */
 	g_signal_connect_swapped (
 		message_list, "cursor-change",
 		G_CALLBACK (mail_reader_message_cursor_change_cb), reader);
 
+	/* but do not mark-as-seen if... */
+	g_signal_connect_swapped (
+		message_list, "tree-drag-begin",
+		G_CALLBACK (discard_timeout_mark_seen_cb), reader);
+
+	g_signal_connect_swapped (
+		message_list, "tree-drag-end",
+		G_CALLBACK (discard_timeout_mark_seen_cb), reader);
+
+	g_signal_connect_swapped (
+		message_list, "right-click",
+		G_CALLBACK (discard_timeout_mark_seen_cb), reader);
+
 	g_signal_connect_swapped (
 		message_list, "message-list-built",
 		G_CALLBACK (mail_reader_emit_folder_loaded), reader);
diff --git a/widgets/table/e-tree.c b/widgets/table/e-tree.c
index e24ce6a..ffcca22 100644
--- a/widgets/table/e-tree.c
+++ b/widgets/table/e-tree.c
@@ -200,6 +200,8 @@ struct _ETreePrivate {
 
 	gboolean state_changed;
 	guint state_change_freeze;
+
+	gboolean is_dragging;
 };
 
 static guint et_signals[LAST_SIGNAL] = { 0, };
@@ -638,6 +640,8 @@ e_tree_init (ETree *e_tree)
 
 	e_tree->priv->state_changed = FALSE;
 	e_tree->priv->state_change_freeze = 0;
+
+	e_tree->priv->is_dragging = FALSE;
 }
 
 /* Grab_focus handler for the ETree */
@@ -2827,6 +2831,21 @@ e_tree_drag_begin (ETree *tree,
 }
 
 /**
+ * e_tree_is_dragging:
+ * @tree: An #ETree widget
+ *
+ * Returns whether is @tree in a drag&drop operation.
+ **/
+gboolean
+e_tree_is_dragging (ETree *tree)
+{
+	g_return_val_if_fail (tree != NULL, FALSE);
+	g_return_val_if_fail (tree->priv != NULL, FALSE);
+
+	return tree->priv->is_dragging;
+}
+
+/**
  * e_tree_get_cell_at:
  * @tree: An ETree widget
  * @x: X coordinate for the pixel
@@ -2928,6 +2947,8 @@ et_drag_begin (GtkWidget *widget,
                GdkDragContext *context,
                ETree *et)
 {
+	et->priv->is_dragging = TRUE;
+
 	g_signal_emit (et,
 		       et_signals[TREE_DRAG_BEGIN], 0,
 		       et->priv->drag_row,
@@ -2941,6 +2962,8 @@ et_drag_end (GtkWidget *widget,
              GdkDragContext *context,
              ETree *et)
 {
+	et->priv->is_dragging = FALSE;
+
 	g_signal_emit (et,
 		       et_signals[TREE_DRAG_END], 0,
 		       et->priv->drag_row,
diff --git a/widgets/table/e-tree.h b/widgets/table/e-tree.h
index 08e5603..ae56399 100644
--- a/widgets/table/e-tree.h
+++ b/widgets/table/e-tree.h
@@ -307,6 +307,8 @@ GdkDragContext *e_tree_drag_begin		(ETree *tree,
 						 gint button,
 						 GdkEvent *event);
 
+gboolean	e_tree_is_dragging		(ETree *tree);
+
 /* Adapter functions */
 gboolean	e_tree_node_is_expanded		(ETree *et,
 						 ETreePath path);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]