=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-queue.c,v retrieving revision 1.88 retrieving revision 1.89 diff -c -r1.88 -r1.89 *** src/usr.bin/tmux/cmd-queue.c 2020/04/13 15:55:51 1.88 --- src/usr.bin/tmux/cmd-queue.c 2020/04/13 20:51:57 1.89 *************** *** 1,4 **** ! /* $OpenBSD: cmd-queue.c,v 1.88 2020/04/13 15:55:51 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-queue.c,v 1.89 2020/04/13 20:51:57 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott *************** *** 42,47 **** --- 42,48 ---- struct cmdq_item *next; struct client *client; + struct client *target_client; enum cmdq_type type; u_int group; *************** *** 145,150 **** --- 146,158 ---- return (item->client); } + /* Get item target client. */ + struct client * + cmdq_get_target_client(struct cmdq_item *item) + { + return (item->target_client); + } + /* Get item state. */ struct cmdq_state * cmdq_get_state(struct cmdq_item *item) *************** *** 483,496 **** static enum cmd_retval cmdq_fire_command(struct cmdq_item *item) { ! struct client *c = item->client; ! const char *name = cmdq_name(c); struct cmdq_state *state = item->state; struct cmd *cmd = item->cmd; const struct cmd_entry *entry = cmd_get_entry(cmd); enum cmd_retval retval; struct cmd_find_state *fsp, fs; ! int flags; char *tmp; if (log_get_level() > 1) { --- 491,505 ---- static enum cmd_retval cmdq_fire_command(struct cmdq_item *item) { ! const char *name = cmdq_name(item->client); struct cmdq_state *state = item->state; struct cmd *cmd = item->cmd; + struct args *args = cmd_get_args(cmd); const struct cmd_entry *entry = cmd_get_entry(cmd); + struct client *tc, *saved = item->client; enum cmd_retval retval; struct cmd_find_state *fsp, fs; ! int flags, quiet = 0; char *tmp; if (log_get_level() > 1) { *************** *** 504,509 **** --- 513,537 ---- if (item->client == NULL) item->client = cmd_find_client(item, NULL, 1); + + if (entry->flags & CMD_CLIENT_CANFAIL) + quiet = 1; + if (entry->flags & CMD_CLIENT_CFLAG) { + tc = cmd_find_client(item, args_get(args, 'c'), quiet); + if (tc == NULL && !quiet) { + retval = CMD_RETURN_ERROR; + goto out; + } + } else if (entry->flags & CMD_CLIENT_TFLAG) { + tc = cmd_find_client(item, args_get(args, 't'), quiet); + if (tc == NULL && !quiet) { + retval = CMD_RETURN_ERROR; + goto out; + } + } else + tc = cmd_find_client(item, NULL, 1); + item->target_client = tc; + retval = cmdq_find_flag(item, &item->source, &entry->source); if (retval == CMD_RETURN_ERROR) goto out; *************** *** 511,516 **** --- 539,545 ---- if (retval == CMD_RETURN_ERROR) goto out; + retval = entry->exec(cmd, item); if (retval == CMD_RETURN_ERROR) goto out; *************** *** 528,534 **** } out: ! item->client = c; if (retval == CMD_RETURN_ERROR) cmdq_guard(item, "error", flags); else --- 557,563 ---- } out: ! item->client = saved; if (retval == CMD_RETURN_ERROR) cmdq_guard(item, "error", flags); else