Deduplicate three identical functions
[claws.git] / src / summaryview.c
index fe37768048ab57d7ec331177d170be088c2ac1ef..102961df95e273c89bfdcf619276cec598bf064e 100644 (file)
@@ -130,12 +130,9 @@ guint summary_get_msgnum           (SummaryView            *summaryview,
                                         GtkCMCTreeNode         *node);
 
 
-static void summary_set_hide_read_msgs_menu (SummaryView *summaryview,
-                                            guint action);
-static void summary_set_hide_del_msgs_menu (SummaryView *summaryview,
-                                            guint action);
-static void summary_set_hide_read_threads_menu (SummaryView *summaryview,
-                                            guint action);
+static void summary_set_hide_menu (SummaryView *summaryview,
+                                  const gchar *menu_item,
+                                  guint action);
 
 static GtkCMCTreeNode *summary_find_prev_msg
                                        (SummaryView            *summaryview,
@@ -1324,9 +1321,9 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                                (item && item->path)?item->path:"(null)",
                                item?folder_item_parent(item):0x0,
                                item?item->no_select:FALSE);
-               summary_set_hide_read_msgs_menu(summaryview, FALSE);
-               summary_set_hide_del_msgs_menu(summaryview, FALSE);
-               summary_set_hide_read_threads_menu(summaryview, FALSE);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideReadMessages", FALSE);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideDelMessages", FALSE);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideReadThreads", FALSE);
                summary_clear_all(summaryview);
                summaryview->folder_item = item;
                summary_thaw(summaryview);
@@ -1397,9 +1394,12 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
            quicksearch_has_sat_predicate(summaryview->quicksearch) == FALSE) {
                GSList *not_killed;
                
-               summary_set_hide_read_msgs_menu(summaryview, summaryview->folder_item->hide_read_msgs);
-               summary_set_hide_del_msgs_menu(summaryview, summaryview->folder_item->hide_del_msgs);
-               summary_set_hide_read_threads_menu(summaryview, summaryview->folder_item->hide_read_threads);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideReadMessages",
+                                               summaryview->folder_item->hide_read_msgs);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideDelMessages",
+                                               summaryview->folder_item->hide_del_msgs);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideReadThreads",
+                                               summaryview->folder_item->hide_read_threads);
                not_killed = NULL;
                for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
@@ -1432,9 +1432,12 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                g_slist_free(mlist);
                mlist = not_killed;
        } else {
-               summary_set_hide_read_msgs_menu(summaryview, FALSE);
-               summary_set_hide_del_msgs_menu(summaryview, FALSE);
-               summary_set_hide_read_threads_menu(summaryview, FALSE);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideReadMessages",
+                                               FALSE);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideDelMessages",
+                                               FALSE);
+               summary_set_hide_menu(summaryview, "/Menu/View/HideReadThreads",
+                                               FALSE);
        }
 
        if (!hidden_removed) {
@@ -1587,6 +1590,12 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
 #undef CURRENTLY_DISPLAYED
 
+static void summary_cancel_mark_read_timeout(SummaryView *summaryview) {
+       if (summaryview->mark_as_read_timeout_tag != 0) {
+               g_source_remove(summaryview->mark_as_read_timeout_tag);
+               summaryview->mark_as_read_timeout_tag = 0;
+       }
+}
 
 void summary_clear_list(SummaryView *summaryview)
 {
@@ -1603,6 +1612,8 @@ void summary_clear_list(SummaryView *summaryview)
                summaryview->folder_item = NULL;
        }
 
+       summary_cancel_mark_read_timeout(summaryview);
+
        summaryview->display_msg = FALSE;
 
        summaryview->selected = NULL;
@@ -1894,15 +1905,11 @@ void summary_select_next_unread(SummaryView *summaryview)
                                                _("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
                        }
 
-                       if (val == G_ALERTALTERNATE) {
-                               folderview_select_next_unread(summaryview->folderview, TRUE);
-                               return;
-                       } 
-                       else
-                               return;
-               } else
+                       if (val == G_ALERTALTERNATE)
+                               folderview_select_next_with_flag(summaryview->folderview, MSG_UNREAD, TRUE);
+               } else {
                        summary_select_node(summaryview, node, TRUE, FALSE);
-
+               }
        }
 }
 
@@ -1994,7 +2001,7 @@ void summary_select_next_new(SummaryView *summaryview)
                        }
 
                        if (val == G_ALERTALTERNATE) {
-                               folderview_select_next_new(summaryview->folderview);
+                               folderview_select_next_with_flag(summaryview->folderview, MSG_NEW, TRUE);
                                return;
                        } 
                        else
