mirror of
https://github.com/tmux/tmux.git
synced 2025-03-30 19:48:48 +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:
parent
ddd4e57c65
commit
7b6fbe7262
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user