commit 69ad42ac63e99ea220f04043b6fc832f57654ff4
parent 37c645c548099e584a0e81a0b50d412d397e1d61
Author: Colin Leroy <colin@colino.net>
Date: Thu, 1 May 2014 10:54:47 +0200
Track the mark-as-read timeout to be able to cancel it properly
when changing message or folder. Should fix bug #1644, "race condition
between message move and mark as read after timeout", bug #2145 "Claws
becomes unresponsive and gets Killed while moving messages between imap
folders", and bug #2643 "claws crash when accessing imap folder"
Diffstat:
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/src/summaryview.c b/src/summaryview.c
@@ -1603,6 +1603,11 @@ void summary_clear_list(SummaryView *summaryview)
summaryview->folder_item = NULL;
}
+ if (summaryview->mark_as_read_timeout_tag != 0) {
+ g_source_remove(summaryview->mark_as_read_timeout_tag);
+ summaryview->mark_as_read_timeout_tag = 0;
+ }
+
summaryview->display_msg = FALSE;
summaryview->selected = NULL;
@@ -2249,6 +2254,10 @@ void summary_select_node(SummaryView *summaryview, GtkCMCTreeNode *node,
if (!summaryview->folder_item)
return;
if (node) {
+ if (summaryview->mark_as_read_timeout_tag != 0) {
+ g_source_remove(summaryview->mark_as_read_timeout_tag);
+ summaryview->mark_as_read_timeout_tag = 0;
+ }
gtkut_ctree_expand_parent_all(ctree, node);
if (do_refresh) {
summary_lock(summaryview);
@@ -3542,8 +3551,10 @@ static int msginfo_mark_as_read_timeout(void *data)
mdata->summaryview->selected);
procmsg_msginfo_free(mdata->msginfo);
+ mdata->summaryview->mark_as_read_timeout_tag = 0;
+
g_free(mdata);
- return FALSE;
+ return FALSE;
}
static void summary_display_msg_full(SummaryView *summaryview,
@@ -3620,12 +3631,17 @@ static void summary_display_msg_full(SummaryView *summaryview,
MarkAsReadData *data = g_new0(MarkAsReadData, 1);
data->summaryview = summaryview;
data->msginfo = procmsg_msginfo_new_ref(msginfo);
+ if (summaryview->mark_as_read_timeout_tag != 0)
+ g_source_remove(summaryview->mark_as_read_timeout_tag);
+
#if GLIB_CHECK_VERSION(2,14,0)
- g_timeout_add_seconds(prefs_common.mark_as_read_delay,
- msginfo_mark_as_read_timeout, data);
+ summaryview->mark_as_read_timeout_tag =
+ g_timeout_add_seconds(prefs_common.mark_as_read_delay,
+ msginfo_mark_as_read_timeout, data);
#else
- g_timeout_add(prefs_common.mark_as_read_delay * 1000,
- msginfo_mark_as_read_timeout, data);
+ summaryview->mark_as_read_timeout_tag =
+ g_timeout_add(prefs_common.mark_as_read_delay * 1000,
+ msginfo_mark_as_read_timeout, data);
#endif
} else if (new_window || !prefs_common.mark_as_read_on_new_window) {
msginfo_mark_as_read(summaryview, msginfo, row);
diff --git a/src/summaryview.h b/src/summaryview.h
@@ -170,7 +170,8 @@ private:
// folders with matches for recursive quicksearch queries
GSList *recursive_matched_folders;
FolderItem *search_root_folder;
-
+
+ guint mark_as_read_timeout_tag;
#if !GTK_CHECK_VERSION(2,12,0)
GtkTooltips *tooltips;
#endif