On Tue, Aug 06, 2013 at 10:53:17PM +0000, Mislav Marohnić wrote:
> 
> 
> 
> ---
> 
> ** [tickets:#53] choose-tree doesn't render properly given a large number of 
> sessions & windows**
> 
> **Status:** open
> **Created:** Tue Aug 06, 2013 10:53 PM UTC by Mislav Marohnić
> **Last Updated:** Tue Aug 06, 2013 10:53 PM UTC
> **Owner:** nobody
> 
> choose-tree (activated by the default `C-b s`) has rendering oddities
> given a large enough number of sessions & windows, and depending on the
> position of the current session in that list.
> 
> If I'm currently in one of the sessions near the top of the list,
> choose-tree renders normally. However, when I switch to one of the
> sessions near the bottom of the list and activate choose-tree again,
> choose-tree either renders just the last few items (leaving most of the
> terminal vertical real-estate unused), or, in the most extreme case,
> doesn't render the tree at all. Up/down navigation with `j/k` keys works
> and eventually leads to re-rendering of the tree if it was previously not
> displayed.

Can you please try the following patch?  I think it should solve your
problem.

-- Thomas Adam
>From 81c892b0960e2e1fd6c4bc120046e0c80ccb8e99 Mon Sep 17 00:00:00 2001
From: Thomas <tho...@xteddy.org>
Date: Fri, 9 Aug 2013 10:37:46 +0100
Subject: [PATCH] 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.
---
 cmd-choose-tree.c |  1 -
 window-choose.c   | 25 +++++++++++++++++--------
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index a9b6ffb..2fe6e17 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -228,7 +228,6 @@ windows_only:
 	free(final_win_template_last);
 
 	window_choose_ready(wl->window->active, cur_win, NULL);
-	window_choose_collapse_all(wl->window->active);
 
 	if (args_has(args, 'u')) {
 		window_choose_expand_all(wl->window->active);
diff --git a/window-choose.c b/window-choose.c
index 5ed85f0..572581a 100644
--- a/window-choose.c
+++ b/window-choose.c
@@ -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);
 void	window_choose_prompt_input(enum window_choose_input_type,
 	    const char *, struct window_pane *, int);
+void	window_choose_reset_top(struct window_pane *, u_int);
 
 void
 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;
 
 	data->selected = cur;
-	if (data->selected > screen_size_y(s) - 1)
-		data->top = ARRAY_LENGTH(&data->list) - screen_size_y(s);
+	window_choose_reset_top(wp, 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);
 }
@@ -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 screen			*s = &data->screen;
 
-	data->top = 0;
-	if (data->selected > sy - 1)
-		data->top = data->selected - (sy - 1);
-
+	window_choose_reset_top(wp, sy);
 	screen_resize(s, sx, sy, 0);
 	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_item	*item;
+	struct screen			*scr = &data->screen;
 	struct session			*s, *chosen;
 	u_int				 i;
 
@@ -391,7 +399,7 @@ window_choose_collapse_all(struct window_pane *wp)
 		if (item->wcd->type & TREE_SESSION)
 			data->selected = i;
 	}
-	window_choose_redraw_screen(wp);
+	window_choose_reset_top(wp, screen_size_y(scr));
 }
 
 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_item	*item;
+	struct screen			*scr = &data->screen;
 	struct session			*s;
 	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
-- 
1.8.4.rc1

------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to