diff options
127 files changed, 28294 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..66204957 --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# $OpenBSD$ + +.PATH: ${.CURDIR}/.. + +PROG= tmux +SRCS= arg.c attributes.c buffer-poll.c buffer.c cfg.c client-fn.c \ + client-msg.c client.c clock.c cmd-attach-session.c cmd-bind-key.c \ + cmd-break-pane.c cmd-choose-session.c cmd-choose-window.c \ + cmd-clear-history.c cmd-clock-mode.c cmd-command-prompt.c \ + cmd-confirm-before.c cmd-copy-buffer.c cmd-copy-mode.c \ + cmd-delete-buffer.c cmd-detach-client.c cmd-down-pane.c \ + cmd-find-window.c cmd-generic.c cmd-has-session.c cmd-kill-pane.c \ + cmd-kill-server.c cmd-kill-session.c cmd-kill-window.c \ + cmd-last-window.c cmd-link-window.c cmd-list-buffers.c \ + cmd-list-clients.c cmd-list-commands.c cmd-list-keys.c \ + cmd-list-sessions.c cmd-list-windows.c cmd-list.c cmd-load-buffer.c \ + cmd-lock-server.c cmd-move-window.c cmd-new-session.c cmd-new-window.c \ + cmd-next-layout.c cmd-next-window.c cmd-paste-buffer.c \ + cmd-previous-layout.c cmd-previous-window.c cmd-refresh-client.c \ + cmd-rename-session.c cmd-rename-window.c cmd-resize-pane.c \ + cmd-respawn-window.c cmd-rotate-window.c cmd-save-buffer.c \ + cmd-scroll-mode.c cmd-select-layout.c cmd-select-pane.c \ + cmd-select-prompt.c cmd-select-window.c cmd-send-keys.c \ + cmd-send-prefix.c cmd-server-info.c cmd-set-buffer.c cmd-set-option.c \ + cmd-set-password.c cmd-set-window-option.c cmd-show-buffer.c \ + cmd-show-options.c cmd-show-window-options.c cmd-source-file.c \ + cmd-split-window.c cmd-start-server.c cmd-string.c \ + cmd-suspend-client.c cmd-swap-pane.c cmd-swap-window.c \ + cmd-switch-client.c cmd-unbind-key.c cmd-unlink-window.c \ + cmd-up-pane.c cmd.c colour.c grid-view.c grid.c input-keys.c \ + input.c key-bindings.c key-string.c layout-manual.c layout.c log.c \ + mode-key.c names.c options-cmd.c options.c paste.c procname.c \ + resize.c screen-redraw.c screen-write.c screen.c server-fn.c \ + server-msg.c server.c session.c status.c tmux.c tty-keys.c tty-term.c \ + tty-write.c tty.c utf8.c util.c window-choose.c window-clock.c \ + window-copy.c window-more.c window-scroll.c window.c xmalloc.c + +CFLAGS+= -Wno-long-long -Wall -W -Wnested-externs -Wformat=2 +CFLAGS+= -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations +CFLAGS+= -Wwrite-strings -Wshadow -Wpointer-arith -Wsign-compare +CFLAGS+= -Wundef -Wbad-function-cast -Winline -Wcast-align + +LDADD= -lutil -lncurses +DPADD= ${LIBUTIL} + +MAN= tmux.1 + +.include <bsd.prog.mk> @@ -0,0 +1,194 @@ +/* $OpenBSD$ */ + +/* + * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> + +#include <fnmatch.h> +#include <stdlib.h> +#include <string.h> + +#include "tmux.h" + +struct client *arg_lookup_client(const char *); +struct session *arg_lookup_session(const char *); + +struct client * +arg_lookup_client(const char *name) +{ + struct client *c; + u_int i; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c != NULL && strcmp(name, c->tty.path) == 0) + return (c); + } + + return (NULL); +} + +struct session * +arg_lookup_session(const char *name) +{ + struct session *s, *newest = NULL; + struct timeval *tv; + u_int i; + + tv = NULL; + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { + s = ARRAY_ITEM(&sessions, i); + if (s == NULL || fnmatch(name, s->name, 0) != 0) + continue; + + if (tv == NULL || timercmp(&s->tv, tv, >)) { + newest = s; + tv = &s->tv; + } + } + + return (newest); +} + +struct client * +arg_parse_client(const char *arg) +{ + struct client *c; + char *arg2; + size_t n; + + if (arg != NULL && (arg[0] != ':' || arg[1] != '\0')) { + arg2 = xstrdup(arg); + + /* Trim a trailing : if any from the argument. */ + n = strlen(arg2); + if (arg2[n - 1] == ':') + arg2[n - 1] = '\0'; + + /* Try and look up the client name. */ + c = arg_lookup_client(arg2); + xfree(arg2); + return (c); + } + + return (NULL); +} + +struct session * +arg_parse_session(const char *arg) +{ + struct session *s; + struct client *c; + char *arg2; + size_t n; + + if (arg != NULL && (arg[0] != ':' || arg[1] != '\0')) { + arg2 = xstrdup(arg); + + /* Trim a trailing : if any from the argument. */ + n = strlen(arg2); + if (arg2[n - 1] == ':') + arg2[n - 1] = '\0'; + + /* See if the argument matches a session. */ + if ((s = arg_lookup_session(arg2)) != NULL) { + xfree(arg2); + return (s); + } + + /* If not try a client. */ + if ((c = arg_lookup_client(arg2)) != NULL) { + xfree(arg2); + return (c->session); + } + + xfree(arg2); + } + + return (NULL); +} + +int +arg_parse_window(const char *arg, struct session **s, int *idx) +{ + char *arg2, *ptr; + const char *errstr; + + *idx = -1; + + /* Handle no argument or a single :. */ + if (arg == NULL || (arg[0] == ':' && arg[1] == '\0')) { + *s = arg_parse_session(NULL); + return (0); + } + + /* Find the separator if any. */ + arg2 = xstrdup(arg); + ptr = strrchr(arg2, ':'); + + /* + * If it is first, this means no session name, so use current session + * and try to convert the rest as index. + */ + if (ptr == arg2) { + *idx = strtonum(ptr + 1, 0, INT_MAX, &errstr); < |