version 1.120, 2016/01/19 15:59:12 |
version 1.121, 2016/01/19 16:01:30 |
|
|
} |
} |
|
|
static int |
static int |
cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag, |
cmd_prepare_state_flag(char c, const char *target, enum cmd_entry_flag flag, |
const char *target, struct cmd_q *cmdq) |
struct cmd_q *cmdq, struct cmd_q *parent) |
{ |
{ |
int targetflags, error; |
int targetflags, error; |
|
struct cmd_find_state *fs = NULL; |
|
struct cmd_find_state *current = NULL; |
|
struct cmd_find_state tmp; |
|
|
|
if (flag == CMD_NONE || |
|
flag == CMD_CLIENT || |
|
flag == CMD_CLIENT_CANFAIL) |
|
return (0); |
|
|
|
if (c == 't') |
|
fs = &cmdq->state.tflag; |
|
else if (c == 's') |
|
fs = &cmdq->state.sflag; |
|
|
if (flag == CMD_SESSION_WITHPANE) { |
if (flag == CMD_SESSION_WITHPANE) { |
if (target != NULL && target[strcspn(target, ":.")] != '\0') |
if (target != NULL && target[strcspn(target, ":.")] != '\0') |
flag = CMD_PANE; |
flag = CMD_PANE; |
|
|
flag = CMD_SESSION; |
flag = CMD_SESSION; |
} |
} |
|
|
|
targetflags = 0; |
switch (flag) { |
switch (flag) { |
case CMD_NONE: |
|
case CMD_CLIENT: |
|
case CMD_CLIENT_CANFAIL: |
|
return (0); |
|
case CMD_SESSION: |
case CMD_SESSION: |
case CMD_SESSION_CANFAIL: |
case CMD_SESSION_CANFAIL: |
case CMD_SESSION_PREFERUNATTACHED: |
case CMD_SESSION_PREFERUNATTACHED: |
case CMD_SESSION_WITHPANE: |
|
targetflags = 0; |
|
if (flag == CMD_SESSION_CANFAIL) |
if (flag == CMD_SESSION_CANFAIL) |
targetflags |= CMD_FIND_QUIET; |
targetflags |= CMD_FIND_QUIET; |
if (flag == CMD_SESSION_PREFERUNATTACHED) |
if (flag == CMD_SESSION_PREFERUNATTACHED) |
targetflags |= CMD_FIND_PREFER_UNATTACHED; |
targetflags |= CMD_FIND_PREFER_UNATTACHED; |
|
|
error = cmd_find_target(fs, cmdq, target, CMD_FIND_SESSION, |
|
targetflags); |
|
if (error != 0 && flag != CMD_SESSION_CANFAIL) |
|
return (-1); |
|
break; |
break; |
case CMD_MOVEW_R: |
case CMD_MOVEW_R: |
error = cmd_find_target(fs, cmdq, target, CMD_FIND_SESSION, |
|
CMD_FIND_QUIET); |
|
if (error == 0) |
|
break; |
|
flag = CMD_WINDOW_INDEX; |
flag = CMD_WINDOW_INDEX; |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case CMD_WINDOW: |
case CMD_WINDOW: |
case CMD_WINDOW_CANFAIL: |
case CMD_WINDOW_CANFAIL: |
case CMD_WINDOW_MARKED: |
case CMD_WINDOW_MARKED: |
case CMD_WINDOW_INDEX: |
case CMD_WINDOW_INDEX: |
targetflags = 0; |
|
if (flag == CMD_WINDOW_CANFAIL) |
if (flag == CMD_WINDOW_CANFAIL) |
targetflags |= CMD_FIND_QUIET; |
targetflags |= CMD_FIND_QUIET; |
if (flag == CMD_WINDOW_MARKED) |
if (flag == CMD_WINDOW_MARKED) |
targetflags |= CMD_FIND_DEFAULT_MARKED; |
targetflags |= CMD_FIND_DEFAULT_MARKED; |
if (flag == CMD_WINDOW_INDEX) |
if (flag == CMD_WINDOW_INDEX) |
targetflags |= CMD_FIND_WINDOW_INDEX; |
targetflags |= CMD_FIND_WINDOW_INDEX; |
|
|
error = cmd_find_target(fs, cmdq, target, CMD_FIND_WINDOW, |
|
targetflags); |
|
if (error != 0 && flag != CMD_WINDOW_CANFAIL) |
|
return (-1); |
|
break; |
break; |
case CMD_PANE: |
case CMD_PANE: |
case CMD_PANE_CANFAIL: |
case CMD_PANE_CANFAIL: |
case CMD_PANE_MARKED: |
case CMD_PANE_MARKED: |
targetflags = 0; |
|
if (flag == CMD_PANE_CANFAIL) |
if (flag == CMD_PANE_CANFAIL) |
targetflags |= CMD_FIND_QUIET; |
targetflags |= CMD_FIND_QUIET; |
if (flag == CMD_PANE_MARKED) |
if (flag == CMD_PANE_MARKED) |
targetflags |= CMD_FIND_DEFAULT_MARKED; |
targetflags |= CMD_FIND_DEFAULT_MARKED; |
|
break; |
|
default: |
|
fatalx("unknown %cflag %d", c, flag); |
|
} |
|
|
error = cmd_find_target(fs, cmdq, target, CMD_FIND_PANE, |
log_debug("%s: flag %c %d %#x", __func__, c, flag, targetflags); |
targetflags); |
if (parent != NULL) { |
if (error != 0 && flag != CMD_PANE_CANFAIL) |
if (c == 't') |
|
current = &parent->state.tflag; |
|
else if (c == 's') |
|
current = &parent->state.sflag; |
|
} else { |
|
error = cmd_find_current(&tmp, cmdq, targetflags); |
|
if (error != 0 && ~targetflags & CMD_FIND_QUIET) |
return (-1); |
return (-1); |
|
current = &tmp; |
|
} |
|
|
|
switch (flag) { |
|
case CMD_NONE: |
|
case CMD_CLIENT: |
|
case CMD_CLIENT_CANFAIL: |
|
return (0); |
|
case CMD_SESSION: |
|
case CMD_SESSION_CANFAIL: |
|
case CMD_SESSION_PREFERUNATTACHED: |
|
case CMD_SESSION_WITHPANE: |
|
error = cmd_find_target(fs, current, cmdq, target, |
|
CMD_FIND_SESSION, targetflags); |
|
if (error != 0 && ~targetflags & CMD_FIND_QUIET) |
|
return (-1); |
break; |
break; |
|
case CMD_MOVEW_R: |
|
error = cmd_find_target(fs, current, cmdq, target, |
|
CMD_FIND_SESSION, CMD_FIND_QUIET); |
|
if (error == 0) |
|
break; |
|
flag = CMD_WINDOW_INDEX; |
|
/* FALLTHROUGH */ |
|
case CMD_WINDOW: |
|
case CMD_WINDOW_CANFAIL: |
|
case CMD_WINDOW_MARKED: |
|
case CMD_WINDOW_INDEX: |
|
error = cmd_find_target(fs, current, cmdq, target, |
|
CMD_FIND_WINDOW, targetflags); |
|
if (error != 0 && ~targetflags & CMD_FIND_QUIET) |
|
return (-1); |
|
break; |
|
case CMD_PANE: |
|
case CMD_PANE_CANFAIL: |
|
case CMD_PANE_MARKED: |
|
error = cmd_find_target(fs, current, cmdq, target, |
|
CMD_FIND_PANE, targetflags); |
|
if (error != 0 && ~targetflags & CMD_FIND_QUIET) |
|
return (-1); |
|
break; |
|
default: |
|
fatalx("unknown %cflag %d", c, flag); |
} |
} |
return (0); |
return (0); |
} |
} |
|
|
int |
int |
cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) |
cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq, struct cmd_q *parent) |
{ |
{ |
const struct cmd_entry *entry = cmd->entry; |
const struct cmd_entry *entry = cmd->entry; |
struct cmd_state *state = &cmdq->state; |
struct cmd_state *state = &cmdq->state; |
|
|
s = args_get(cmd->args, 't'); |
s = args_get(cmd->args, 't'); |
log_debug("preparing -t state: target %s", s == NULL ? "none" : s); |
log_debug("preparing -t state: target %s", s == NULL ? "none" : s); |
|
|
error = cmd_prepare_state_flag(&state->tflag, entry->tflag, s, cmdq); |
error = cmd_prepare_state_flag('t', s, entry->tflag, cmdq, parent); |
if (error != 0) |
if (error != 0) |
return (error); |
return (error); |
|
|
s = args_get(cmd->args, 's'); |
s = args_get(cmd->args, 's'); |
log_debug("preparing -s state: target %s", s == NULL ? "none" : s); |
log_debug("preparing -s state: target %s", s == NULL ? "none" : s); |
|
|
error = cmd_prepare_state_flag(&state->sflag, entry->sflag, s, cmdq); |
error = cmd_prepare_state_flag('s', s, entry->sflag, cmdq, parent); |
if (error != 0) |
if (error != 0) |
return (error); |
return (error); |
|
|