diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-02-06 22:55:32 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-02-06 22:55:32 +0000 |
commit | 892e10e5c056cf061b989c70bb4b030d0bfa8377 (patch) | |
tree | 21b583a7d02d6b87e586702ed583d0e615b565b9 | |
parent | 4859720892d211ccf40bae2f88188ca870a71b7f (diff) |
Support attaching a client read-only with a new -r flag to the attach-session
command.
-rw-r--r-- | usr.bin/tmux/cmd-attach-session.c | 9 | ||||
-rw-r--r-- | usr.bin/tmux/cmd-detach-client.c | 4 | ||||
-rw-r--r-- | usr.bin/tmux/key-bindings.c | 16 | ||||
-rw-r--r-- | usr.bin/tmux/server-client.c | 27 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.1 | 8 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 4 |
6 files changed, 48 insertions, 20 deletions
diff --git a/usr.bin/tmux/cmd-attach-session.c b/usr.bin/tmux/cmd-attach-session.c index f49b865c7b3..8421e50e85c 100644 --- a/usr.bin/tmux/cmd-attach-session.c +++ b/usr.bin/tmux/cmd-attach-session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-attach-session.c,v 1.11 2009/12/03 22:50:09 nicm Exp $ */ +/* $OpenBSD: cmd-attach-session.c,v 1.12 2010/02/06 22:55:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -28,8 +28,8 @@ int cmd_attach_session_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_attach_session_entry = { "attach-session", "attach", - "[-d] " CMD_TARGET_SESSION_USAGE, - CMD_CANTNEST|CMD_STARTSERVER|CMD_SENDENVIRON, "d", + "[-dr] " CMD_TARGET_SESSION_USAGE, + CMD_CANTNEST|CMD_STARTSERVER|CMD_SENDENVIRON, "dr", cmd_target_init, cmd_target_parse, cmd_attach_session_exec, @@ -89,6 +89,9 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx) return (-1); } + if (cmd_check_flag(data->chflags, 'r')) + ctx->cmdclient->flags |= CLIENT_READONLY; + if (cmd_check_flag(data->chflags, 'd')) server_write_session(s, MSG_DETACH, NULL, 0); diff --git a/usr.bin/tmux/cmd-detach-client.c b/usr.bin/tmux/cmd-detach-client.c index 77a30d294fb..b3f523113bb 100644 --- a/usr.bin/tmux/cmd-detach-client.c +++ b/usr.bin/tmux/cmd-detach-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-detach-client.c,v 1.4 2009/11/13 19:53:29 nicm Exp $ */ +/* $OpenBSD: cmd-detach-client.c,v 1.5 2010/02/06 22:55:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -29,7 +29,7 @@ int cmd_detach_client_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_detach_client_entry = { "detach-client", "detach", CMD_TARGET_CLIENT_USAGE, - 0, "", + CMD_READONLY, "", cmd_target_init, cmd_target_parse, cmd_detach_client_exec, diff --git a/usr.bin/tmux/key-bindings.c b/usr.bin/tmux/key-bindings.c index bff573139ed..711106646c6 100644 --- a/usr.bin/tmux/key-bindings.c +++ b/usr.bin/tmux/key-bindings.c @@ -1,4 +1,4 @@ -/* $OpenBSD: key-bindings.c,v 1.16 2009/12/10 09:16:52 nicm Exp $ */ +/* $OpenBSD: key-bindings.c,v 1.17 2010/02/06 22:55:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -239,7 +239,9 @@ key_bindings_info(struct cmd_ctx *ctx, const char *fmt, ...) void key_bindings_dispatch(struct key_binding *bd, struct client *c) { - struct cmd_ctx ctx; + struct cmd_ctx ctx; + struct cmd *cmd; + int readonly; ctx.msgdata = NULL; ctx.curclient = c; @@ -250,5 +252,15 @@ key_bindings_dispatch(struct key_binding *bd, struct client *c) ctx.cmdclient = NULL; + readonly = 1; + TAILQ_FOREACH(cmd, bd->cmdlist, qentry) { + if (!(cmd->entry->flags & CMD_READONLY)) + readonly = 0; + } + if (!readonly && c->flags & CLIENT_READONLY) { + key_bindings_info(&ctx, "Client is read-only"); + return; + } + cmd_list_exec(bd->cmdlist, &ctx); } diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index 331e4137211..45533c72ec1 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.29 2010/02/06 18:47:41 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.30 2010/02/06 22:55:31 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -271,6 +271,8 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data) /* Special case: number keys jump to pane in identify mode. */ if (c->flags & CLIENT_IDENTIFY && key >= '0' && key <= '9') { + if (c->flags & CLIENT_READONLY) + return; wp = window_pane_at_index(w, key - '0'); if (wp != NULL && window_pane_visible(wp)) window_set_active_pane(w, wp); @@ -279,15 +281,20 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data) } /* Handle status line. */ - status_message_clear(c); - server_clear_identify(c); + if (!(c->flags & CLIENT_READONLY)) { + status_message_clear(c); + server_clear_identify(c); + } if (c->prompt_string != NULL) { - status_prompt_key(c, key); + if (!(c->flags & CLIENT_READONLY)) + status_prompt_key(c, key); return; } /* Check for mouse keys. */ if (key == KEYC_MOUSE) { + if (c->flags & CLIENT_READONLY) + return; if (options_get_number(oo, "mouse-select-pane")) { window_set_active_at(w, mouse->x, mouse->y); server_redraw_window_borders(w); @@ -313,9 +320,10 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data) c->flags |= CLIENT_PREFIX; else { /* Try as a non-prefix key binding. */ - if ((bd = key_bindings_lookup(key)) == NULL) - window_pane_key(wp, c, key); - else + if ((bd = key_bindings_lookup(key)) == NULL) { + if (!(c->flags & CLIENT_READONLY)) + window_pane_key(wp, c, key); + } else key_bindings_dispatch(bd, c); } return; @@ -329,7 +337,7 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data) c->flags &= ~CLIENT_REPEAT; if (isprefix) c->flags |= CLIENT_PREFIX; - else + else if (!(c->flags & CLIENT_READONLY)) window_pane_key(wp, c, key); } return; @@ -340,7 +348,7 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data) c->flags &= ~CLIENT_REPEAT; if (isprefix) c->flags |= CLIENT_PREFIX; - else + else if (!(c->flags & CLIENT_READONLY)) window_pane_key(wp, c, key); return; } @@ -660,7 +668,6 @@ server_client_msg_command(struct client *c, struct msg_command_data *data) { struct cmd_ctx ctx; struct cmd_list *cmdlist = NULL; - struct cmd *cmd; int argc; char **argv, *cause; diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index a5da4297f16..33885c47247 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.147 2010/02/06 17:35:01 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.148 2010/02/06 22:55:31 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" @@ -364,7 +364,7 @@ new-window ; split-window -d The following commands are available: .Bl -tag -width Ds .It Xo Ic attach-session -.Op Fl d +.Op Fl dr .Op Fl t Ar target-session .Xc .D1 (alias: Ic attach ) @@ -376,6 +376,10 @@ If used from inside, switch the current client. If .Fl d is specified, any other clients attached to the session are detached. +.Fl r +signifies the client is read-only (only keys bound to the +.Ic detach-client +command have any effect) .Pp If no server is started, .Ic attach-session diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index b7a5ad027ec..8be009b0ed0 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.204 2010/02/06 17:35:01 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.205 2010/02/06 22:55:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1094,6 +1094,7 @@ struct client { #define CLIENT_IDENTIFY 0x100 #define CLIENT_DEAD 0x200 #define CLIENT_BORDERS 0x400 +#define CLIENT_READONLY 0x800 int flags; struct event identify_timer; @@ -1172,6 +1173,7 @@ struct cmd_entry { #define CMD_ARG01 0x10 #define CMD_ARG2 0x20 #define CMD_ARG12 0x40 +#define CMD_READONLY 0x80 int flags; const char *chflags; |