aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Adam <thomas.adam@smoothwall.net>2013-03-25 14:59:29 +0000
committerThomas Adam <thomas.adam@smoothwall.net>2013-03-25 14:59:29 +0000
commitf90eb43fcb12720711ea01b110c5b474111e6600 (patch)
tree43b2e85bcf1626e3810ade10578ac18399931772
parent418ba99078a2712ece398e17a5a9bc1f6600126b (diff)
parent58bb6f8c5650d496fb3b872766c0278aa024631d (diff)
downloadrtmux-f90eb43fcb12720711ea01b110c5b474111e6600.tar.gz
rtmux-f90eb43fcb12720711ea01b110c5b474111e6600.tar.bz2
rtmux-f90eb43fcb12720711ea01b110c5b474111e6600.zip
Merge branch 'obsd-master'
-rw-r--r--cfg.c141
-rw-r--r--client.c20
-rw-r--r--cmd-attach-session.c59
-rw-r--r--cmd-bind-key.c51
-rw-r--r--cmd-break-pane.c17
-rw-r--r--cmd-capture-pane.c177
-rw-r--r--cmd-choose-buffer.c46
-rw-r--r--cmd-choose-client.c51
-rw-r--r--cmd-choose-list.c41
-rw-r--r--cmd-choose-tree.c55
-rw-r--r--cmd-clear-history.c6
-rw-r--r--cmd-clock-mode.c6
-rw-r--r--cmd-command-prompt.c20
-rw-r--r--cmd-confirm-before.c47
-rw-r--r--cmd-copy-mode.c6
-rw-r--r--cmd-delete-buffer.c8
-rw-r--r--cmd-detach-client.c10
-rw-r--r--cmd-display-message.c32
-rw-r--r--cmd-display-panes.c6
-rw-r--r--cmd-find-window.c37
-rw-r--r--cmd-has-session.c6
-rw-r--r--cmd-if-shell.c103
-rw-r--r--cmd-join-pane.c26
-rw-r--r--cmd-kill-pane.c7
-rw-r--r--cmd-kill-server.c5
-rw-r--r--cmd-kill-session.c6
-rw-r--r--cmd-kill-window.c6
-rw-r--r--cmd-link-window.c10
-rw-r--r--cmd-list-buffers.c7
-rw-r--r--cmd-list-clients.c9
-rw-r--r--cmd-list-commands.c16
-rw-r--r--cmd-list-keys.c21
-rw-r--r--cmd-list-panes.c32
-rw-r--r--cmd-list-sessions.c6
-rw-r--r--cmd-list-windows.c22
-rw-r--r--cmd-list.c76
-rw-r--r--cmd-load-buffer.c30
-rw-r--r--cmd-lock-server.c11
-rw-r--r--cmd-move-window.c12
-rw-r--r--cmd-new-session.c160
-rw-r--r--cmd-new-window.c26
-rw-r--r--cmd-paste-buffer.c10
-rw-r--r--cmd-pipe-pane.c13
-rw-r--r--cmd-queue.c281
-rw-r--r--cmd-refresh-client.c34
-rw-r--r--cmd-rename-session.c10
-rw-r--r--cmd-rename-window.c6
-rw-r--r--cmd-resize-pane.c52
-rw-r--r--cmd-respawn-pane.c10
-rw-r--r--cmd-respawn-window.c12
-rw-r--r--cmd-rotate-window.c6
-rw-r--r--cmd-run-shell.c86
-rw-r--r--cmd-save-buffer.c134
-rw-r--r--cmd-select-layout.c15
-rw-r--r--cmd-select-pane.c16
-rw-r--r--cmd-select-window.c16
-rw-r--r--cmd-send-keys.c25
-rw-r--r--cmd-server-info.c58
-rw-r--r--cmd-set-buffer.c8
-rw-r--r--cmd-set-environment.c16
-rw-r--r--cmd-set-option.c183
-rw-r--r--cmd-show-environment.c16
-rw-r--r--cmd-show-messages.c8
-rw-r--r--cmd-show-options.c116
-rw-r--r--cmd-source-file.c85
-rw-r--r--cmd-split-window.c34
-rw-r--r--cmd-start-server.c5
-rw-r--r--cmd-string.c5
-rw-r--r--cmd-suspend-client.c6
-rw-r--r--cmd-swap-pane.c10
-rw-r--r--cmd-swap-window.c10
-rw-r--r--cmd-switch-client.c18
-rw-r--r--cmd-unbind-key.c14
-rw-r--r--cmd-unlink-window.c8
-rw-r--r--cmd-wait-for.c197
-rw-r--r--cmd.c186
-rw-r--r--control-notify.c35
-rw-r--r--control.c58
-rw-r--r--format.c104
-rw-r--r--grid-view.c2
-rw-r--r--grid.c387
-rw-r--r--input-keys.c18
-rw-r--r--input.c58
-rw-r--r--job.c35
-rw-r--r--key-bindings.c83
-rw-r--r--key-string.c11
-rw-r--r--layout-custom.c9
-rw-r--r--layout.c40
-rw-r--r--mode-key.c7
-rw-r--r--names.c25
-rw-r--r--options-table.c18
-rw-r--r--resize.c35
-rw-r--r--screen-redraw.c60
-rw-r--r--screen-write.c144
-rw-r--r--screen.c13
-rw-r--r--server-client.c205
-rw-r--r--server-fn.c23
-rw-r--r--server-window.c4
-rw-r--r--server.c45
-rw-r--r--session.c52
-rw-r--r--status.c43
-rw-r--r--tmux.1344
-rw-r--r--tmux.c10
-rw-r--r--tmux.h278
-rw-r--r--tty-keys.c778
-rw-r--r--tty.c50
-rw-r--r--window-choose.c228
-rw-r--r--window-clock.c1
-rw-r--r--window-copy.c81
-rw-r--r--window.c98
-rw-r--r--xterm-keys.c28
111 files changed, 4147 insertions, 2405 deletions
diff --git a/cfg.c b/cfg.c
index 5e3e47e9..1153de67 100644
--- a/cfg.c
+++ b/cfg.c
@@ -27,79 +27,33 @@
#include "tmux.h"
-/*
- * Config file parser. Pretty quick and simple, each line is parsed into a
- * argv array and executed as a command.
- */
-
-void printflike2 cfg_print(struct cmd_ctx *, const char *, ...);
-void printflike2 cfg_error(struct cmd_ctx *, const char *, ...);
-
-char *cfg_cause;
+struct cmd_q *cfg_cmd_q;
int cfg_finished;
-int cfg_references;
+int cfg_references;
struct causelist cfg_causes;
-/* ARGSUSED */
-void printflike2
-cfg_print(unused struct cmd_ctx *ctx, unused const char *fmt, ...)
-{
-}
-
-/* ARGSUSED */
-void printflike2
-cfg_error(unused struct cmd_ctx *ctx, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- xvasprintf(&cfg_cause, fmt, ap);
- va_end(ap);
-}
-
-void printflike2
-cfg_add_cause(struct causelist *causes, const char *fmt, ...)
-{
- char *cause;
- va_list ap;
-
- va_start(ap, fmt);
- xvasprintf(&cause, fmt, ap);
- va_end(ap);
-
- ARRAY_ADD(causes, cause);
-}
-
-/*
- * Load configuration file. Returns -1 for an error with a list of messages in
- * causes. Note that causes must be initialised by the caller!
- */
-enum cmd_retval
-load_cfg(const char *path, struct cmd_ctx *ctxin, struct causelist *causes)
+int
+load_cfg(const char *path, struct cmd_q *cmdq, char **cause)
{
FILE *f;
- u_int n;
- char *buf, *copy, *line, *cause;
+ u_int n, found;
+ char *buf, *copy, *line, *cause1, *msg;
size_t len, oldlen;
struct cmd_list *cmdlist;
- struct cmd_ctx ctx;
- enum cmd_retval retval;
+ log_debug("loading %s", path);
if ((f = fopen(path, "rb")) == NULL) {
- cfg_add_cause(causes, "%s: %s", path, strerror(errno));
- return (CMD_RETURN_ERROR);
+ xasprintf(cause, "%s: %s", path, strerror(errno));
+ return (-1);
}
- cfg_references++;
-
- n = 0;
+ n = found = 0;
line = NULL;
- retval = CMD_RETURN_NORMAL;
while ((buf = fgetln(f, &len))) {
/* Trim \n. */
if (buf[len - 1] == '\n')
len--;
- log_debug ("%s: %s", path, buf);
+ log_debug("%s: %.*s", path, (int)len, buf);
/* Current line is the continuation of the previous one. */
if (line != NULL) {
@@ -131,68 +85,52 @@ load_cfg(const char *path, struct cmd_ctx *ctxin, struct causelist *causes)
buf = copy;
while (isspace((u_char)*buf))
buf++;
- if (*buf == '\0')
+ if (*buf == '\0') {
+ free(copy);
continue;
+ }
- if (cmd_string_parse(buf, &cmdlist, &cause) != 0) {
+ /* Parse and run the command. */
+ if (cmd_string_parse(buf, &cmdlist, path, n, &cause1) != 0) {
free(copy);
- if (cause == NULL)
+ if (cause1 == NULL)
continue;
- cfg_add_cause(causes, "%s: %u: %s", path, n, cause);
- free(cause);
+ xasprintf(&msg, "%s:%u: %s", path, n, cause1);
+ ARRAY_ADD(&cfg_causes, msg);
+ free(cause1);
continue;
}
free(copy);
+
if (cmdlist == NULL)
continue;
-
- if (ctxin == NULL) {
- ctx.msgdata = NULL;
- ctx.curclient = NULL;
- ctx.cmdclient = NULL;
- } else {
- ctx.msgdata = ctxin->msgdata;
- ctx.curclient = ctxin->curclient;
- ctx.cmdclient = ctxin->cmdclient;
- }
-
- ctx.error = cfg_error;
- ctx.print = cfg_print;
- ctx.info = cfg_print;
-
- cfg_cause = NULL;
- switch (cmd_list_exec(cmdlist, &ctx)) {
- case CMD_RETURN_YIELD:
- if (retval != CMD_RETURN_ATTACH)
- retval = CMD_RETURN_YIELD;
- break;
- case CMD_RETURN_ATTACH:
- retval = CMD_RETURN_ATTACH;
- break;
- case CMD_RETURN_ERROR:
- case CMD_RETURN_NORMAL:
- break;
- }
+ cmdq_append(cmdq, cmdlist);
cmd_list_free(cmdlist);
- if (cfg_cause != NULL) {
- cfg_add_cause(causes, "%s: %d: %s", path, n, cfg_cause);
- free(cfg_cause);
- }
+ found++;
}
- if (line != NULL) {
- cfg_add_cause(causes,
- "%s: %d: line continuation at end of file", path, n);
+ if (line != NULL)
free(line);
- }
fclose(f);
- cfg_references--;
+ return (found);
+}
- return (retval);
+void
+cfg_default_done(unused struct cmd_q *cmdq)
+{
+ if (--cfg_references != 0)
+ return;
+ cfg_finished = 1;
+
+ if (!RB_EMPTY(&sessions))
+ cfg_show_causes(RB_MIN(sessions, &sessions));
+
+ cmdq_free(cfg_cmd_q);
+ cfg_cmd_q = NULL;
}
void
-show_cfg_causes(struct session *s)
+cfg_show_causes(struct session *s)
{
struct window_pane *wp;
char *cause;
@@ -200,7 +138,6 @@ show_cfg_causes(struct session *s)
if (s == NULL || ARRAY_EMPTY(&cfg_causes))
return;
-
wp = s->curw->window->active;
window_pane_set_mode(wp, &window_copy_mode);
diff --git a/client.c b/client.c
index ae4f5066..91f47650 100644
--- a/client.c
+++ b/client.c
@@ -188,7 +188,8 @@ client_main(int argc, char **argv, int flags)
* later in server) but it is necessary to get the start server
* flag.
*/
- if ((cmdlist = cmd_list_parse(argc, argv, &cause)) == NULL) {
+ cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause);
+ if (cmdlist == NULL) {
fprintf(stderr, "%s\n", cause);
return (1);
}
@@ -269,7 +270,7 @@ client_main(int argc, char **argv, int flags)
if (msg == MSG_COMMAND) {
/* Fill in command line arguments. */
cmddata.pid = environ_pid;
- cmddata.idx = environ_idx;
+ cmddata.session_id = environ_session_id;
/* Prepare command for server. */
cmddata.argc = argc;
@@ -295,8 +296,16 @@ client_main(int argc, char **argv, int flags)
ppid = getppid();
if (client_exittype == MSG_DETACHKILL && ppid > 1)
kill(ppid, SIGHUP);
- } else if (flags & IDENTIFY_TERMIOS)
+ } else if (flags & IDENTIFY_TERMIOS) {
+ if (flags & IDENTIFY_CONTROL) {
+ if (client_exitreason != CLIENT_EXIT_NONE)
+ printf("%%exit %s\n", client_exit_message());
+ else
+ printf("%%exit\n");
+ printf("\033\\");
+ }
tcsetattr(STDOUT_FILENO, TCSAFLUSH, &saved_tio);
+ }
setblocking(STDIN_FILENO, 1);
return (client_exitval);
}
@@ -364,7 +373,6 @@ client_update_event(void)
}
/* Callback to handle signals in the client. */
-/* ARGSUSED */
void
client_signal(int sig, unused short events, unused void *data)
{
@@ -411,7 +419,6 @@ client_signal(int sig, unused short events, unused void *data)
}
/* Callback for client imsg read events. */
-/* ARGSUSED */
void
client_callback(unused int fd, short events, void *data)
{
@@ -446,7 +453,6 @@ lost_server:
}
/* Callback for client stdin read events. */
-/* ARGSUSED */
void
client_stdin_callback(unused int fd, unused short events, unused void *data1)
{
@@ -518,6 +524,7 @@ client_dispatch_wait(void *data)
event_del(&client_stdin);
client_attached = 1;
+ client_write_server(MSG_RESIZE, NULL, 0);
break;
case MSG_STDIN:
if (datalen != 0)
@@ -575,7 +582,6 @@ client_dispatch_wait(void *data)
}
/* Dispatch imsgs in attached state (after MSG_READY). */
-/* ARGSUSED */
int
client_dispatch_attached(void)
{
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 18a20244..07185737 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -26,7 +26,7 @@
* Attach existing session to the current terminal.
*/
-enum cmd_retval cmd_attach_session_exec(struct cmd *, struct cmd_ctx *);
+enum cmd_retval cmd_attach_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_attach_session_entry = {
"attach-session", "attach",
@@ -39,9 +39,8 @@ const struct cmd_entry cmd_attach_session_entry = {
};
enum cmd_retval
-cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
+cmd_attach_session(struct cmd_q *cmdq, const char* tflag, int dflag, int rflag)
{
- struct args *args = self->args;
struct session *s;
struct client *c;
const char *update;
@@ -49,18 +48,18 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
u_int i;
if (RB_EMPTY(&sessions)) {
- ctx->error(ctx, "no sessions");
+ cmdq_error(cmdq, "no sessions");
return (CMD_RETURN_ERROR);
}
- if ((s = cmd_find_session(ctx, args_get(args, 't'), 1)) == NULL)
+ if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
return (CMD_RETURN_ERROR);
- if (ctx->cmdclient == NULL && ctx->curclient == NULL)
+ if (cmdq->client == NULL)
return (CMD_RETURN_NORMAL);
- if (ctx->cmdclient == NULL) {
- if (args_has(self->args, 'd')) {
+ if (cmdq->client->session != NULL) {
+ if