The branch, hooks has been updated
via d38bbd84627bf4735781a809a039e161aaf68d3b (commit)
from 7a1a3a33ef79ee8e07db1e8ee18ad429535992ca (commit)
- Log -----------------------------------------------------------------
commit d38bbd84627bf4735781a809a039e161aaf68d3b
Author: Nicholas Marriott <[email protected]>
Commit: Nicholas Marriott <[email protected]>
Allow PANE|SESSION to try lookup as a pane if possible else a session (if we
just lookup as a pane, then a plain "0" is pane 0 not session 0). Also add a
PREFERUNATTACHED flag. Use these for switch-client (attach-session is more
complicated because it is called from new-session).
---
cmd-switch-client.c | 41 ++++++++----------------------
cmd.c | 70 +++++++++++++++++++++++++++++++++++++++++++++------
tmux.h | 1 +
3 files changed, 74 insertions(+), 38 deletions(-)
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index 439f593..4c6193d 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -32,8 +32,9 @@ enum cmd_retval cmd_switch_client_exec(struct cmd *,
struct cmd_q *);
const struct cmd_entry cmd_switch_client_entry = {
"switch-client", "switchc",
"lc:npt:r", 0, 0,
- "[-lnpr] [-c target-client] [-t target-session]",
- CMD_READONLY,
+ "[-lnpr] [-c target-client] " CMD_TARGET_SESSION_USAGE,
+ CMD_READONLY|CMD_PREP_CLIENT_C|CMD_PREP_PANE_T|CMD_PREP_SESSION_T|
+ CMD_PREP_PREFERUNATTACHED,
cmd_switch_client_exec
};
@@ -41,16 +42,12 @@ enum cmd_retval
cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
- struct session *s = NULL;
- struct winlink *wl = NULL;
- struct window *w = NULL;
- struct window_pane *wp = NULL;
+ struct cmd_state *state = &cmdq->state;
+ struct client *c = state->c;
+ struct session *s;
+ struct window_pane *wp;
const char *tflag;
- if ((c = cmd_find_client(cmdq, args_get(args, 'c'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
-
if (args_has(args, 'r')) {
if (c->flags & CLIENT_READONLY)
c->flags &= ~CLIENT_READONLY;
@@ -58,7 +55,6 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
c->flags |= CLIENT_READONLY;
}
- tflag = args_get(args, 't');
if (args_has(args, 'n')) {
if ((s = session_next_session(c->session)) == NULL) {
cmdq_error(cmdq, "can't find next session");
@@ -77,30 +73,15 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_ERROR);
}
} else {
- if (tflag == NULL) {
- if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
- return (CMD_RETURN_ERROR);
- } else if (tflag[strcspn(tflag, ":.")] != '\0') {
- if ((wl = cmd_find_pane(cmdq, tflag, &s, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
- } else {
- if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
- return (CMD_RETURN_ERROR);
- w = cmd_lookup_windowid(tflag);
- if (w == NULL &&
- (wp = cmd_lookup_paneid(tflag)) != NULL)
- w = wp->window;
- if (w != NULL)
- wl = winlink_find_by_window(&s->windows, w);
- }
-
if (cmdq->client == NULL)
return (CMD_RETURN_NORMAL);
- if (wl != NULL) {
+ s = state->tflag.s;
+ if (state->tflag.wl != NULL) {
+ wp = state->tflag.wp;
if (wp != NULL)
window_set_active_pane(wp->window, wp);
- session_set_current(s, wl);
+ session_set_current(s, state->tflag.wl);
}
}
diff --git a/cmd.c b/cmd.c
index 297fca4..f59b018 100644
--- a/cmd.c
+++ b/cmd.c
@@ -357,8 +357,12 @@ cmd_set_state_tflag(struct cmd *cmd, struct cmd_q *cmdq)
{
struct cmd_state *state = &cmdq->state;
const char *tflag;
- int flags = cmd->entry->flags;
- int everything = 0;
+ int flags = cmd->entry->flags, everything = 0;
+ int prefer = !!(flags & CMD_PREP_PREFERUNATTACHED);
+ struct session *s;
+ struct window *w;
+ struct winlink *wl;
+ struct window_pane *wp;
/*
* If the command wants something for -t and no -t argument is present,
@@ -384,8 +388,31 @@ cmd_set_state_tflag(struct cmd *cmd, struct cmd_q *cmdq)
switch (cmd->entry->flags & CMD_PREP_ALL_T) {
case 0:
break;
+ case CMD_PREP_SESSION_T|CMD_PREP_PANE_T:
+ if (tflag[strcspn(tflag, ":.")] != '\0') {
+ state->tflag.wl = cmd_find_pane(cmdq, tflag,
+ &state->tflag.s, &state->tflag.wp);
+ if (state->tflag.wl == NULL)
+ return (-1);
+ } else {
+ state->tflag.s = cmd_find_session(cmdq, tflag, prefer);
+ if (state->tflag.s == NULL)
+ return (-1);
+
+ s = state->tflag.s;
+ if ((w = cmd_lookup_windowid(tflag)) != NULL)
+ wp = w->active;
+ else if ((wp = cmd_lookup_paneid(tflag)) != NULL)
+ w = wp->window;
+ wl = winlink_find_by_window(&s->windows, w);
+ if (wl != NULL) {
+ state->tflag.wl = wl;
+ state->tflag.wp = wp;
+ }
+ }
+ break;
case CMD_PREP_SESSION_T:
- state->tflag.s = cmd_find_session(cmdq, tflag, 0);
+ state->tflag.s = cmd_find_session(cmdq, tflag, prefer);
if (state->tflag.s == NULL)
return (-1);
break;
@@ -422,7 +449,7 @@ complete_everything:
if (state->c != NULL)
state->tflag.s = state->c->session;
if (state->tflag.s == NULL)
- state->tflag.s = cmd_current_session(cmdq, 0);
+ state->tflag.s = cmd_current_session(cmdq, prefer);
if (state->tflag.s == NULL) {
if (flags & CMD_PREP_CANFAIL)
return (0);
@@ -442,8 +469,12 @@ cmd_set_state_sflag(struct cmd *cmd, struct cmd_q *cmdq)
{
struct cmd_state *state = &cmdq->state;
const char *sflag;
- int flags = cmd->entry->flags;
- int everything = 0;
+ int flags = cmd->entry->flags, everything = 0;
+ int prefer = !!(flags & CMD_PREP_PREFERUNATTACHED);
+ struct session *s;
+ struct window *w;
+ struct winlink *wl;
+ struct window_pane *wp;
/*
* If the command wants something for -s and no -s argument is present,
@@ -469,8 +500,31 @@ cmd_set_state_sflag(struct cmd *cmd, struct cmd_q *cmdq)
switch (cmd->entry->flags & CMD_PREP_ALL_S) {
case 0:
break;
+ case CMD_PREP_SESSION_S|CMD_PREP_PANE_S:
+ if (sflag[strcspn(sflag, ":.")] != '\0') {
+ state->sflag.wl = cmd_find_pane(cmdq, sflag,
+ &state->sflag.s, &state->sflag.wp);
+ if (state->sflag.wl == NULL)
+ return (-1);
+ } else {
+ state->sflag.s = cmd_find_session(cmdq, sflag, prefer);
+ if (state->sflag.s == NULL)
+ return (-1);
+
+ s = state->sflag.s;
+ if ((w = cmd_lookup_windowid(sflag)) != NULL)
+ wp = w->active;
+ else if ((wp = cmd_lookup_paneid(sflag)) != NULL)
+ w = wp->window;
+ wl = winlink_find_by_window(&s->windows, w);
+ if (wl != NULL) {
+ state->sflag.wl = wl;
+ state->sflag.wp = wp;
+ }
+ }
+ break;
case CMD_PREP_SESSION_S:
- state->sflag.s = cmd_find_session(cmdq, sflag, 0);
+ state->sflag.s = cmd_find_session(cmdq, sflag, prefer);
if (state->sflag.s == NULL)
return (-1);
break;
@@ -507,7 +561,7 @@ complete_everything:
if (state->c != NULL)
state->sflag.s = state->c->session;
if (state->sflag.s == NULL)
- state->sflag.s = cmd_current_session(cmdq, 0);
+ state->sflag.s = cmd_current_session(cmdq, prefer);
if (state->sflag.s == NULL) {
if (flags & CMD_PREP_CANFAIL)
return (0);
diff --git a/tmux.h b/tmux.h
index ad1f11f..af82efc 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1460,6 +1460,7 @@ struct cmd_entry {
#define CMD_PREP_INDEX_T 0x800
#define CMD_PREP_INDEX_S 0x1000
#define CMD_PREP_CANFAIL 0x2000
+#define CMD_PREP_PREFERUNATTACHED 0x4000
int flags;
enum cmd_retval (*exec)(struct cmd *, struct cmd_q *);
-----------------------------------------------------------------------
Summary of changes:
cmd-switch-client.c | 41 ++++++++----------------------
cmd.c | 70 +++++++++++++++++++++++++++++++++++++++++++++------
tmux.h | 1 +
3 files changed, 74 insertions(+), 38 deletions(-)
hooks/post-receive
--
tmux
------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs