Fix a few errors in how the selected line is chosen after resize,

reported by Felix Rosencrantz in GitHub issue 1059.
pull/1062/merge
nicm 2017-09-08 16:28:41 +00:00
parent 78cf3c14ca
commit f56f09ea38
1 changed files with 16 additions and 11 deletions

View File

@ -127,6 +127,17 @@ mode_tree_free_items(struct mode_tree_list *mtl)
}
}
static void
mode_tree_check_selected(struct mode_tree_data *mtd)
{
/*
* If the current line would now be off screen reset the offset to the
* last visible line.
*/
if (mtd->current > mtd->height - 1)
mtd->offset = mtd->current - mtd->height + 1;
}
static void
mode_tree_clear_lines(struct mode_tree_data *mtd)
{
@ -192,7 +203,7 @@ mode_tree_set_current(struct mode_tree_data *mtd, uint64_t tag)
if (i != mtd->line_size) {
mtd->current = i;
if (mtd->current > mtd->height - 1)
mtd->offset = 1 + mtd->current - mtd->height;
mtd->offset = mtd->current - mtd->height + 1;
else
mtd->offset = 0;
} else {
@ -361,6 +372,7 @@ mode_tree_build(struct mode_tree_data *mtd)
mtd->height = screen_size_y(s);
} else
mtd->height = screen_size_y(s);
mode_tree_check_selected(mtd);
}
static void
@ -792,7 +804,7 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
case KEYC_END:
mtd->current = mtd->line_size - 1;
if (mtd->current > mtd->height - 1)
mtd->offset = mtd->current - mtd->height;
mtd->offset = mtd->current - mtd->height + 1;
else
mtd->offset = 0;
break;
@ -870,15 +882,8 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
case 'v':
mtd->preview = !mtd->preview;
mode_tree_build(mtd);
/*
* If the current line would now be off screen now the preview
* is on, reset the the offset to the last visible line.
*/
if (mtd->preview && mtd->current > mtd->height - 1) {
mtd->offset = mtd->current - mtd->height;
mtd->current--;
}
if (mtd->preview)
mode_tree_check_selected(mtd);
break;
}
return (0);