mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Adjust the logic when deleting last buffer to better preserve the
selection: if selecting the element below the deleted one fails (because as the last one), select the one above it instead. From Daniel Mueller, GitHub issue 4043.
This commit is contained in:
		@@ -261,19 +261,21 @@ mode_tree_up(struct mode_tree_data *mtd, int wrap)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					int
 | 
				
			||||||
mode_tree_down(struct mode_tree_data *mtd, int wrap)
 | 
					mode_tree_down(struct mode_tree_data *mtd, int wrap)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (mtd->current == mtd->line_size - 1) {
 | 
						if (mtd->current == mtd->line_size - 1) {
 | 
				
			||||||
		if (wrap) {
 | 
							if (wrap) {
 | 
				
			||||||
			mtd->current = 0;
 | 
								mtd->current = 0;
 | 
				
			||||||
			mtd->offset = 0;
 | 
								mtd->offset = 0;
 | 
				
			||||||
		}
 | 
							} else
 | 
				
			||||||
 | 
								return (0);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		mtd->current++;
 | 
							mtd->current++;
 | 
				
			||||||
		if (mtd->current > mtd->offset + mtd->height - 1)
 | 
							if (mtd->current > mtd->offset + mtd->height - 1)
 | 
				
			||||||
			mtd->offset++;
 | 
								mtd->offset++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return (1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *
 | 
					void *
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							@@ -3138,7 +3138,7 @@ int	 mode_tree_set_current(struct mode_tree_data *, uint64_t);
 | 
				
			|||||||
void	 mode_tree_each_tagged(struct mode_tree_data *, mode_tree_each_cb,
 | 
					void	 mode_tree_each_tagged(struct mode_tree_data *, mode_tree_each_cb,
 | 
				
			||||||
	     struct client *, key_code, int);
 | 
						     struct client *, key_code, int);
 | 
				
			||||||
void	 mode_tree_up(struct mode_tree_data *, int);
 | 
					void	 mode_tree_up(struct mode_tree_data *, int);
 | 
				
			||||||
void	 mode_tree_down(struct mode_tree_data *, int);
 | 
					int	 mode_tree_down(struct mode_tree_data *, int);
 | 
				
			||||||
struct mode_tree_data *mode_tree_start(struct window_pane *, struct args *,
 | 
					struct mode_tree_data *mode_tree_start(struct window_pane *, struct args *,
 | 
				
			||||||
	     mode_tree_build_cb, mode_tree_draw_cb, mode_tree_search_cb,
 | 
						     mode_tree_build_cb, mode_tree_draw_cb, mode_tree_search_cb,
 | 
				
			||||||
	     mode_tree_menu_cb, mode_tree_height_cb, mode_tree_key_cb, void *,
 | 
						     mode_tree_menu_cb, mode_tree_height_cb, mode_tree_key_cb, void *,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -408,8 +408,17 @@ window_buffer_do_delete(void *modedata, void *itemdata,
 | 
				
			|||||||
	struct window_buffer_itemdata	*item = itemdata;
 | 
						struct window_buffer_itemdata	*item = itemdata;
 | 
				
			||||||
	struct paste_buffer		*pb;
 | 
						struct paste_buffer		*pb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (item == mode_tree_get_current(data->data))
 | 
						if (item == mode_tree_get_current(data->data) &&
 | 
				
			||||||
		mode_tree_down(data->data, 0);
 | 
						    !mode_tree_down(data->data, 0)) {
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 *If we were unable to select the item further down we are at
 | 
				
			||||||
 | 
							 * the end of the list. Move one element up instead, to make
 | 
				
			||||||
 | 
							 * sure that we preserve a valid selection or we risk having
 | 
				
			||||||
 | 
							 * the tree build logic reset it to the first item.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							mode_tree_up(data->data, 0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((pb = paste_get_name(item->name)) != NULL)
 | 
						if ((pb = paste_get_name(item->name)) != NULL)
 | 
				
			||||||
		paste_free(pb);
 | 
							paste_free(pb);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -508,7 +517,7 @@ window_buffer_key(struct window_mode_entry *wme, struct client *c,
 | 
				
			|||||||
	struct window_buffer_itemdata	*item;
 | 
						struct window_buffer_itemdata	*item;
 | 
				
			||||||
	int				 finished;
 | 
						int				 finished;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (paste_get_top(NULL) == NULL) {
 | 
						if (paste_is_empty()) {
 | 
				
			||||||
		finished = 1;
 | 
							finished = 1;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -541,7 +550,7 @@ window_buffer_key(struct window_mode_entry *wme, struct client *c,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	if (finished || paste_get_top(NULL) == NULL)
 | 
						if (finished || paste_is_empty())
 | 
				
			||||||
		window_pane_reset_mode(wp);
 | 
							window_pane_reset_mode(wp);
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
		mode_tree_draw(mtd);
 | 
							mode_tree_draw(mtd);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user