Factor out the code which puts the choice of choosing windows and/or
sessions into a common place.
---
 cmd-choose-session.c |   28 +------------
 cmd-choose-window.c  |   35 ++--------------
 window-choose.c      |  107 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+), 57 deletions(-)

diff --git a/cmd-choose-session.c b/cmd-choose-session.c
index 7d9cdd4..603fe43 100644
--- a/cmd-choose-session.c
+++ b/cmd-choose-session.c
@@ -53,10 +53,7 @@ cmd_choose_session_exec(struct cmd *self, struct cmd_ctx 
*ctx)
        struct cmd_target_data          *data = self->data;
        struct cmd_choose_session_data  *cdata;
        struct winlink                  *wl;
-       struct session                  *s;
-       struct session_group            *sg;
-       u_int                            i, idx, cur;
-       char                             tmp[64];
+       u_int                            cur;
 
        if (ctx->curclient == NULL) {
                ctx->error(ctx, "must be run interactively");
@@ -69,28 +66,7 @@ cmd_choose_session_exec(struct cmd *self, struct cmd_ctx 
*ctx)
        if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
                return (0);
 
-       cur = idx = 0;
-       for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
-               s = ARRAY_ITEM(&sessions, i);
-               if (s == NULL)
-                       continue;
-               if (s == ctx->curclient->session)
-                       cur = idx;
-               idx++;
-
-               sg = session_group_find(s);
-               if (sg == NULL)
-                       *tmp = '\0';
-               else {
-                       idx = session_group_index(sg);
-                       xsnprintf(tmp, sizeof tmp, " (group %u)", idx);
-               }
-
-               window_choose_add(wl->window->active, i,
-                   "%s: %u windows [%ux%u]%s%s", s->name,
-                   winlink_count(&s->windows), s->sx, s->sy,
-                   tmp, s->flags & SESSION_UNATTACHED ? "" : " (attached)");
-       }
+       cur = window_choose_item_data(ctx, wl, WIN_CHOOSE_SESSIONS);
 
        cdata = xmalloc(sizeof *cdata);
        if (data->arg != NULL)
