talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 67c288116ae3cad0f949e6a52e162612243abde7
parent c25cd494328a72d50880aa1e6c479bbe1496c567
Author: Paul <paul@claws-mail.org>
Date:   Mon, 25 Nov 2019 12:52:44 +0000

avoid unwanted summaryview refresh...

... such as when modifying a msg by Actions
Should also fix bug 4277, 'INBOX being "read" automatically - being
marked as read before being selected'

Diffstat:
Msrc/action.c | 4++--
Msrc/folderview.c | 6+++---
Msrc/imap_gtk.c | 2+-
Msrc/mainwindow.c | 8++++----
Msrc/mh_gtk.c | 2+-
Msrc/news_gtk.c | 2+-
Msrc/plugins/mailmbox/plugin_gtk.c | 4++--
Msrc/plugins/vcalendar/vcal_meeting_gtk.c | 4++--
Msrc/plugins/vcalendar/vcalendar.c | 8++++----
Msrc/prefs_folder_item.c | 2+-
Msrc/summaryview.c | 101++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/summaryview.h | 3++-
12 files changed, 79 insertions(+), 67 deletions(-)

diff --git a/src/action.c b/src/action.c @@ -753,7 +753,7 @@ static gboolean execute_filtering_actions(gchar *action, GSList *msglist) summary_thaw(summaryview); main_window_cursor_normal(mainwin); summary_unlock(summaryview); - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); } for (p = action_list; p; p = g_slist_next(p)) if (p->data) filteringaction_free(p->data); @@ -1484,7 +1484,7 @@ static void catch_status(GPid pid, gint status, gpointer data) } if (modified_something && last_item && summaryview && summaryview->folder_item == last_item) { - summary_show (summaryview, summaryview->folder_item); + summary_show (summaryview, summaryview->folder_item, FALSE); } g_slist_free (child_info->msginfo_list); child_info->msginfo_list = NULL; diff --git a/src/folderview.c b/src/folderview.c @@ -1796,7 +1796,7 @@ static gboolean folderview_update_item_claws(gpointer source, gpointer data) update_info->item == folderview->summaryview->folder_item && update_info->item != NULL) if (!quicksearch_has_sat_predicate(folderview->summaryview->quicksearch)) - summary_show(folderview->summaryview, update_info->item); + summary_show(folderview->summaryview, update_info->item, FALSE); } return FALSE; @@ -2228,7 +2228,7 @@ void folderview_close_opened(FolderView *folderview, gboolean dirty) main_window_cursor_wait(folderview->mainwin); g_free(buf); summary_save_prefs_to_folderitem(folderview->summaryview, olditem); - summary_show(folderview->summaryview, NULL); + summary_show(folderview->summaryview, NULL, FALSE); folder_item_close(olditem); main_window_cursor_normal(folderview->mainwin); STATUSBAR_POP(folderview->mainwin); @@ -2361,7 +2361,7 @@ static void folderview_selected(GtkCMCTree *ctree, GtkCMCTreeNode *row, /* Show messages */ summary_set_prefs_from_folderitem(folderview->summaryview, item); - opened = summary_show(folderview->summaryview, item); + opened = summary_show(folderview->summaryview, item, FALSE); folder_clean_cache_memory(item); diff --git a/src/imap_gtk.c b/src/imap_gtk.c @@ -404,7 +404,7 @@ static void update_tree_cb(GtkAction *action, gpointer data) item = folderview_get_selected_item(folderview); cm_return_if_fail(item != NULL); - summary_show(folderview->summaryview, NULL); + summary_show(folderview->summaryview, NULL, FALSE); cm_return_if_fail(item->folder != NULL); diff --git a/src/mainwindow.c b/src/mainwindow.c @@ -2779,7 +2779,7 @@ void main_window_toggle_message_view(MainWindow *mainwin) } summary_grab_focus(summaryview); if (!summary_is_list(summaryview)) { - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); } } @@ -3946,7 +3946,7 @@ static void add_mailbox_cb(GtkAction *action, gpointer data) static void update_folderview_cb(GtkAction *action, gpointer data) { MainWindow *mainwin = (MainWindow *)data; - summary_show(mainwin->summaryview, NULL); + summary_show(mainwin->summaryview, NULL, FALSE); folderview_check_new_all(); } @@ -4634,7 +4634,7 @@ static void thread_cb(GtkAction *action, gpointer data) mainwin->summaryview->threaded = threaded; summary_show(mainwin->summaryview, - mainwin->summaryview->folder_item); + mainwin->summaryview->folder_item, FALSE); summary_select_by_msgnum(mainwin->summaryview, selected_msgnum, FALSE); } @@ -4826,7 +4826,7 @@ static void update_summary_cb(GtkAction *action, gpointer data) folder_update_op_count(); folder_item_scan(fitem); - summary_show(mainwin->summaryview, fitem); + summary_show(mainwin->summaryview, fitem, FALSE); } static void prev_cb(GtkAction *action, gpointer data) diff --git a/src/mh_gtk.c b/src/mh_gtk.c @@ -345,7 +345,7 @@ static void update_tree_cb(GtkAction *action, gpointer data) item = folderview_get_selected_item(folderview); cm_return_if_fail(item != NULL); - summary_show(folderview->summaryview, NULL); + summary_show(folderview->summaryview, NULL, FALSE); cm_return_if_fail(item->folder != NULL); diff --git a/src/news_gtk.c b/src/news_gtk.c @@ -329,7 +329,7 @@ static void update_tree_cb(GtkAction *action, gpointer data) if (mainwin->lock_count || news_folder_locked(item->folder)) return; - summary_show(folderview->summaryview, NULL); + summary_show(folderview->summaryview, NULL, FALSE); cm_return_if_fail(item->folder != NULL); diff --git a/src/plugins/mailmbox/plugin_gtk.c b/src/plugins/mailmbox/plugin_gtk.c @@ -172,7 +172,7 @@ static void update_tree_cb(GtkAction *action, gpointer data) item = folderview_get_selected_item(folderview); g_return_if_fail(item != NULL); - summary_show(folderview->summaryview, NULL); + summary_show(folderview->summaryview, NULL, FALSE); g_return_if_fail(item->folder != NULL); @@ -348,7 +348,7 @@ static void delete_folder_cb(GtkAction *action, gpointer data) alertpanel_error(_("Can't remove the folder '%s'."), name); if (item == opened) summary_show(folderview->summaryview, - folderview->summaryview->folder_item); + folderview->summaryview->folder_item, FALSE); g_free(old_id); return; } diff --git a/src/plugins/vcalendar/vcal_meeting_gtk.c b/src/plugins/vcalendar/vcal_meeting_gtk.c @@ -1204,7 +1204,7 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data) MainWindow *mainwin = mainwindow_get_mainwindow(); if (mainwin->summaryview->folder_item == folder->inbox) { redisp = TRUE; - summary_show(mainwin->summaryview, NULL); + summary_show(mainwin->summaryview, NULL, FALSE); } } gtk_widget_set_sensitive(meet->save_btn, FALSE); @@ -1317,7 +1317,7 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data) if (folder && redisp) { MainWindow *mainwin = mainwindow_get_mainwindow(); - summary_show(mainwin->summaryview, folder->inbox); + summary_show(mainwin->summaryview, folder->inbox, FALSE); } return res; diff --git a/src/plugins/vcalendar/vcalendar.c b/src/plugins/vcalendar/vcalendar.c @@ -927,7 +927,7 @@ void vcalendar_refresh_folder_contents(FolderItem *item) MainWindow *mainwin = mainwindow_get_mainwindow(); folder_item_scan(item); if (mainwin->summaryview->folder_item == item) { - summary_show(mainwin->summaryview, item); + summary_show(mainwin->summaryview, item, FALSE); } } } @@ -971,7 +971,7 @@ void vcalendar_cancel_meeting(FolderItem *item, const gchar *uid) MainWindow *mainwin = mainwindow_get_mainwindow(); if (mainwin->summaryview->folder_item == item) { redisp = TRUE; - summary_show(mainwin->summaryview, NULL); + summary_show(mainwin->summaryview, NULL, FALSE); } } @@ -986,7 +986,7 @@ void vcalendar_cancel_meeting(FolderItem *item, const gchar *uid) if (folder && redisp) { MainWindow *mainwin = mainwindow_get_mainwindow(); - summary_show(mainwin->summaryview, item); + summary_show(mainwin->summaryview, item, FALSE); } return; } @@ -1002,7 +1002,7 @@ void vcalendar_cancel_meeting(FolderItem *item, const gchar *uid) folder_item_scan(item); if (folder && redisp) { MainWindow *mainwin = mainwindow_get_mainwindow(); - summary_show(mainwin->summaryview, item); + summary_show(mainwin->summaryview, item, FALSE); } return; diff --git a/src/prefs_folder_item.c b/src/prefs_folder_item.c @@ -756,7 +756,7 @@ static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage if (folder->opened && summary_update_needed) { summary_set_prefs_from_folderitem(folderview->summaryview, folder); - summary_show(folderview->summaryview, folder); + summary_show(folderview->summaryview, folder, FALSE); } } diff --git a/src/summaryview.c b/src/summaryview.c @@ -1258,7 +1258,7 @@ gboolean summaryview_search_root_progress(gpointer data, guint at, guint matched return TRUE; } -gboolean summary_show(SummaryView *summaryview, FolderItem *item) +gboolean summary_show(SummaryView *summaryview, FolderItem *item, gboolean avoid_refresh) { GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree); GtkCMCTreeNode *node = NULL; @@ -1285,7 +1285,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) utils_free_regex(); - is_refresh = (item == summaryview->folder_item) ? TRUE : FALSE; + is_refresh = (item == summaryview->folder_item && !manual_filtering) ? TRUE : FALSE; if (item && item->folder->klass->item_opened) { item->folder->klass->item_opened(item); @@ -1417,7 +1417,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) main_window_cursor_normal(summaryview->mainwin); summary_unlock(summaryview); inc_unlock(); - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); END_TIMING(); return FALSE; } @@ -1500,43 +1500,52 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) g_slist_free(mlist); - if (quicksearch_is_in_typing(summaryview->quicksearch) || - quicksearch_is_running(summaryview->quicksearch)) { - summaryview->displayed = - summary_find_msg_by_msgnum(summaryview, - displayed_msgnum); - if (!summaryview->displayed) - messageview_clear(summaryview->messageview); - summary_unlock(summaryview); - - if (quicksearch_is_running(summaryview->quicksearch)) - summary_select_by_msgnum(summaryview, selected_msgnum, - OPEN_SELECTED_ON_SEARCH_RESULTS); - else - summary_select_by_msgnum(summaryview, selected_msgnum, - FALSE); - - summary_lock(summaryview); - if (!summaryview->selected) { - /* no selected message - select first unread - message, but do not display it */ - node = summary_find_next_flagged_msg(summaryview, NULL, - MSG_UNREAD, FALSE); - if (node == NULL && GTK_CMCLIST(ctree)->row_list != NULL) - node = gtk_cmctree_node_nth - (ctree, - item->sort_type == SORT_DESCENDING - ? 0 : GTK_CMCLIST(ctree)->rows - 1); + if (is_refresh) { + if (!quicksearch_is_in_typing(summaryview->quicksearch)) { + summaryview->displayed = + summary_find_msg_by_msgnum(summaryview, + displayed_msgnum); + if (!summaryview->displayed) + messageview_clear(summaryview->messageview); summary_unlock(summaryview); if (quicksearch_is_running(summaryview->quicksearch)) - summary_select_node(summaryview, node, + summary_select_by_msgnum(summaryview, selected_msgnum, OPEN_SELECTED_ON_SEARCH_RESULTS); else - summary_select_node(summaryview, node, - OPEN_SELECTED_ON_FOLDER_OPEN); + summary_select_by_msgnum(summaryview, selected_msgnum, + FALSE); summary_lock(summaryview); + if (!summaryview->selected) { + /* no selected message - select first unread + message, but do not display it */ + node = summary_find_next_flagged_msg(summaryview, NULL, + MSG_UNREAD, FALSE); + if (node == NULL && GTK_CMCLIST(ctree)->row_list != NULL) + node = gtk_cmctree_node_nth + (ctree, + item->sort_type == SORT_DESCENDING + ? 0 : GTK_CMCLIST(ctree)->rows - 1); + summary_unlock(summaryview); + + if (quicksearch_is_running(summaryview->quicksearch)) + summary_select_node(summaryview, node, + OPEN_SELECTED_ON_SEARCH_RESULTS); + else + summary_select_node(summaryview, node, + OPEN_SELECTED_ON_FOLDER_OPEN); + + summary_lock(summaryview); + } + } else { + /* just select first/last */ + if (GTK_CMCLIST(ctree)->row_list != NULL) + node = gtk_cmctree_node_nth + (ctree, + item->sort_type == SORT_DESCENDING + ? 0 : GTK_CMCLIST(ctree)->rows - 1); + summary_select_node(summaryview, node, OPEN_SELECTED_ON_SEARCH_RESULTS); } } else { /* backward compat */ @@ -1642,10 +1651,12 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) if (node) { gint open_selected = -1; - if (OPEN_SELECTED_ON_FOLDER_OPEN) - open_selected = 1; - else - open_selected = 0; + if (!is_refresh) { + if (OPEN_SELECTED_ON_FOLDER_OPEN) + open_selected = 1; + else + open_selected = 0; + } summary_select_node(summaryview, node, open_selected); } @@ -2991,7 +3002,7 @@ void summary_reflect_prefs(void) summary_relayout(summaryview); if (summaryview->folder_item) - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); } void summary_sort(SummaryView *summaryview, @@ -5179,7 +5190,7 @@ gboolean summary_execute(SummaryView *summaryview) main_window_cursor_normal(summaryview->mainwin); if (move_val < 0) - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); return TRUE; } @@ -5867,7 +5878,7 @@ void summary_filter(SummaryView *summaryview, gboolean selected_only) * CLAWS: summary_show() only valid after having a lock. ideally * we want the lock to be context aware... */ - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, TRUE); } static void summary_filter_func(MsgInfo *msginfo, PrefsAccount *ac_prefs) @@ -6849,7 +6860,7 @@ void summary_set_column_order(SummaryView *summaryview) gtk_container_add(GTK_CONTAINER(scrolledwin), ctree); gtk_widget_show(ctree); - summary_show(summaryview, item); + summary_show(summaryview, item, FALSE); summary_select_by_msgnum(summaryview, selected_msgnum, FALSE); @@ -7108,7 +7119,7 @@ static void quicksearch_execute_cb(QuickSearch *quicksearch, gpointer data) SummaryView *summaryview = data; summaryview_reset_recursive_folder_match(summaryview); - if (summary_show(summaryview, summaryview->folder_item)) + if (summary_show(summaryview, summaryview->folder_item, FALSE)) summaryview_quicksearch_recurse(summaryview); else summaryview_reset_recursive_folder_match(summaryview); @@ -8100,7 +8111,7 @@ void summary_toggle_show_read_messages(SummaryView *summaryview) source.update_flags = F_ITEM_UPDATE_NAME; source.msg = NULL; hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source); - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); } void summary_toggle_show_del_messages(SummaryView *summaryview) @@ -8115,7 +8126,7 @@ void summary_toggle_show_del_messages(SummaryView *summaryview) source.update_flags = F_ITEM_UPDATE_NAME; source.msg = NULL; hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source); - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); } void summary_toggle_show_read_threads(SummaryView *summaryview) @@ -8130,7 +8141,7 @@ void summary_toggle_show_read_threads(SummaryView *summaryview) source.update_flags = F_ITEM_UPDATE_NAME; source.msg = NULL; hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source); - summary_show(summaryview, summaryview->folder_item); + summary_show(summaryview, summaryview->folder_item, FALSE); } static void summary_set_hide_menu (SummaryView *summaryview, diff --git a/src/summaryview.h b/src/summaryview.h @@ -188,7 +188,8 @@ SummaryView *summary_create(MainWindow *mainwin); void summaryview_destroy(SummaryView *summaryview); void summary_init (SummaryView *summaryview); gboolean summary_show (SummaryView *summaryview, - FolderItem *fitem); + FolderItem *fitem, + gboolean avoid_refresh); void summary_clear_list (SummaryView *summaryview); void summary_clear_all (SummaryView *summaryview);