Pierre Dorbais 17f7db2
diff -up vifm-0.5/src/keys.c.old vifm-0.5/src/keys.c
Pierre Dorbais 17f7db2
--- vifm-0.5/src/keys.c.old	2010-05-16 16:06:52.000000000 +0200
Pierre Dorbais 17f7db2
+++ vifm-0.5/src/keys.c	2010-05-16 16:11:21.000000000 +0200
Pierre Dorbais 17f7db2
@@ -330,6 +330,49 @@ restore_filename_filter(FileView *view)
Pierre Dorbais 17f7db2
 		moveto_list_pos(view, view->list_pos);
Pierre Dorbais 17f7db2
 }
Pierre Dorbais 17f7db2
 
Pierre Dorbais 17f7db2
+/** Deselects all files.
Pierre Dorbais 17f7db2
+ */
Pierre Dorbais 17f7db2
+static void
Pierre Dorbais 17f7db2
+deselect_all_files(FileView* view)
Pierre Dorbais 17f7db2
+{
Pierre Dorbais 17f7db2
+	int x;
Pierre Dorbais 17f7db2
+	for(x = 0; x < view->list_rows; x++)
Pierre Dorbais 17f7db2
+		view->dir_entry[x].selected = 0;
Pierre Dorbais 17f7db2
+	view->selected_files = 0;
Pierre Dorbais 17f7db2
+}
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
+/** Selects given number of files or current file.
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
+    If count == 0 and there is no selection, selects the current file.
Pierre Dorbais 17f7db2
+    Otherwise, if count == 1, selects number of files specified by
Pierre Dorbais 17f7db2
+    count_buf.
Pierre Dorbais 17f7db2
+ */
Pierre Dorbais 17f7db2
+static void
Pierre Dorbais 17f7db2
+select_n_files(FileView* view, int count, char* count_buf)
Pierre Dorbais 17f7db2
+{
Pierre Dorbais 17f7db2
+	if (count)
Pierre Dorbais 17f7db2
+	{
Pierre Dorbais 17f7db2
+		int x = 0;
Pierre Dorbais 17f7db2
+		int y = view->list_pos;
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
+		deselect_all_files(view);
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
+		for ( ; x < atoi(count_buf); x++)
Pierre Dorbais 17f7db2
+		{
Pierre Dorbais 17f7db2
+			view->dir_entry[y].selected = 1;
Pierre Dorbais 17f7db2
+			y++;
Pierre Dorbais 17f7db2
+			if (y >= view->list_rows)
Pierre Dorbais 17f7db2
+				break;
Pierre Dorbais 17f7db2
+		}
Pierre Dorbais 17f7db2
+		view->selected_files = y - view->list_pos;
Pierre Dorbais 17f7db2
+	}
Pierre Dorbais 17f7db2
+	else if (!view->selected_files)
Pierre Dorbais 17f7db2
+	{
Pierre Dorbais 17f7db2
+		view->dir_entry[view->list_pos].selected = 1;
Pierre Dorbais 17f7db2
+		view->selected_files = 1;
Pierre Dorbais 17f7db2
+	}
Pierre Dorbais 17f7db2
+}
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
 static void
Pierre Dorbais 17f7db2
 yank_files(FileView *view, int count, char *count_buf)
Pierre Dorbais 17f7db2
 {
Pierre Dorbais 17f7db2
@@ -376,6 +419,25 @@ yank_files(FileView *view, int count, ch
Pierre Dorbais 17f7db2
 }
Pierre Dorbais 17f7db2
 
Pierre Dorbais 17f7db2
 static void
Pierre Dorbais 17f7db2
+delete_files(FileView *view, int count, char *count_buf)
Pierre Dorbais 17f7db2
+{
Pierre Dorbais 17f7db2
+	char buf[32];
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
+	select_n_files(view, count, count_buf);
Pierre Dorbais 17f7db2
+	get_all_selected_files(view);
Pierre Dorbais 17f7db2
+	delete_file(view);
Pierre Dorbais 17f7db2
+	free_selected_file_array(view);
Pierre Dorbais 17f7db2
+	count = view->selected_files;
Pierre Dorbais 17f7db2
+	deselect_all_files(view);
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
+	draw_dir_list(view, view->top_line, view->list_pos); 
Pierre Dorbais 17f7db2
+	moveto_list_pos(view, view->list_pos);
Pierre Dorbais 17f7db2
+	snprintf(buf, sizeof(buf), " %d %s deleted.", count, 
Pierre Dorbais 17f7db2
+			count == 1 ? "file" : "files");
Pierre Dorbais 17f7db2
+	status_bar_message(buf);
Pierre Dorbais 17f7db2
+}
Pierre Dorbais 17f7db2
+
Pierre Dorbais 17f7db2
+static void
Pierre Dorbais 17f7db2
 tag_file(FileView *view)
Pierre Dorbais 17f7db2
 {
Pierre Dorbais 17f7db2
 	if(view->dir_entry[view->list_pos].selected == 0)
Pierre Dorbais 17f7db2
@@ -1077,21 +1139,7 @@ main_key_press_cb(FileView *view)
Pierre Dorbais 17f7db2
 					if(curr_stats.last_char == 'd')
Pierre Dorbais 17f7db2
 					{
Pierre Dorbais 17f7db2
 						clear_num_window();
Pierre Dorbais 17f7db2
-						if(view->selected_files)
Pierre Dorbais 17f7db2
-							delete_file(view);
Pierre Dorbais 17f7db2
-						else if(count)
Pierre Dorbais 17f7db2
-						{
Pierre Dorbais 17f7db2
-							int x;
Pierre Dorbais 17f7db2
-							int y = view->list_pos;
Pierre Dorbais 17f7db2
-							for(x = 0; x < atoi(count_buf); x++)
Pierre Dorbais 17f7db2
-							{
Pierre Dorbais 17f7db2
-								view->dir_entry[y].selected = 1;
Pierre Dorbais 17f7db2
-								y++;
Pierre Dorbais 17f7db2
-							}
Pierre Dorbais 17f7db2
-							delete_file(view);
Pierre Dorbais 17f7db2
-						}
Pierre Dorbais 17f7db2
-						else
Pierre Dorbais 17f7db2
-							delete_file(view);
Pierre Dorbais 17f7db2
+						delete_files(view, count, count_buf);
Pierre Dorbais 17f7db2
 						reset_last_char = 1;
Pierre Dorbais 17f7db2
 					}
Pierre Dorbais 17f7db2
 				}