@@ -2073,7 +2080,7 @@ void summary_select_next_marked(SummaryView *summaryview)
                        }
 
                        if (val == G_ALERTALTERNATE) {
-                               folderview_select_next_marked(summaryview->folderview);
+                               folderview_select_next_with_flag(summaryview->folderview, MSG_MARKED, TRUE);
                                return;
                        } 
                        else
@@ -2249,6 +2256,7 @@ void summary_select_node(SummaryView *summaryview, GtkCMCTreeNode *node,
        if (!summaryview->folder_item)
                return;
        if (node) {
+               summary_cancel_mark_read_timeout(summaryview);
                gtkut_ctree_expand_parent_all(ctree, node);
                if (do_refresh) {
                        summary_lock(summaryview);
@@ -3542,8 +3550,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 +3630,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);
@@ -4911,6 +4926,7 @@ gboolean summary_execute(SummaryView *summaryview)
 
                if (node == summaryview->displayed) {
                        messageview_clear(summaryview->messageview);
+                       summary_cancel_mark_read_timeout(summaryview);
                        summaryview->displayed = NULL;
                }
                if (GTK_CMCTREE_ROW(node)->children != NULL) {
@@ -5011,6 +5027,7 @@ gboolean summary_expunge(SummaryView *summaryview)
 
                if (node == summaryview->displayed) {
                        messageview_clear(summaryview->messageview);
+                       summary_cancel_mark_read_timeout(summaryview);
                        summaryview->displayed = NULL;
                }
                if (GTK_CMCTREE_ROW(node)->children != NULL) {
@@ -5443,6 +5460,8 @@ static void summary_unthread_for_exec_func(GtkCMCTree *ctree, GtkCMCTreeNode *no
        if (node == summaryview->displayed)
                summaryview->displayed = NULL;
 
+       summary_cancel_mark_read_timeout(summaryview);
+       
        for (top_parent = node;
             GTK_CMCTREE_ROW(top_parent)->parent != NULL;
             top_parent = GTK_CMCTREE_ROW(top_parent)->parent)
@@ -6879,7 +6898,7 @@ static void summary_unselected(GtkCMCTree *ctree, GtkCMCTreeNode *row,
 static void summary_selected(GtkCMCTree *ctree, GtkCMCTreeNode *row,
                             gint column, SummaryView *summaryview)
 {
-       GList *list, *cur;
+       const GList *list, *cur;
        MessageView *msgview;
        MsgInfo *msginfo;
        gboolean marked_unread = FALSE;
@@ -7792,38 +7811,15 @@ void summary_toggle_show_read_threads(SummaryView *summaryview)
        summary_show(summaryview, summaryview->folder_item);
 }
  
-static void summary_set_hide_read_msgs_menu (SummaryView *summaryview,
-                                            guint action)
+static void summary_set_hide_menu (SummaryView *summaryview,
+                                  const gchar *menu_item,
+                                  guint action)
 {
        GtkWidget *widget;
 
-       widget = gtk_ui_manager_get_widget(summaryview->mainwin->ui_manager, "/Menu/View/HideReadMessages");
-       g_object_set_data(G_OBJECT(widget), "dont_toggle",
-                         GINT_TO_POINTER(1));
-       gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(widget), action);
-       g_object_set_data(G_OBJECT(widget), "dont_toggle",
-                         GINT_TO_POINTER(0));
-}
-
-static void summary_set_hide_read_threads_menu (SummaryView *summaryview,
-                                            guint action)
-{
-       GtkWidget *widget;
-
-       widget = gtk_ui_manager_get_widget(summaryview->mainwin->ui_manager, "/Menu/View/HideReadThreads");
-       g_object_set_data(G_OBJECT(widget), "dont_toggle",
-                         GINT_TO_POINTER(1));
-       gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(widget), action);
-       g_object_set_data(G_OBJECT(widget), "dont_toggle",
-                         GINT_TO_POINTER(0));
-}
-
-static void summary_set_hide_del_msgs_menu (SummaryView *summaryview,
-                                            guint action)
-{
-       GtkWidget *widget;
+       widget = gtk_ui_manager_get_widget(summaryview->mainwin->ui_manager, menu_item);
+       cm_return_if_fail(widget != NULL);
 
-       widget = gtk_ui_manager_get_widget(summaryview->mainwin->ui_manager, "/Menu/View/HideDelMessages");
        g_object_set_data(G_OBJECT(widget), "dont_toggle",
                          GINT_TO_POINTER(1));
        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(widget), action);