=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-run-shell.c,v retrieving revision 1.13 retrieving revision 1.14 diff -c -r1.13 -r1.14 *** src/usr.bin/tmux/cmd-run-shell.c 2012/07/11 07:10:15 1.13 --- src/usr.bin/tmux/cmd-run-shell.c 2012/11/27 15:09:35 1.14 *************** *** 1,4 **** ! /* $OpenBSD: cmd-run-shell.c,v 1.13 2012/07/11 07:10:15 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha --- 1,4 ---- ! /* $OpenBSD: cmd-run-shell.c,v 1.14 2012/11/27 15:09:35 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha *************** *** 30,42 **** */ enum cmd_retval cmd_run_shell_exec(struct cmd *, struct cmd_ctx *); - void cmd_run_shell_callback(struct job *); - void cmd_run_shell_free(void *); const struct cmd_entry cmd_run_shell_entry = { "run-shell", "run", ! "", 1, 1, ! "command", 0, NULL, NULL, --- 30,44 ---- */ enum cmd_retval cmd_run_shell_exec(struct cmd *, struct cmd_ctx *); + void cmd_run_shell_callback(struct job *); + void cmd_run_shell_free(void *); + void cmd_run_shell_print(struct job *, const char *); + const struct cmd_entry cmd_run_shell_entry = { "run-shell", "run", ! "t:", 1, 1, ! CMD_TARGET_PANE_USAGE " command", 0, NULL, NULL, *************** *** 46,62 **** --- 48,89 ---- struct cmd_run_shell_data { char *cmd; struct cmd_ctx ctx; + u_int wp_id; }; + void + cmd_run_shell_print(struct job *job, const char *msg) + { + struct cmd_run_shell_data *cdata = job->data; + struct cmd_ctx *ctx = &cdata->ctx; + struct window_pane *wp; + + wp = window_pane_find_by_id(cdata->wp_id); + if (wp == NULL) { + ctx->print(ctx, "%s", msg); + return; + } + + if (window_pane_set_mode(wp, &window_copy_mode) == 0) + window_copy_init_for_output(wp); + if (wp->mode == &window_copy_mode) + window_copy_add(wp, "%s", msg); + } + enum cmd_retval cmd_run_shell_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; struct cmd_run_shell_data *cdata; const char *shellcmd = args->argv[0]; + struct window_pane *wp; + if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL) + return (CMD_RETURN_ERROR); + cdata = xmalloc(sizeof *cdata); cdata->cmd = xstrdup(args->argv[0]); + cdata->wp_id = wp->id; memcpy(&cdata->ctx, ctx, sizeof cdata->ctx); if (ctx->cmdclient != NULL) *************** *** 87,93 **** lines = 0; do { if ((line = evbuffer_readline(job->event->input)) != NULL) { ! ctx->print(ctx, "%s", line); lines++; } } while (line != NULL); --- 114,120 ---- lines = 0; do { if ((line = evbuffer_readline(job->event->input)) != NULL) { ! cmd_run_shell_print (job, line); lines++; } } while (line != NULL); *************** *** 98,104 **** memcpy(line, EVBUFFER_DATA(job->event->input), size); line[size] = '\0'; ! ctx->print(ctx, "%s", line); lines++; free(line); --- 125,131 ---- memcpy(line, EVBUFFER_DATA(job->event->input), size); line[size] = '\0'; ! cmd_run_shell_print(job, line); lines++; free(line); *************** *** 115,124 **** xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode); } if (msg != NULL) { ! if (lines != 0) ! ctx->print(ctx, "%s", msg); ! else ctx->info(ctx, "%s", msg); free(msg); } } --- 142,151 ---- xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode); } if (msg != NULL) { ! if (lines == 0) ctx->info(ctx, "%s", msg); + else + cmd_run_shell_print(job, msg); free(msg); } }