diff --git a/cmd-choose-window.c b/cmd-choose-window.c
index c39c0ed..f7fa66e 100644
--- a/cmd-choose-window.c
+++ b/cmd-choose-window.c
@@ -53,17 +53,15 @@ cmd_choose_window_exec(struct cmd *self, struct cmd_ctx 
*ctx)
 {
        struct cmd_target_data          *data = self->data;
        struct cmd_choose_window_data   *cdata;
+       struct winlink                  *wl;
        struct session                  *s;
-       struct winlink                  *wl, *wm;
-       struct window                   *w;
-       u_int                            idx, cur;
-       char                            *flags, *title;
-       const char                      *left, *right;
+       u_int                            cur;
 
        if (ctx->curclient == NULL) {
                ctx->error(ctx, "must be run interactively");
                return (-1);
        }
+
        s = ctx->curclient->session;
 
        if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
@@ -72,32 +70,7 @@ cmd_choose_window_exec(struct cmd *self, struct cmd_ctx *ctx)
        if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
                return (0);
 
-       cur = idx = 0;
-       RB_FOREACH(wm, winlinks, &s->windows) {
-               w = wm->window;
-
-               if (wm == s->curw)
-                       cur = idx;
-               idx++;
-
-               flags = window_printable_flags(s, wm);
-               title = w->active->screen->title;
-               if (wm == wl)
-                       title = w->active->base.title;
-               left = " \"";
-               right = "\"";
-               if (*title == '\0')
-                       left = right = "";
-
-               window_choose_add(wl->window->active,
-                   wm->idx, "%3d: %s%s [%ux%u] (%u panes%s)%s%s%s",
-                   wm->idx, w->name, flags, w->sx, w->sy, 
window_count_panes(w),
-                   w->active->fd == -1 ? ", dead" : "",
-                   left, title, right);
-       }
-
-       if (flags != NULL)
-               xfree(flags);
+       cur = window_choose_item_data(ctx, wl, WIN_CHOOSE_WINDOWS);
 
        cdata = xmalloc(sizeof *cdata);
        if (data->arg != NULL)
diff --git a/window-choose.c b/window-choose.c
index bce3ecb..4b1980d 100644
--- a/window-choose.c
+++ b/window-choose.c
@@ -35,6 +35,7 @@ void  window_choose_write_line(
 
 void   window_choose_scroll_up(struct window_pane *);
 void   window_choose_scroll_down(struct window_pane *);
+int    window_choose_item_window(struct session *, struct winlink *);
 
 const struct window_mode window_choose_mode = {
        window_choose_init,
@@ -455,3 +456,109 @@ window_choose_scroll_down(struct window_pane *wp)
                window_choose_write_line(wp, &ctx, screen_size_y(s) - 2);
        screen_write_stop(&ctx);
 }
+
+int window_choose_item_window(struct session *s, struct winlink *wl)
+{
+       struct winlink          *wm;
+       struct window           *w;
+       const char              *left, *right;
+       char                    *flags, *title;
+       u_int                    cur, idx;
+
+       idx = cur = 0;
+       RB_FOREACH(wm, winlinks, &s->windows) {
+               w = wm->window;
+
+               if (wm == s->curw)
+                       cur = idx;
+               idx++;
+
+               flags = window_printable_flags(s, wm);
+               title = w->active->screen->title;
+               if (wm == wl)
+                       title = w->active->base.title;
+               left = " \"";
+               right = "\"";
+               if (*title == '\0')
+                       left = right = "";
+
+               window_choose_add(wl->window->active,
+                   wm->idx, "%3d: %s%s [%ux%u] (%u panes%s)%s%s%s",
+                   wm->idx, w->name, flags, w->sx, w->sy, 
window_count_panes(w),
+                   w->active->fd == -1 ? ", dead" : "",
+                   left, title, right);
+
+               if (flags != NULL)
+                       xfree(flags);
+       }
+
+       return cur;
+}
+
+int
+window_choose_item_data(struct cmd_ctx *ctx, struct winlink *wl, int 
type_flags)
+{
+       struct session          *s;
+       struct session_group    *sg;
+       u_int                    ses_count;
+        u_int                   selected, cur_win, cur_ses;
+       u_int                    idx, cur_ses_win, total_items;
+       char                     tmp[64];
+       u_int                    window_total;
+
+       /* XXX: Ugly. */
+       selected = cur_win = idx = total_items = 0;
+
+       if (type_flags == WIN_CHOOSE_WINDOWS) {
+               s = ctx->curclient->session;
+               return (window_choose_item_window(s, wl));
+       }
+
+       for (ses_count = 0; ses_count < ARRAY_LENGTH(&sessions); ses_count++) {
+               window_total = 0;
+
+               s = ARRAY_ITEM(&sessions, ses_count);
+               if (s == NULL)
+                       continue;
+               if (s == ctx->curclient->session)
+                       selected = idx;
+               idx++;
+
+               sg = session_group_find(s);
+               if (sg == NULL)
+                       *tmp = '\0';
+               else {
+                       idx = session_group_index(sg);
+                       xsnprintf(tmp, sizeof tmp, " (group %u)", idx);
+               }
+
+               window_choose_add(wl->window->active, ses_count,
+                   "%s: %u windows [%ux%u]%s%s", s->name,
+                   winlink_count(&s->windows), s->sx, s->sy,
+                   tmp, s->flags & SESSION_UNATTACHED ? "" : " (attached)");
+
+               if (type_flags == WIN_CHOOSE_SESSIONS)
+                       continue;
+
+               if (type_flags == WIN_CHOOSE_WINDOWS_SESSIONS) {
+                       cur_win = window_choose_item_window(s, wl);
+                       window_total = winlink_count(&s->windows);
+                       total_items += window_total;
+
+                       if (!(s->flags & SESSION_UNATTACHED))
+                       {
+                               /* Then the session is attached.  This is the
+                                * one we're interested in jumping to in the
+                                * list -- but as a consequence we jump
+                                * straight to the window which we work out
+                                * based on the session it's in.
+                                */
+                               cur_ses = (total_items - window_total);
+                               cur_ses_win = (cur_ses + cur_win + selected) + 
1;
+                       }
+               }
+       }
+
+       return (type_flags == WIN_CHOOSE_WINDOWS_SESSIONS ?
+               cur_ses_win : selected);
+}
-- 
1.7.2.3

------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and, 
should the need arise, upgrade to a full multi-node Oracle RAC database 
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to