=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-find.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/tmux/cmd-find.c 2015/05/07 11:42:56 1.7 --- src/usr.bin/tmux/cmd-find.c 2015/06/04 11:43:51 1.8 *************** *** 1,4 **** ! /* $OpenBSD: cmd-find.c,v 1.7 2015/05/07 11:42:56 nicm Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-find.c,v 1.8 2015/06/04 11:43:51 nicm Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott *************** *** 29,34 **** --- 29,35 ---- #define CMD_FIND_PREFER_UNATTACHED 0x1 #define CMD_FIND_QUIET 0x2 #define CMD_FIND_WINDOW_INDEX 0x4 + #define CMD_FIND_DEFAULT_MARKED 0x8 enum cmd_find_type { CMD_FIND_PANE, *************** *** 759,765 **** /* Find current state. */ cmd_find_clear_state(¤t, cmdq, flags); ! if (cmd_find_current_session(¤t) != 0) { if (~flags & CMD_FIND_QUIET) cmdq_error(cmdq, "no current session"); goto error; --- 760,773 ---- /* Find current state. */ cmd_find_clear_state(¤t, cmdq, flags); ! if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED)) { ! current.s = marked_session; ! current.wl = marked_winlink; ! current.idx = current.wl->idx; ! current.w = current.wl->window; ! current.wp = marked_window_pane; ! } ! if (current.s == NULL && cmd_find_current_session(¤t) != 0) { if (~flags & CMD_FIND_QUIET) cmdq_error(cmdq, "no current session"); goto error; *************** *** 798,806 **** } return (&fs); } - copy = xstrdup(target); /* Find separators if they exist. */ colon = strchr(copy, ':'); if (colon != NULL) *colon++ = '\0'; --- 806,829 ---- } return (&fs); } + /* Marked target is a plain ~ or {marked}. */ + if (strcmp(target, "~") == 0 || strcmp(target, "{marked}") == 0) { + if (!server_check_marked()) { + if (~flags & CMD_FIND_QUIET) + cmdq_error(cmdq, "no marked target"); + goto error; + } + fs.s = marked_session; + fs.wl = marked_winlink; + fs.idx = fs.wl->idx; + fs.w = fs.wl->window; + fs.wp = marked_window_pane; + return (&fs); + } + /* Find separators if they exist. */ + copy = xstrdup(target); colon = strchr(copy, ':'); if (colon != NULL) *colon++ = '\0'; *************** *** 1053,1058 **** --- 1076,1099 ---- return (fs->wl); } + /* Find the target window, defaulting to marked rather than current. */ + struct winlink * + cmd_find_window_marked(struct cmd_q *cmdq, const char *target, + struct session **sp) + { + struct cmd_find_state *fs; + int flags = CMD_FIND_DEFAULT_MARKED; + + fs = cmd_find_target(cmdq, target, CMD_FIND_WINDOW, flags); + cmd_find_log_state(__func__, target, fs); + if (fs == NULL) + return (NULL); + + if (sp != NULL) + *sp = fs->s; + return (fs->wl); + } + /* Find the target pane and report an error and return NULL. */ struct winlink * cmd_find_pane(struct cmd_q *cmdq, const char *target, struct session **sp, *************** *** 1061,1066 **** --- 1102,1127 ---- struct cmd_find_state *fs; fs = cmd_find_target(cmdq, target, CMD_FIND_PANE, 0); + cmd_find_log_state(__func__, target, fs); + if (fs == NULL) + return (NULL); + + if (sp != NULL) + *sp = fs->s; + if (wpp != NULL) + *wpp = fs->wp; + return (fs->wl); + } + + /* Find the target pane, defaulting to marked rather than current. */ + struct winlink * + cmd_find_pane_marked(struct cmd_q *cmdq, const char *target, + struct session **sp, struct window_pane **wpp) + { + struct cmd_find_state *fs; + int flags = CMD_FIND_DEFAULT_MARKED; + + fs = cmd_find_target(cmdq, target, CMD_FIND_PANE, flags); cmd_find_log_state(__func__, target, fs); if (fs == NULL) return (NULL);