diff options
author | nicm <nicm> | 2017-09-08 16:28:41 +0000 |
---|---|---|
committer | nicm <nicm> | 2017-09-08 16:28:41 +0000 |
commit | f56f09ea3871d3099dd31030501b982a4243a372 (patch) | |
tree | ff5fef72e48e88bacf9d76148e3d678a835f580b /mode-tree.c | |
parent | 78cf3c14ca44bbbebd3fcb374c0397c72caf6c78 (diff) | |
download | rtmux-f56f09ea3871d3099dd31030501b982a4243a372.tar.gz rtmux-f56f09ea3871d3099dd31030501b982a4243a372.tar.bz2 rtmux-f56f09ea3871d3099dd31030501b982a4243a372.zip |
Fix a few errors in how the selected line is chosen after resize,
reported by Felix Rosencrantz in GitHub issue 1059.
Diffstat (limited to 'mode-tree.c')
-rw-r--r-- | mode-tree.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/mode-tree.c b/mode-tree.c index fc31592a..ad783bb4 100644 --- a/mode-tree.c +++ b/mode-tree.c @@ -128,6 +128,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) { free(mtd->line_list); @@ -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); |