Fix Shift+arrowkeys selection behavior in summaryview.
[claws.git] / src / summaryview.c
index 9e438f56112f6c5a8db4e1a944b828c594ed35b7..aaf4d24d2fc16c789750d3386738675ecc287026 100644 (file)
@@ -4431,11 +4431,11 @@ void summary_delete(SummaryView *summaryview)
 
        if (summaryview->sort_type == SORT_ASCENDING) {
                node = summary_find_next_msg(summaryview, sel_last);
-               if (!node)
+               if (!node || prefs_common.next_on_delete == FALSE)
                        node = summary_find_prev_msg(summaryview, sel_last);
        } else {
                node = summary_find_prev_msg(summaryview, sel_last);
-               if (!node)
+               if (!node || prefs_common.next_on_delete == FALSE)
                        node = summary_find_next_msg(summaryview, sel_last);
        }
        summary_select_node(summaryview, node, prefs_common.always_show_msg, TRUE);
@@ -4760,7 +4760,8 @@ void summary_unselect_all(SummaryView *summaryview)
        summary_status_show(summaryview);
 }
 
-void summary_select_thread(SummaryView *summaryview, gboolean delete_thread)
+void summary_select_thread(SummaryView *summaryview, gboolean delete_thread,
+                          gboolean trash_thread)
 {
        GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
        GtkCMCTreeNode *node = NULL;
@@ -4786,12 +4787,14 @@ void summary_select_thread(SummaryView *summaryview, gboolean delete_thread)
        g_list_free(copy);
        END_LONG_OPERATION(summaryview);
 
-       if (delete_thread) {
+       if (trash_thread) {
                if (FOLDER_TYPE(summaryview->folder_item->folder) == F_NEWS)
                        summary_delete(summaryview);
                else
                        summary_delete_trash(summaryview);
-       }
+       } else if (delete_thread)
+               summary_delete(summaryview);
+
        summary_status_show(summaryview);
 }
 
@@ -6793,12 +6796,28 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                return TRUE;
        case GDK_KEY_Home:
        case GDK_KEY_End:
+       case GDK_KEY_Up:
+       case GDK_KEY_Down:
                if ((node = summaryview->selected) != NULL) {
                        GtkCMCTreeNode *next = NULL;
-                       next = (event->keyval == GDK_KEY_Home)
-                                       ? gtk_cmctree_node_nth(ctree, 0)
-                                       : gtk_cmctree_node_nth(ctree, 
-                                               g_list_length(GTK_CMCLIST(ctree)->row_list)-1);
+                       switch (event->keyval) {
+                               case GDK_KEY_Home:
+                                       next = gtk_cmctree_node_nth(ctree, 0);
+                                       break;
+                               case GDK_KEY_End:
+                                       next = gtk_cmctree_node_nth(ctree,
+                                                       g_list_length(GTK_CMCLIST(ctree)->row_list)-1);
+                                       break;
+                               case GDK_KEY_Up:
+                                       next = gtk_cmctree_node_nth(ctree,
+                                                       MAX(0, GTK_CMCLIST(ctree)->focus_row - 1));
+                                       break;
+                               case GDK_KEY_Down:
+                                       next = gtk_cmctree_node_nth(ctree,
+                                                       MIN(GTK_CMCLIST(ctree)->focus_row + 1, GTK_CMCLIST(ctree)->rows));
+                                       break;
+                       }
+
                        if (next) {
                                gtk_sctree_select_with_state
                                        (GTK_SCTREE(ctree), next, (event->state & ~GDK_CONTROL_MASK) );