Annotation of src/usr.bin/tmux/cmd-set-option.c, Revision 1.22
1.22 ! nicm 1: /* $OpenBSD: cmd-set-option.c,v 1.21 2009/10/10 09:46:11 nicm Exp $ */
1.1 nicm 2:
3: /*
4: * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: #include <sys/types.h>
20:
21: #include <stdlib.h>
22: #include <string.h>
23:
24: #include "tmux.h"
25:
26: /*
27: * Set an option.
28: */
29:
30: int cmd_set_option_exec(struct cmd *, struct cmd_ctx *);
31:
32: const struct cmd_entry cmd_set_option_entry = {
33: "set-option", "set",
1.14 nicm 34: "[-agu] " CMD_TARGET_SESSION_USAGE " option [value]",
35: CMD_ARG12, CMD_CHFLAG('a')|CMD_CHFLAG('g')|CMD_CHFLAG('u'),
1.1 nicm 36: NULL,
1.14 nicm 37: cmd_target_parse,
1.1 nicm 38: cmd_set_option_exec,
1.14 nicm 39: cmd_target_free,
40: cmd_target_print
1.1 nicm 41: };
42:
43: const char *set_option_status_keys_list[] = {
44: "emacs", "vi", NULL
45: };
1.8 nicm 46: const char *set_option_status_justify_list[] = {
47: "left", "centre", "right", NULL
48: };
1.1 nicm 49: const char *set_option_bell_action_list[] = {
50: "none", "any", "current", NULL
51: };
1.6 nicm 52: const struct set_option_entry set_option_table[] = {
1.15 nicm 53: { "base-index", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
1.1 nicm 54: { "bell-action", SET_OPTION_CHOICE, 0, 0, set_option_bell_action_list },
55: { "buffer-limit", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
56: { "default-command", SET_OPTION_STRING, 0, 0, NULL },
57: { "default-path", SET_OPTION_STRING, 0, 0, NULL },
1.17 nicm 58: { "default-shell", SET_OPTION_STRING, 0, 0, NULL },
1.4 nicm 59: { "default-terminal", SET_OPTION_STRING, 0, 0, NULL },
1.16 nicm 60: { "display-panes-colour", SET_OPTION_COLOUR, 0, 0, NULL },
61: { "display-panes-time", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
1.1 nicm 62: { "display-time", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
63: { "history-limit", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
64: { "lock-after-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
1.20 nicm 65: { "lock-command", SET_OPTION_STRING, 0, 0, NULL },
1.21 nicm 66: { "lock-server", SET_OPTION_FLAG, 0, 0, NULL },
1.1 nicm 67: { "message-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
68: { "message-bg", SET_OPTION_COLOUR, 0, 0, NULL },
69: { "message-fg", SET_OPTION_COLOUR, 0, 0, NULL },
1.22 ! nicm 70: { "mouse-select-pane", SET_OPTION_FLAG, 0, 0, NULL },
1.19 nicm 71: { "prefix", SET_OPTION_KEYS, 0, 0, NULL },
1.1 nicm 72: { "repeat-time", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
73: { "set-remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL },
74: { "set-titles", SET_OPTION_FLAG, 0, 0, NULL },
1.18 nicm 75: { "set-titles-string", SET_OPTION_STRING, 0, 0, NULL },
1.1 nicm 76: { "status", SET_OPTION_FLAG, 0, 0, NULL },
77: { "status-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
78: { "status-bg", SET_OPTION_COLOUR, 0, 0, NULL },
79: { "status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
80: { "status-interval", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
1.8 nicm 81: { "status-justify",
82: SET_OPTION_CHOICE, 0, 0, set_option_status_justify_list },
1.1 nicm 83: { "status-keys", SET_OPTION_CHOICE, 0, 0, set_option_status_keys_list },
84: { "status-left", SET_OPTION_STRING, 0, 0, NULL },
1.12 nicm 85: { "status-left-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
86: { "status-left-bg", SET_OPTION_COLOUR, 0, 0, NULL },
87: { "status-left-fg", SET_OPTION_COLOUR, 0, 0, NULL },
1.1 nicm 88: { "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
89: { "status-right", SET_OPTION_STRING, 0, 0, NULL },
1.12 nicm 90: { "status-right-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
91: { "status-right-bg", SET_OPTION_COLOUR, 0, 0, NULL },
92: { "status-right-fg", SET_OPTION_COLOUR, 0, 0, NULL },
1.1 nicm 93: { "status-right-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
1.10 nicm 94: { "status-utf8", SET_OPTION_FLAG, 0, 0, NULL },
95: { "terminal-overrides", SET_OPTION_STRING, 0, 0, NULL },
1.13 nicm 96: { "update-environment", SET_OPTION_STRING, 0, 0, NULL },
1.7 nicm 97: { "visual-activity", SET_OPTION_FLAG, 0, 0, NULL },
98: { "visual-bell", SET_OPTION_FLAG, 0, 0, NULL },
99: { "visual-content", SET_OPTION_FLAG, 0, 0, NULL },
1.6 nicm 100: { NULL, 0, 0, 0, NULL }
1.1 nicm 101: };
102:
103: int
104: cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
105: {
1.14 nicm 106: struct cmd_target_data *data = self->data;
1.1 nicm 107: struct session *s;
108: struct client *c;
109: struct options *oo;
1.6 nicm 110: const struct set_option_entry *entry, *opt;
1.1 nicm 111: u_int i;
112:
1.5 nicm 113: if (data->chflags & CMD_CHFLAG('g'))
1.3 nicm 114: oo = &global_s_options;
1.1 nicm 115: else {
116: if ((s = cmd_find_session(ctx, data->target)) == NULL)
117: return (-1);
118: oo = &s->options;
119: }
120:
1.14 nicm 121: if (*data->arg == '\0') {
1.1 nicm 122: ctx->error(ctx, "invalid option");
123: return (-1);
124: }
125:
126: entry = NULL;
1.6 nicm 127: for (opt = set_option_table; opt->name != NULL; opt++) {
1.14 nicm 128: if (strncmp(opt->name, data->arg, strlen(data->arg)) != 0)
1.1 nicm 129: continue;
130: if (entry != NULL) {
1.14 nicm 131: ctx->error(ctx, "ambiguous option: %s", data->arg);
1.1 nicm 132: return (-1);
133: }
1.6 nicm 134: entry = opt;
1.1 nicm 135:
136: /* Bail now if an exact match. */
1.14 nicm 137: if (strcmp(entry->name, data->arg) == 0)
1.1 nicm 138: break;
139: }
140: if (entry == NULL) {
1.14 nicm 141: ctx->error(ctx, "unknown option: %s", data->arg);
1.1 nicm 142: return (-1);
143: }
144:
1.5 nicm 145: if (data->chflags & CMD_CHFLAG('u')) {
146: if (data->chflags & CMD_CHFLAG('g')) {
1.1 nicm 147: ctx->error(ctx,
148: "can't unset global option: %s", entry->name);
149: return (-1);
150: }
1.14 nicm 151: if (data->arg2 != NULL) {
1.1 nicm 152: ctx->error(ctx,
153: "value passed to unset option: %s", entry->name);
154: return (-1);
155: }
156:
157: options_remove(oo, entry->name);
158: ctx->info(ctx, "unset option: %s", entry->name);
159: } else {
160: switch (entry->type) {
161: case SET_OPTION_STRING:
1.11 nicm 162: set_option_string(ctx, oo, entry,
1.14 nicm 163: data->arg2, data->chflags & CMD_CHFLAG('a'));
1.1 nicm 164: break;
165: case SET_OPTION_NUMBER:
1.14 nicm 166: set_option_number(ctx, oo, entry, data->arg2);
1.1 nicm 167: break;
1.19 nicm 168: case SET_OPTION_KEYS:
169: set_option_keys(ctx, oo, entry, data->arg2);
1.1 nicm 170: break;
171: case SET_OPTION_COLOUR:
1.14 nicm 172: set_option_colour(ctx, oo, entry, data->arg2);
1.1 nicm 173: break;
174: case SET_OPTION_ATTRIBUTES:
1.14 nicm 175: set_option_attributes(ctx, oo, entry, data->arg2);
1.1 nicm 176: break;
177: case SET_OPTION_FLAG:
1.14 nicm 178: set_option_flag(ctx, oo, entry, data->arg2);
1.1 nicm 179: break;
180: case SET_OPTION_CHOICE:
1.14 nicm 181: set_option_choice(ctx, oo, entry, data->arg2);
1.1 nicm 182: break;
183: }
184: }
185:
186: recalculate_sizes();
187: for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
188: c = ARRAY_ITEM(&clients, i);
189: if (c != NULL && c->session != NULL)
190: server_redraw_client(c);
191: }
192:
193: return (0);
194: }