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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users