choose-tree: Reset top when toggling items

When choose-tree is told to expand/collapse items (especially when first
rendering collapsed to just show sessions), ensure that in addition to
setting the selected item, that the item itself appears on the bottom of the
screen, rather than off screen.

This was causing rendering glitches when a very small tmux window tried to
render a list of items in choose-tree much larger than itself, and the
selected item appeared off screen, and didn't show the selection until the
selection had wrapped around to the top of the screen.
This commit is contained in:
Thomas 2013-08-09 10:37:46 +01:00 committed by Thomas Adam
parent 5532766b19
commit aa4920fea3
2 changed files with 17 additions and 9 deletions

View File

@ -228,7 +228,6 @@ windows_only:
free(final_win_template_last); free(final_win_template_last);
window_choose_ready(wl->window->active, cur_win, NULL); window_choose_ready(wl->window->active, cur_win, NULL);
window_choose_collapse_all(wl->window->active);
if (args_has(args, 'u')) { if (args_has(args, 'u')) {
window_choose_expand_all(wl->window->active); window_choose_expand_all(wl->window->active);

View File

@ -81,6 +81,7 @@ int window_choose_key_index(struct window_choose_mode_data *, u_int);
int window_choose_index_key(struct window_choose_mode_data *, int); int window_choose_index_key(struct window_choose_mode_data *, int);
void window_choose_prompt_input(enum window_choose_input_type, void window_choose_prompt_input(enum window_choose_input_type,
const char *, struct window_pane *, int); const char *, struct window_pane *, int);
void window_choose_reset_top(struct window_pane *, u_int);
void void
window_choose_add(struct window_pane *wp, struct window_choose_data *wcd) window_choose_add(struct window_pane *wp, struct window_choose_data *wcd)
@ -107,8 +108,17 @@ window_choose_set_current(struct window_pane *wp, u_int cur)
struct screen *s = &data->screen; struct screen *s = &data->screen;
data->selected = cur; data->selected = cur;
if (data->selected > screen_size_y(s) - 1) window_choose_reset_top(wp, screen_size_y(s));
data->top = ARRAY_LENGTH(&data->list) - screen_size_y(s); }
void
window_choose_reset_top(struct window_pane *wp, u_int sy)
{
struct window_choose_mode_data *data = wp->modedata;
data->top = 0;
if (data->selected > sy - 1)
data->top = data->selected - (sy - 1);
window_choose_redraw_screen(wp); window_choose_redraw_screen(wp);
} }
@ -277,10 +287,7 @@ window_choose_resize(struct window_pane *wp, u_int sx, u_int sy)
struct window_choose_mode_data *data = wp->modedata; struct window_choose_mode_data *data = wp->modedata;
struct screen *s = &data->screen; struct screen *s = &data->screen;
data->top = 0; window_choose_reset_top(wp, sy);
if (data->selected > sy - 1)
data->top = data->selected - (sy - 1);
screen_resize(s, sx, sy, 0); screen_resize(s, sx, sy, 0);
window_choose_redraw_screen(wp); window_choose_redraw_screen(wp);
} }
@ -373,6 +380,7 @@ window_choose_collapse_all(struct window_pane *wp)
{ {
struct window_choose_mode_data *data = wp->modedata; struct window_choose_mode_data *data = wp->modedata;
struct window_choose_mode_item *item; struct window_choose_mode_item *item;
struct screen *scr = &data->screen;
struct session *s, *chosen; struct session *s, *chosen;
u_int i; u_int i;
@ -391,7 +399,7 @@ window_choose_collapse_all(struct window_pane *wp)
if (item->wcd->type & TREE_SESSION) if (item->wcd->type & TREE_SESSION)
data->selected = i; data->selected = i;
} }
window_choose_redraw_screen(wp); window_choose_reset_top(wp, screen_size_y(scr));
} }
void void
@ -399,6 +407,7 @@ window_choose_expand_all(struct window_pane *wp)
{ {
struct window_choose_mode_data *data = wp->modedata; struct window_choose_mode_data *data = wp->modedata;
struct window_choose_mode_item *item; struct window_choose_mode_item *item;
struct screen *scr = &data->screen;
struct session *s; struct session *s;
u_int i; u_int i;
@ -414,7 +423,7 @@ window_choose_expand_all(struct window_pane *wp)
} }
} }
window_choose_redraw_screen(wp); window_choose_reset_top(wp, screen_size_y(scr));
} }
void void