diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-03 16:55:09 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-03 16:55:09 +0000 |
commit | 743956edf898dceff67af785b7bda87cdbd3fdab (patch) | |
tree | 0785e10be103a660a69533facb41b2de8a5db692 /cmd-send-keys.c | |
parent | 3e6b1459232e1ae4fd3bb55e95122cef369ae86b (diff) | |
download | rtmux-743956edf898dceff67af785b7bda87cdbd3fdab.tar.gz rtmux-743956edf898dceff67af785b7bda87cdbd3fdab.tar.bz2 rtmux-743956edf898dceff67af785b7bda87cdbd3fdab.zip |
Allow -c anywhere -s was allowed.
Diffstat (limited to 'cmd-send-keys.c')
-rw-r--r-- | cmd-send-keys.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/cmd-send-keys.c b/cmd-send-keys.c index 22f48323..6e9f7f43 100644 --- a/cmd-send-keys.c +++ b/cmd-send-keys.c @@ -1,4 +1,4 @@ -/* $Id: cmd-send-keys.c,v 1.6 2008-06-03 05:35:51 nicm Exp $ */ +/* $Id: cmd-send-keys.c,v 1.7 2008-06-03 16:55:09 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> @@ -35,12 +35,15 @@ void cmd_send_keys_free(void *); struct cmd_send_keys_data { char *cname; + char *sname; + int idx; u_int nkeys; int *keys; }; const struct cmd_entry cmd_send_keys_entry = { - "send-keys", "send", "[-c client-tty] key ...", + "send-keys", "send", + "[-c client-tty|-s session-name] [-i index] key ...", 0, cmd_send_keys_parse, cmd_send_keys_exec, @@ -56,17 +59,36 @@ cmd_send_keys_parse( { struct cmd_send_keys_data *data; int opt, key; + const char *errstr; char *s; *ptr = data = xmalloc(sizeof *data); data->cname = NULL; + data->sname = NULL; + data->idx = -1; data->nkeys = 0; data->keys = NULL; - while ((opt = getopt(argc, argv, "c:")) != EOF) { + while ((opt = getopt(argc, argv, "c:i:s:")) != EOF) { switch (opt) { case 'c': - data->cname = xstrdup(optarg); + if (data->sname != NULL) + goto usage; + if (data->cname == NULL) + data->cname = xstrdup(optarg); + break; + case 'i': + data->idx = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr != NULL) { + xasprintf(cause, "index %s", errstr); + goto error; + } + break; + case 's': + if (data->cname != NULL) + goto usage; + if (data->sname == NULL) + data->sname = xstrdup(optarg); break; default: goto usage; @@ -98,6 +120,7 @@ cmd_send_keys_parse( usage: xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage); +error: cmd_send_keys_free(data); return (-1); } @@ -106,17 +129,18 @@ void cmd_send_keys_exec(void *ptr, struct cmd_ctx *ctx) { struct cmd_send_keys_data *data = ptr; - struct client *c; + struct winlink *wl; u_int i; if (data == NULL) return; - if ((c = cmd_find_client(ctx, data->cname)) == NULL) + wl = cmd_find_window(ctx, data->cname, data->sname, data->idx, NULL); + if (wl == NULL) return; for (i = 0; i < data->nkeys; i++) - window_key(c->session->curw->window, data->keys[i]); + window_key(wl->window, data->keys[i]); if (ctx->cmdclient != NULL) server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0); @@ -129,6 +153,7 @@ cmd_send_keys_send(void *ptr, struct buffer *b) buffer_write(b, data, sizeof *data); cmd_send_string(b, data->cname); + cmd_send_string(b, data->sname); buffer_write(b, data->keys, data->nkeys * sizeof *data->keys); } @@ -140,6 +165,7 @@ cmd_send_keys_recv(void **ptr, struct buffer *b) *ptr = data = xmalloc(sizeof *data); buffer_read(b, data, sizeof *data); data->cname = cmd_recv_string(b); + data->sname = cmd_recv_string(b); data->keys = xcalloc(data->nkeys, sizeof *data->keys); buffer_read(b, data->keys, data->nkeys * sizeof *data->keys); } @@ -151,7 +177,7 @@ cmd_send_keys_free(void *ptr) if (data->cname != NULL) xfree(data->cname); - if (data->keys != NULL) - xfree(data->keys); + if (data->sname != NULL) + xfree(data->sname); xfree(data); } |