mirror of
https://github.com/tmux/tmux.git
synced 2025-01-05 23:38:48 +00:00
Sync OpenBSD patchset 826:
Move the user-visible parts of all options (names, types, limit, default values) together into one set of tables in options-table.c. Also clean up and simplify cmd-set-options.c and move a common print function into option-table.c.
This commit is contained in:
parent
2bdae526ad
commit
36c7c7537a
563
cmd-set-option.c
563
cmd-set-option.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: cmd-set-option.c,v 1.103 2010-12-30 22:39:49 tcunha Exp $ */
|
/* $Id: cmd-set-option.c,v 1.104 2011-01-03 23:52:38 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -29,22 +29,25 @@
|
|||||||
|
|
||||||
int cmd_set_option_exec(struct cmd *, struct cmd_ctx *);
|
int cmd_set_option_exec(struct cmd *, struct cmd_ctx *);
|
||||||
|
|
||||||
const char *cmd_set_option_print(
|
int cmd_set_option_unset(struct cmd *, struct cmd_ctx *,
|
||||||
const struct set_option_entry *, struct options_entry *);
|
const struct options_table_entry *, struct options *);
|
||||||
void cmd_set_option_string(struct cmd_ctx *,
|
int cmd_set_option_set(struct cmd *, struct cmd_ctx *,
|
||||||
struct options *, const struct set_option_entry *, char *, int);
|
const struct options_table_entry *, struct options *);
|
||||||
void cmd_set_option_number(struct cmd_ctx *,
|
|
||||||
struct options *, const struct set_option_entry *, char *);
|
struct options_entry *cmd_set_option_string(struct cmd *, struct cmd_ctx *,
|
||||||
void cmd_set_option_keys(struct cmd_ctx *,
|
const struct options_table_entry *, struct options *);
|
||||||
struct options *, const struct set_option_entry *, char *);
|
struct options_entry *cmd_set_option_number(struct cmd *, struct cmd_ctx *,
|
||||||
void cmd_set_option_colour(struct cmd_ctx *,
|
const struct options_table_entry *, struct options *);
|
||||||
struct options *, const struct set_option_entry *, char *);
|
struct options_entry *cmd_set_option_keys(struct cmd *, struct cmd_ctx *,
|
||||||
void cmd_set_option_attributes(struct cmd_ctx *,
|
const struct options_table_entry *, struct options *);
|
||||||
struct options *, const struct set_option_entry *, char *);
|
struct options_entry *cmd_set_option_colour(struct cmd *, struct cmd_ctx *,
|
||||||
void cmd_set_option_flag(struct cmd_ctx *,
|
const struct options_table_entry *, struct options *);
|
||||||
struct options *, const struct set_option_entry *, char *);
|
struct options_entry *cmd_set_option_attributes(struct cmd *, struct cmd_ctx *,
|
||||||
void cmd_set_option_choice(struct cmd_ctx *,
|
const struct options_table_entry *, struct options *);
|
||||||
struct options *, const struct set_option_entry *, char *);
|
struct options_entry *cmd_set_option_flag(struct cmd *, struct cmd_ctx *,
|
||||||
|
const struct options_table_entry *, struct options *);
|
||||||
|
struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_ctx *,
|
||||||
|
const struct options_table_entry *, struct options *);
|
||||||
|
|
||||||
const struct cmd_entry cmd_set_option_entry = {
|
const struct cmd_entry cmd_set_option_entry = {
|
||||||
"set-option", "set",
|
"set-option", "set",
|
||||||
@ -57,149 +60,26 @@ const struct cmd_entry cmd_set_option_entry = {
|
|||||||
cmd_target_print
|
cmd_target_print
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *set_option_mode_keys_list[] = {
|
|
||||||
"emacs", "vi", NULL
|
|
||||||
};
|
|
||||||
const char *set_option_clock_mode_style_list[] = {
|
|
||||||
"12", "24", NULL
|
|
||||||
};
|
|
||||||
const char *set_option_status_keys_list[] = {
|
|
||||||
"emacs", "vi", NULL
|
|
||||||
};
|
|
||||||
const char *set_option_status_justify_list[] = {
|
|
||||||
"left", "centre", "right", NULL
|
|
||||||
};
|
|
||||||
const char *set_option_bell_action_list[] = {
|
|
||||||
"none", "any", "current", NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct set_option_entry set_option_table[] = {
|
|
||||||
{ "buffer-limit", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
|
|
||||||
{ "escape-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "exit-unattached", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "quiet", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ NULL, 0, 0, 0, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct set_option_entry set_session_option_table[] = {
|
|
||||||
{ "base-index", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "bell-action", SET_OPTION_CHOICE, 0, 0, set_option_bell_action_list },
|
|
||||||
{ "default-command", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "default-path", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "default-shell", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "default-terminal", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "destroy-unattached", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "detach-on-destroy", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "display-panes-active-colour", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "display-panes-colour", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "display-panes-time", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
|
|
||||||
{ "display-time", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
|
|
||||||
{ "history-limit", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "lock-after-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "lock-command", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "lock-server", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "message-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "message-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "message-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "message-limit", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "mouse-select-pane", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "pane-active-border-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "pane-active-border-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "pane-border-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "pane-border-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "prefix", SET_OPTION_KEYS, 0, 0, NULL },
|
|
||||||
{ "repeat-time", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
|
|
||||||
{ "set-remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "set-titles", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "set-titles-string", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "status", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "status-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "status-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "status-interval", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "status-justify",
|
|
||||||
SET_OPTION_CHOICE, 0, 0, set_option_status_justify_list },
|
|
||||||
{ "status-keys", SET_OPTION_CHOICE, 0, 0, set_option_status_keys_list },
|
|
||||||
{ "status-left", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "status-left-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "status-left-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "status-left-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
|
|
||||||
{ "status-right", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "status-right-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "status-right-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "status-right-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "status-right-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
|
|
||||||
{ "status-utf8", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "terminal-overrides", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "update-environment", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "visual-activity", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "visual-bell", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "visual-content", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "visual-silence", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ NULL, 0, 0, 0, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct set_option_entry set_window_option_table[] = {
|
|
||||||
{ "aggressive-resize", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "alternate-screen", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "automatic-rename", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "clock-mode-colour", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "clock-mode-style",
|
|
||||||
SET_OPTION_CHOICE, 0, 0, set_option_clock_mode_style_list },
|
|
||||||
{ "force-height", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "force-width", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "main-pane-height", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
|
|
||||||
{ "main-pane-width", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
|
|
||||||
{ "mode-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "mode-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "mode-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "mode-keys", SET_OPTION_CHOICE, 0, 0, set_option_mode_keys_list },
|
|
||||||
{ "mode-mouse", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "monitor-activity", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "monitor-content", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "monitor-silence",SET_OPTION_NUMBER, 0, INT_MAX, NULL},
|
|
||||||
{ "other-pane-height", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "other-pane-width", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
|
|
||||||
{ "remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "synchronize-panes", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "utf8", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ "window-status-alert-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "window-status-alert-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "window-status-alert-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "window-status-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "window-status-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "window-status-current-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
|
|
||||||
{ "window-status-current-bg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "window-status-current-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "window-status-current-format", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "window-status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
|
|
||||||
{ "window-status-format", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "word-separators", SET_OPTION_STRING, 0, 0, NULL },
|
|
||||||
{ "xterm-keys", SET_OPTION_FLAG, 0, 0, NULL },
|
|
||||||
{ NULL, 0, 0, 0, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
|
cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct cmd_target_data *data = self->data;
|
struct cmd_target_data *data = self->data;
|
||||||
const struct set_option_entry *table;
|
const struct options_table_entry *table, *oe, *oe_loop;
|
||||||
struct session *s;
|
struct session *s;
|
||||||
struct winlink *wl;
|
struct winlink *wl;
|
||||||
struct client *c;
|
struct client *c;
|
||||||
struct options *oo;
|
struct options *oo;
|
||||||
const struct set_option_entry *entry, *opt;
|
struct jobs *jobs;
|
||||||
struct jobs *jobs;
|
struct job *job, *nextjob;
|
||||||
struct job *job, *nextjob;
|
u_int i;
|
||||||
u_int i;
|
int try_again;
|
||||||
int try_again;
|
|
||||||
|
|
||||||
|
/* Work out the options tree and table to use. */
|
||||||
if (cmd_check_flag(data->chflags, 's')) {
|
if (cmd_check_flag(data->chflags, 's')) {
|
||||||
oo = &global_options;
|
oo = &global_options;
|
||||||
table = set_option_table;
|
table = server_options_table;
|
||||||
} else if (cmd_check_flag(data->chflags, 'w')) {
|
} else if (cmd_check_flag(data->chflags, 'w')) {
|
||||||
table = set_window_option_table;
|
table = window_options_table;
|
||||||
if (cmd_check_flag(data->chflags, 'g'))
|
if (cmd_check_flag(data->chflags, 'g'))
|
||||||
oo = &global_w_options;
|
oo = &global_w_options;
|
||||||
else {
|
else {
|
||||||
@ -209,7 +89,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
oo = &wl->window->options;
|
oo = &wl->window->options;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
table = set_session_option_table;
|
table = session_options_table;
|
||||||
if (cmd_check_flag(data->chflags, 'g'))
|
if (cmd_check_flag(data->chflags, 'g'))
|
||||||
oo = &global_s_options;
|
oo = &global_s_options;
|
||||||
else {
|
else {
|
||||||
@ -220,71 +100,36 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*data->arg == '\0') {
|
/* Find the option table entry. */
|
||||||
ctx->error(ctx, "invalid option");
|
oe = NULL;
|
||||||
return (-1);
|
for (oe_loop = table; oe_loop->name != NULL; oe_loop++) {
|
||||||
}
|
if (strncmp(oe_loop->name, data->arg, strlen(data->arg)) != 0)
|
||||||
|
|
||||||
entry = NULL;
|
|
||||||
for (opt = table; opt->name != NULL; opt++) {
|
|
||||||
if (strncmp(opt->name, data->arg, strlen(data->arg)) != 0)
|
|
||||||
continue;
|
continue;
|
||||||
if (entry != NULL) {
|
if (oe != NULL) {
|
||||||
ctx->error(ctx, "ambiguous option: %s", data->arg);
|
ctx->error(ctx, "ambiguous option: %s", data->arg);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
entry = opt;
|
oe = oe_loop;
|
||||||
|
|
||||||
/* Bail now if an exact match. */
|
/* Bail now if an exact match. */
|
||||||
if (strcmp(entry->name, data->arg) == 0)
|
if (strcmp(oe->name, data->arg) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (entry == NULL) {
|
if (oe == NULL) {
|
||||||
ctx->error(ctx, "unknown option: %s", data->arg);
|
ctx->error(ctx, "unknown option: %s", data->arg);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Unset or set the option. */
|
||||||
if (cmd_check_flag(data->chflags, 'u')) {
|
if (cmd_check_flag(data->chflags, 'u')) {
|
||||||
if (cmd_check_flag(data->chflags, 'g')) {
|
if (cmd_set_option_unset(self, ctx, oe, oo) != 0)
|
||||||
ctx->error(ctx,
|
|
||||||
"can't unset global option: %s", entry->name);
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
|
||||||
if (data->arg2 != NULL) {
|
|
||||||
ctx->error(ctx,
|
|
||||||
"value passed to unset option: %s", entry->name);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
options_remove(oo, entry->name);
|
|
||||||
ctx->info(ctx, "unset option: %s", entry->name);
|
|
||||||
} else {
|
} else {
|
||||||
switch (entry->type) {
|
if (cmd_set_option_set(self, ctx, oe, oo) != 0)
|
||||||
case SET_OPTION_STRING:
|
return (-1);
|
||||||
cmd_set_option_string(ctx, oo, entry,
|
|
||||||
data->arg2, cmd_check_flag(data->chflags, 'a'));
|
|
||||||
break;
|
|
||||||
case SET_OPTION_NUMBER:
|
|
||||||
cmd_set_option_number(ctx, oo, entry, data->arg2);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_KEYS:
|
|
||||||
cmd_set_option_keys(ctx, oo, entry, data->arg2);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_COLOUR:
|
|
||||||
cmd_set_option_colour(ctx, oo, entry, data->arg2);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_ATTRIBUTES:
|
|
||||||
cmd_set_option_attributes(ctx, oo, entry, data->arg2);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_FLAG:
|
|
||||||
cmd_set_option_flag(ctx, oo, entry, data->arg2);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_CHOICE:
|
|
||||||
cmd_set_option_choice(ctx, oo, entry, data->arg2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update sizes and redraw. May not need it but meh. */
|
||||||
recalculate_sizes();
|
recalculate_sizes();
|
||||||
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
|
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
|
||||||
c = ARRAY_ITEM(&clients, i);
|
c = ARRAY_ITEM(&clients, i);
|
||||||
@ -297,11 +142,11 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
* or set-titles-string have changed. Persistent jobs are only used by
|
* or set-titles-string have changed. Persistent jobs are only used by
|
||||||
* the status line at the moment so this works XXX.
|
* the status line at the moment so this works XXX.
|
||||||
*/
|
*/
|
||||||
if (strcmp(entry->name, "status-left") == 0 ||
|
if (strcmp(oe->name, "status-left") == 0 ||
|
||||||
strcmp(entry->name, "status-right") == 0 ||
|
strcmp(oe->name, "status-right") == 0 ||
|
||||||
strcmp(entry->name, "status") == 0 ||
|
strcmp(oe->name, "status") == 0 ||
|
||||||
strcmp(entry->name, "set-titles-string") == 0 ||
|
strcmp(oe->name, "set-titles-string") == 0 ||
|
||||||
strcmp(entry->name, "window-status-format") == 0) {
|
strcmp(oe->name, "window-status-format") == 0) {
|
||||||
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
|
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
|
||||||
c = ARRAY_ITEM(&clients, i);
|
c = ARRAY_ITEM(&clients, i);
|
||||||
if (c == NULL || c->session == NULL)
|
if (c == NULL || c->session == NULL)
|
||||||
@ -328,242 +173,226 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
/* Unset an option. */
|
||||||
cmd_set_option_print(
|
int
|
||||||
const struct set_option_entry *entry, struct options_entry *o)
|
cmd_set_option_unset(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
static char out[BUFSIZ];
|
struct cmd_target_data *data = self->data;
|
||||||
const char *s;
|
|
||||||
struct keylist *keylist;
|
|
||||||
u_int i;
|
|
||||||
|
|
||||||
*out = '\0';
|
if (cmd_check_flag(data->chflags, 'g')) {
|
||||||
switch (entry->type) {
|
ctx->error(ctx, "can't unset global option: %s", oe->name);
|
||||||
case SET_OPTION_STRING:
|
return (-1);
|
||||||
xsnprintf(out, sizeof out, "\"%s\"", o->str);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_NUMBER:
|
|
||||||
xsnprintf(out, sizeof out, "%lld", o->num);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_KEYS:
|
|
||||||
keylist = o->data;
|
|
||||||
for (i = 0; i < ARRAY_LENGTH(keylist); i++) {
|
|
||||||
strlcat(out, key_string_lookup_key(
|
|
||||||
ARRAY_ITEM(keylist, i)), sizeof out);
|
|
||||||
if (i != ARRAY_LENGTH(keylist) - 1)
|
|
||||||
strlcat(out, ",", sizeof out);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SET_OPTION_COLOUR:
|
|
||||||
s = colour_tostring(o->num);
|
|
||||||
xsnprintf(out, sizeof out, "%s", s);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_ATTRIBUTES:
|
|
||||||
s = attributes_tostring(o->num);
|
|
||||||
xsnprintf(out, sizeof out, "%s", s);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_FLAG:
|
|
||||||
if (o->num)
|
|
||||||
strlcpy(out, "on", sizeof out);
|
|
||||||
else
|
|
||||||
strlcpy(out, "off", sizeof out);
|
|
||||||
break;
|
|
||||||
case SET_OPTION_CHOICE:
|
|
||||||
s = entry->choices[o->num];
|
|
||||||
xsnprintf(out, sizeof out, "%s", s);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return (out);
|
if (data->arg2 != NULL) {
|
||||||
|
ctx->error(ctx, "value passed to unset option: %s", oe->name);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
options_remove(oo, oe->name);
|
||||||
|
ctx->info(ctx, "unset option: %s", oe->name);
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* Set an option. */
|
||||||
cmd_set_option_string(struct cmd_ctx *ctx, struct options *oo,
|
int
|
||||||
const struct set_option_entry *entry, char *value, int append)
|
cmd_set_option_set(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
|
struct cmd_target_data *data = self->data;
|
||||||
struct options_entry *o;
|
struct options_entry *o;
|
||||||
char *oldvalue, *newvalue;
|
const char *s;
|
||||||
|
|
||||||
if (value == NULL) {
|
if (oe->type != OPTIONS_TABLE_FLAG && data->arg2 == NULL) {
|
||||||
ctx->error(ctx, "empty value");
|
ctx->error(ctx, "empty data->arg2");
|
||||||
return;
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (append) {
|
o = NULL;
|
||||||
oldvalue = options_get_string(oo, entry->name);
|
switch (oe->type) {
|
||||||
xasprintf(&newvalue, "%s%s", oldvalue, value);
|
case OPTIONS_TABLE_STRING:
|
||||||
|
o = cmd_set_option_string(self, ctx, oe, oo);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_NUMBER:
|
||||||
|
o = cmd_set_option_number(self, ctx, oe, oo);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_KEYS:
|
||||||
|
o = cmd_set_option_keys(self, ctx, oe, oo);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_COLOUR:
|
||||||
|
o = cmd_set_option_colour(self, ctx, oe, oo);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_ATTRIBUTES:
|
||||||
|
o = cmd_set_option_attributes(self, ctx, oe, oo);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_FLAG:
|
||||||
|
o = cmd_set_option_flag(self, ctx, oe, oo);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_CHOICE:
|
||||||
|
o = cmd_set_option_choice(self, ctx, oe, oo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (o == NULL)
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
s = options_table_print_entry(oe, o);
|
||||||
|
ctx->info(ctx, "set option: %s -> %s", oe->name, s);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a string option. */
|
||||||
|
struct options_entry *
|
||||||
|
cmd_set_option_string(struct cmd *self, unused struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
|
{
|
||||||
|
struct cmd_target_data *data = self->data;
|
||||||
|
struct options_entry *o;
|
||||||
|
char *oldval, *newval;
|
||||||
|
|
||||||
|
if (cmd_check_flag(data->chflags, 'a')) {
|
||||||
|
oldval = options_get_string(oo, oe->name);
|
||||||
|
xasprintf(&newval, "%s%s", oldval, data->arg2);
|
||||||
} else
|
} else
|
||||||
newvalue = value;
|
newval = data->arg2;
|
||||||
|
|
||||||
o = options_set_string(oo, entry->name, "%s", newvalue);
|
o = options_set_string(oo, oe->name, "%s", newval);
|
||||||
ctx->info(ctx,
|
|
||||||
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
|
|
||||||
|
|
||||||
if (newvalue != value)
|
if (newval != data->arg2)
|
||||||
xfree(newvalue);
|
xfree(newval);
|
||||||
|
return (o);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* Set a number option. */
|
||||||
cmd_set_option_number(struct cmd_ctx *ctx, struct options *oo,
|
struct options_entry *
|
||||||
const struct set_option_entry *entry, char *value)
|
cmd_set_option_number(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
struct options_entry *o;
|
struct cmd_target_data *data = self->data;
|
||||||
long long number;
|
long long ll;
|
||||||
const char *errstr;
|
const char *errstr;
|
||||||
|
|
||||||
if (value == NULL) {
|
ll = strtonum(data->arg2, oe->minimum, oe->maximum, &errstr);
|
||||||
ctx->error(ctx, "empty value");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
number = strtonum(value, entry->minimum, entry->maximum, &errstr);
|
|
||||||
if (errstr != NULL) {
|
if (errstr != NULL) {
|
||||||
ctx->error(ctx, "value is %s: %s", errstr, value);
|
ctx->error(ctx, "value is %s: %s", errstr, data->arg2);
|
||||||
return;
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
o = options_set_number(oo, entry->name, number);
|
return (options_set_number(oo, oe->name, ll));
|
||||||
ctx->info(ctx,
|
|
||||||
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* Set a keys option. */
|
||||||
cmd_set_option_keys(struct cmd_ctx *ctx, struct options *oo,
|
struct options_entry *
|
||||||
const struct set_option_entry *entry, char *value)
|
cmd_set_option_keys(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
struct options_entry *o;
|
struct cmd_target_data *data = self->data;
|
||||||
struct keylist *keylist;
|
struct keylist *keylist;
|
||||||
char *copyvalue, *ptr, *str;
|
char *copy, *ptr, *s;
|
||||||
int key;
|
int key;
|
||||||
|
|
||||||
if (value == NULL) {
|
|
||||||
ctx->error(ctx, "empty value");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
keylist = xmalloc(sizeof *keylist);
|
keylist = xmalloc(sizeof *keylist);
|
||||||
ARRAY_INIT(keylist);
|
ARRAY_INIT(keylist);
|
||||||
|
|
||||||
ptr = copyvalue = xstrdup(value);
|
ptr = copy = xstrdup(data->arg2);
|
||||||
while ((str = strsep(&ptr, ",")) != NULL) {
|
while ((s = strsep(&ptr, ",")) != NULL) {
|
||||||
if ((key = key_string_lookup_string(str)) == KEYC_NONE) {
|
if ((key = key_string_lookup_string(s)) == KEYC_NONE) {
|
||||||
|
ctx->error(ctx, "unknown key: %s", s);
|
||||||
|
xfree(copy);
|
||||||
xfree(keylist);
|
xfree(keylist);
|
||||||
ctx->error(ctx, "unknown key: %s", str);
|
return (NULL);
|
||||||
xfree(copyvalue);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
ARRAY_ADD(keylist, key);
|
ARRAY_ADD(keylist, key);
|
||||||
}
|
}
|
||||||
xfree(copyvalue);
|
xfree(copy);
|
||||||
|
|
||||||
o = options_set_data(oo, entry->name, keylist, xfree);
|
return (options_set_data(oo, oe->name, keylist, xfree));
|
||||||
ctx->info(ctx,
|
|
||||||
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* Set a colour option. */
|
||||||
cmd_set_option_colour(struct cmd_ctx *ctx, struct options *oo,
|
struct options_entry *
|
||||||
const struct set_option_entry *entry, char *value)
|
cmd_set_option_colour(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
struct options_entry *o;
|
struct cmd_target_data *data = self->data;
|
||||||
int colour;
|
int colour;
|
||||||
|
|
||||||
if (value == NULL) {
|
if ((colour = colour_fromstring(data->arg2)) == -1) {
|
||||||
ctx->error(ctx, "empty value");
|
ctx->error(ctx, "bad colour: %s", data->arg2);
|
||||||
return;
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((colour = colour_fromstring(value)) == -1) {
|
return (options_set_number(oo, oe->name, colour));
|
||||||
ctx->error(ctx, "bad colour: %s", value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
o = options_set_number(oo, entry->name, colour);
|
|
||||||
ctx->info(ctx,
|
|
||||||
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* Set an attributes option. */
|
||||||
cmd_set_option_attributes(struct cmd_ctx *ctx, struct options *oo,
|
struct options_entry *
|
||||||
const struct set_option_entry *entry, char *value)
|
cmd_set_option_attributes(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
struct options_entry *o;
|
struct cmd_target_data *data = self->data;
|
||||||
int attr;
|
int attr;
|
||||||
|
|
||||||
if (value == NULL) {
|
if ((attr = attributes_fromstring(data->arg2)) == -1) {
|
||||||
ctx->error(ctx, "empty value");
|
ctx->error(ctx, "bad attributes: %s", data->arg2);
|
||||||
return;
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((attr = attributes_fromstring(value)) == -1) {
|
return (options_set_number(oo, oe->name, attr));
|
||||||
ctx->error(ctx, "bad attributes: %s", value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
o = options_set_number(oo, entry->name, attr);
|
|
||||||
ctx->info(ctx,
|
|
||||||
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* Set a flag option. */
|
||||||
cmd_set_option_flag(struct cmd_ctx *ctx, struct options *oo,
|
struct options_entry *
|
||||||
const struct set_option_entry *entry, char *value)
|
cmd_set_option_flag(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
struct options_entry *o;
|
struct cmd_target_data *data = self->data;
|
||||||
int flag;
|
int flag;
|
||||||
|
|
||||||
if (value == NULL || *value == '\0')
|
if (data->arg2 == NULL || *data->arg2 == '\0')
|
||||||
flag = !options_get_number(oo, entry->name);
|
flag = !options_get_number(oo, oe->name);
|
||||||
else {
|
else {
|
||||||
if ((value[0] == '1' && value[1] == '\0') ||
|
if ((data->arg2[0] == '1' && data->arg2[1] == '\0') ||
|
||||||
strcasecmp(value, "on") == 0 ||
|
strcasecmp(data->arg2, "on") == 0 ||
|
||||||
strcasecmp(value, "yes") == 0)
|
strcasecmp(data->arg2, "yes") == 0)
|
||||||
flag = 1;
|
flag = 1;
|
||||||
else if ((value[0] == '0' && value[1] == '\0') ||
|
else if ((data->arg2[0] == '0' && data->arg2[1] == '\0') ||
|
||||||
strcasecmp(value, "off") == 0 ||
|
strcasecmp(data->arg2, "off") == 0 ||
|
||||||
strcasecmp(value, "no") == 0)
|
strcasecmp(data->arg2, "no") == 0)
|
||||||
flag = 0;
|
flag = 0;
|
||||||
else {
|
else {
|
||||||
ctx->error(ctx, "bad value: %s", value);
|
ctx->error(ctx, "bad value: %s", data->arg2);
|
||||||
return;
|
return (NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
o = options_set_number(oo, entry->name, flag);
|
return (options_set_number(oo, oe->name, flag));
|
||||||
ctx->info(ctx,
|
|
||||||
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* Set a choice option. */
|
||||||
cmd_set_option_choice(struct cmd_ctx *ctx, struct options *oo,
|
struct options_entry *
|
||||||
const struct set_option_entry *entry, char *value)
|
cmd_set_option_choice(struct cmd *self, struct cmd_ctx *ctx,
|
||||||
|
const struct options_table_entry *oe, struct options *oo)
|
||||||
{
|
{
|
||||||
struct options_entry *o;
|
struct cmd_target_data *data = self->data;
|
||||||
const char **choicep;
|
const char **choicep;
|
||||||
int n, choice = -1;
|
int n, choice = -1;
|
||||||
|
|
||||||
if (value == NULL) {
|
|
||||||
ctx->error(ctx, "empty value");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
for (choicep = entry->choices; *choicep != NULL; choicep++) {
|
for (choicep = oe->choices; *choicep != NULL; choicep++) {
|
||||||
n++;
|
n++;
|
||||||
if (strncmp(*choicep, value, strlen(value)) != 0)
|
if (strncmp(*choicep, data->arg2, strlen(data->arg2)) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (choice != -1) {
|
if (choice != -1) {
|
||||||
ctx->error(ctx, "ambiguous option value: %s", value);
|
ctx->error(ctx, "ambiguous value: %s", data->arg2);
|
||||||
return;
|
return (NULL);
|
||||||
}
|
}
|
||||||
choice = n - 1;
|
choice = n - 1;
|
||||||
}
|
}
|
||||||
if (choice == -1) {
|
if (choice == -1) {
|
||||||
ctx->error(ctx, "unknown option value: %s", value);
|
ctx->error(ctx, "unknown value: %s", data->arg2);
|
||||||
return;
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
o = options_set_number(oo, entry->name, choice);
|
return (options_set_number(oo, oe->name, choice));
|
||||||
ctx->info(ctx,
|
|
||||||
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: cmd-show-options.c,v 1.21 2009-12-10 16:59:02 tcunha Exp $ */
|
/* $Id: cmd-show-options.c,v 1.22 2011-01-03 23:52:38 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -43,20 +43,19 @@ const struct cmd_entry cmd_show_options_entry = {
|
|||||||
int
|
int
|
||||||
cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
|
cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct cmd_target_data *data = self->data;
|
struct cmd_target_data *data = self->data;
|
||||||
const struct set_option_entry *table;
|
const struct options_table_entry *table, *oe;
|
||||||
struct session *s;
|
struct session *s;
|
||||||
struct winlink *wl;
|
struct winlink *wl;
|
||||||
struct options *oo;
|
struct options *oo;
|
||||||
struct options_entry *o;
|
struct options_entry *o;
|
||||||
const struct set_option_entry *entry;
|
const char *optval;
|
||||||
const char *optval;
|
|
||||||
|
|
||||||
if (cmd_check_flag(data->chflags, 's')) {
|
if (cmd_check_flag(data->chflags, 's')) {
|
||||||
oo = &global_options;
|
oo = &global_options;
|
||||||
table = set_option_table;
|
table = server_options_table;
|
||||||
} else if (cmd_check_flag(data->chflags, 'w')) {
|
} else if (cmd_check_flag(data->chflags, 'w')) {
|
||||||
table = set_window_option_table;
|
table = window_options_table;
|
||||||
if (cmd_check_flag(data->chflags, 'g'))
|
if (cmd_check_flag(data->chflags, 'g'))
|
||||||
oo = &global_w_options;
|
oo = &global_w_options;
|
||||||
else {
|
else {
|
||||||
@ -66,7 +65,7 @@ cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
oo = &wl->window->options;
|
oo = &wl->window->options;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
table = set_session_option_table;
|
table = session_options_table;
|
||||||
if (cmd_check_flag(data->chflags, 'g'))
|
if (cmd_check_flag(data->chflags, 'g'))
|
||||||
oo = &global_s_options;
|
oo = &global_s_options;
|
||||||
else {
|
else {
|
||||||
@ -77,11 +76,11 @@ cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (entry = table; entry->name != NULL; entry++) {
|
for (oe = table; oe->name != NULL; oe++) {
|
||||||
if ((o = options_find1(oo, entry->name)) == NULL)
|
if ((o = options_find1(oo, oe->name)) == NULL)
|
||||||
continue;
|
continue;
|
||||||
optval = cmd_set_option_print(entry, o);
|
optval = options_table_print_entry(oe, o);
|
||||||
ctx->print(ctx, "%s %s", entry->name, optval);
|
ctx->print(ctx, "%s %s", oe->name, optval);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
639
options-table.c
Normal file
639
options-table.c
Normal file
@ -0,0 +1,639 @@
|
|||||||
|
/* $Id: options-table.c,v 1.1 2011-01-03 23:52:38 tcunha Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2011 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 <string.h>
|
||||||
|
#include <paths.h>
|
||||||
|
|
||||||
|
#include "tmux.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file has a tables with all the server, session and window
|
||||||
|
* options. These tables are the master copy of the options with their real
|
||||||
|
* (user-visible) types, range limits and default values. At start these are
|
||||||
|
* copied into the runtime global options trees (which only has number and
|
||||||
|
* string types). These tables are then used to loop up the real type when
|
||||||
|
* the user sets an option or its value needs to be shown.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Choice option type lists. */
|
||||||
|
const char *options_table_mode_keys_list[] = {
|
||||||
|
"emacs", "vi", NULL
|
||||||
|
};
|
||||||
|
const char *options_table_clock_mode_style_list[] = {
|
||||||
|
"12", "24", NULL
|
||||||
|
};
|
||||||
|
const char *options_table_status_keys_list[] = {
|
||||||
|
"emacs", "vi", NULL
|
||||||
|
};
|
||||||
|
const char *options_table_status_justify_list[] = {
|
||||||
|
"left", "centre", "right", NULL
|
||||||
|
};
|
||||||
|
const char *options_table_bell_action_list[] = {
|
||||||
|
"none", "any", "current", NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Server options. */
|
||||||
|
const struct options_table_entry server_options_table[] = {
|
||||||
|
{ .name = "buffer-limit",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 1,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 9
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "escape-time",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 500
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "exit-unattached",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "quiet",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0 /* overridden in main() */
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Session options. */
|
||||||
|
const struct options_table_entry session_options_table[] = {
|
||||||
|
{ .name = "base-index",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "bell-action",
|
||||||
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
|
.choices = options_table_bell_action_list,
|
||||||
|
.default_num = BELL_ANY
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "default-command",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = ""
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "default-path",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = ""
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "default-shell",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = _PATH_BSHELL
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "default-terminal",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "screen"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "destroy-unattached",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "detach-on-destroy",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 1
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "display-panes-active-colour",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 1
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "display-panes-colour",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 4
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "display-panes-time",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 1,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 1000
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "display-time",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 1,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 750
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "history-limit",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = SHRT_MAX,
|
||||||
|
.default_num = 2000
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "lock-after-time",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "lock-command",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "lock -np"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "lock-server",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 1
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "message-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "message-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 3
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "message-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "message-limit",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 20
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "mouse-select-pane",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "pane-active-border-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "pane-active-border-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 2
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "pane-border-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "pane-border-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "prefix",
|
||||||
|
.type = OPTIONS_TABLE_KEYS,
|
||||||
|
/* set in main() */
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "repeat-time",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = SHRT_MAX,
|
||||||
|
.default_num = 500
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "set-remain-on-exit",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "set-titles",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "set-titles-string",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "#S:#I:#W - \"#T\""
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 1
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 2
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-interval",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 15
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-justify",
|
||||||
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
|
.choices = options_table_status_justify_list,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-keys",
|
||||||
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
|
.choices = options_table_status_keys_list,
|
||||||
|
.default_num = MODEKEY_EMACS
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-left",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "[#S]"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-left-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-left-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-left-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-left-length",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = SHRT_MAX,
|
||||||
|
.default_num = 10
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-right",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "\"#22T\" %H:%M %d-%b-%y"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-right-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-right-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-right-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-right-length",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = SHRT_MAX,
|
||||||
|
.default_num = 40
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "status-utf8",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0 /* overridden in main() */
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "terminal-overrides",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "*88col*:colors=88,*256col*:colors=256"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "update-environment",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
|
||||||
|
"SSH_CONNECTION WINDOWID XAUTHORITY"
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "visual-activity",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "visual-bell",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "visual-content",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "visual-silence",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Window options. */
|
||||||
|
const struct options_table_entry window_options_table[] = {
|
||||||
|
{ .name = "aggressive-resize",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "alternate-screen",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 1
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "automatic-rename",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 1
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "clock-mode-colour",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 4
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "clock-mode-style",
|
||||||
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
|
.choices = options_table_clock_mode_style_list,
|
||||||
|
.default_num = 1
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "force-height",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "force-width",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "main-pane-height",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 1,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 24
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "main-pane-width",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 1,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 80
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "mode-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "mode-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 3
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "mode-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "mode-keys",
|
||||||
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
|
.choices = options_table_mode_keys_list,
|
||||||
|
.default_num = MODEKEY_EMACS
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "mode-mouse",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "monitor-activity",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "monitor-content",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = ""
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "monitor-silence",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "other-pane-height",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "other-pane-width",
|
||||||
|
.type = OPTIONS_TABLE_NUMBER,
|
||||||
|
.minimum = 0,
|
||||||
|
.maximum = INT_MAX,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "remain-on-exit",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "synchronize-panes",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "utf8",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0 /* overridden in main() */
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-alert-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = GRID_ATTR_REVERSE
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-alert-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-alert-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-current-attr",
|
||||||
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-current-bg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-current-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-current-format",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "#I:#W#F"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-fg",
|
||||||
|
.type = OPTIONS_TABLE_COLOUR,
|
||||||
|
.default_num = 8
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "window-status-format",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = "#I:#W#F"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "word-separators",
|
||||||
|
.type = OPTIONS_TABLE_STRING,
|
||||||
|
.default_str = " -_@"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = "xterm-keys",
|
||||||
|
.type = OPTIONS_TABLE_FLAG,
|
||||||
|
.default_num = 0
|
||||||
|
},
|
||||||
|
|
||||||
|
{ .name = NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Populate an options tree from a table. */
|
||||||
|
void
|
||||||
|
options_table_populate_tree(
|
||||||
|
const struct options_table_entry *table, struct options *oo)
|
||||||
|
{
|
||||||
|
const struct options_table_entry *oe;
|
||||||
|
|
||||||
|
for (oe = table; oe->name != NULL; oe++) {
|
||||||
|
if (oe->default_str != NULL)
|
||||||
|
options_set_string(oo, oe->name, "%s", oe->default_str);
|
||||||
|
else
|
||||||
|
options_set_number(oo, oe->name, oe->default_num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print an option using its type from the table. */
|
||||||
|
const char *
|
||||||
|
options_table_print_entry(
|
||||||
|
const struct options_table_entry *oe, struct options_entry *o)
|
||||||
|
{
|
||||||
|
static char out[BUFSIZ];
|
||||||
|
const char *s;
|
||||||
|
struct keylist *keylist;
|
||||||
|
u_int i;
|
||||||
|
|
||||||
|
*out = '\0';
|
||||||
|
switch (oe->type) {
|
||||||
|
case OPTIONS_TABLE_STRING:
|
||||||
|
xsnprintf(out, sizeof out, "\"%s\"", o->str);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_NUMBER:
|
||||||
|
xsnprintf(out, sizeof out, "%lld", o->num);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_KEYS:
|
||||||
|
keylist = o->data;
|
||||||
|
for (i = 0; i < ARRAY_LENGTH(keylist); i++) {
|
||||||
|
s = key_string_lookup_key(ARRAY_ITEM(keylist, i));
|
||||||
|
strlcat(out, s, sizeof out);
|
||||||
|
if (i != ARRAY_LENGTH(keylist) - 1)
|
||||||
|
strlcat(out, ",", sizeof out);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_COLOUR:
|
||||||
|
s = colour_tostring(o->num);
|
||||||
|
xsnprintf(out, sizeof out, "%s", s);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_ATTRIBUTES:
|
||||||
|
s = attributes_tostring(o->num);
|
||||||
|
xsnprintf(out, sizeof out, "%s", s);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_FLAG:
|
||||||
|
if (o->num)
|
||||||
|
strlcpy(out, "on", sizeof out);
|
||||||
|
else
|
||||||
|
strlcpy(out, "off", sizeof out);
|
||||||
|
break;
|
||||||
|
case OPTIONS_TABLE_CHOICE:
|
||||||
|
s = oe->choices[o->num];
|
||||||
|
xsnprintf(out, sizeof out, "%s", s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (out);
|
||||||
|
}
|
32
status.c
32
status.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: status.c,v 1.152 2010-12-30 22:39:49 tcunha Exp $ */
|
/* $Id: status.c,v 1.153 2011-01-03 23:52:38 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -1125,12 +1125,12 @@ status_prompt_add_history(const char *line)
|
|||||||
char *
|
char *
|
||||||
status_prompt_complete(const char *s)
|
status_prompt_complete(const char *s)
|
||||||
{
|
{
|
||||||
const struct cmd_entry **cmdent;
|
const struct cmd_entry **cmdent;
|
||||||
const struct set_option_entry *entry;
|
const struct options_table_entry *oe;
|
||||||
ARRAY_DECL(, const char *) list;
|
ARRAY_DECL(, const char *) list;
|
||||||
char *prefix, *s2;
|
char *prefix, *s2;
|
||||||
u_int i;
|
u_int i;
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
||||||
if (*s == '\0')
|
if (*s == '\0')
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -1141,17 +1141,17 @@ status_prompt_complete(const char *s)
|
|||||||
if (strncmp((*cmdent)->name, s, strlen(s)) == 0)
|
if (strncmp((*cmdent)->name, s, strlen(s)) == 0)
|
||||||
ARRAY_ADD(&list, (*cmdent)->name);
|
ARRAY_ADD(&list, (*cmdent)->name);
|
||||||
}
|
}
|
||||||
for (entry = set_option_table; entry->name != NULL; entry++) {
|
for (oe = server_options_table; oe->name != NULL; oe++) {
|
||||||
if (strncmp(entry->name, s, strlen(s)) == 0)
|
if (strncmp(oe->name, s, strlen(s)) == 0)
|
||||||
ARRAY_ADD(&list, entry->name);
|
ARRAY_ADD(&list, oe->name);
|
||||||
}
|
}
|
||||||
for (entry = set_session_option_table; entry->name != NULL; entry++) {
|
for (oe = session_options_table; oe->name != NULL; oe++) {
|
||||||
if (strncmp(entry->name, s, strlen(s)) == 0)
|
if (strncmp(oe->name, s, strlen(s)) == 0)
|
||||||
ARRAY_ADD(&list, entry->name);
|
ARRAY_ADD(&list, oe->name);
|
||||||
}
|
}
|
||||||
for (entry = set_window_option_table; entry->name != NULL; entry++) {
|
for (oe = window_options_table; oe->name != NULL; oe++) {
|
||||||
if (strncmp(entry->name, s, strlen(s)) == 0)
|
if (strncmp(oe->name, s, strlen(s)) == 0)
|
||||||
ARRAY_ADD(&list, entry->name);
|
ARRAY_ADD(&list, oe->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If none, bail now. */
|
/* If none, bail now. */
|
||||||
|
127
tmux.c
127
tmux.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tmux.c,v 1.231 2010-12-31 22:12:33 nicm Exp $ */
|
/* $Id: tmux.c,v 1.232 2011-01-03 23:52:38 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -231,7 +231,6 @@ int
|
|||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
struct options *oo, *so, *wo;
|
|
||||||
struct keylist *keylist;
|
struct keylist *keylist;
|
||||||
char *s, *path, *label, *home, **var;
|
char *s, *path, *label, *home, **var;
|
||||||
int opt, flags, quiet, keys;
|
int opt, flags, quiet, keys;
|
||||||
@ -322,129 +321,39 @@ main(int argc, char **argv)
|
|||||||
environ_put(&global_environ, *var);
|
environ_put(&global_environ, *var);
|
||||||
|
|
||||||
options_init(&global_options, NULL);
|
options_init(&global_options, NULL);
|
||||||
oo = &global_options;
|
options_table_populate_tree(server_options_table, &global_options);
|
||||||
options_set_number(oo, "quiet", quiet);
|
options_set_number(&global_options, "quiet", quiet);
|
||||||
options_set_number(oo, "escape-time", 500);
|
|
||||||
options_set_number(oo, "exit-unattached", 0);
|
|
||||||
options_set_number(oo, "buffer-limit", 9);
|
|
||||||
|
|
||||||
options_init(&global_s_options, NULL);
|
options_init(&global_s_options, NULL);
|
||||||
so = &global_s_options;
|
options_table_populate_tree(session_options_table, &global_s_options);
|
||||||
options_set_number(so, "base-index", 0);
|
options_set_string(&global_s_options, "default-shell", "%s", getshell());
|
||||||
options_set_number(so, "bell-action", BELL_ANY);
|
|
||||||
options_set_string(so, "default-command", "%s", "");
|
|
||||||
options_set_string(so, "default-path", "%s", "");
|
|
||||||
options_set_string(so, "default-shell", "%s", getshell());
|
|
||||||
options_set_string(so, "default-terminal", "screen");
|
|
||||||
options_set_number(so, "destroy-unattached", 0);
|
|
||||||
options_set_number(so, "detach-on-destroy", 1);
|
|
||||||
options_set_number(so, "display-panes-active-colour", 1);
|
|
||||||
options_set_number(so, "display-panes-colour", 4);
|
|
||||||
options_set_number(so, "display-panes-time", 1000);
|
|
||||||
options_set_number(so, "display-time", 750);
|
|
||||||
options_set_number(so, "history-limit", 2000);
|
|
||||||
options_set_number(so, "lock-after-time", 0);
|
|
||||||
options_set_string(so, "lock-command", "lock -np");
|
|
||||||
options_set_number(so, "lock-server", 1);
|
|
||||||
options_set_number(so, "message-attr", 0);
|
|
||||||
options_set_number(so, "message-bg", 3);
|
|
||||||
options_set_number(so, "message-fg", 0);
|
|
||||||
options_set_number(so, "message-limit", 20);
|
|
||||||
options_set_number(so, "mouse-select-pane", 0);
|
|
||||||
options_set_number(so, "pane-active-border-bg", 8);
|
|
||||||
options_set_number(so, "pane-active-border-fg", 2);
|
|
||||||
options_set_number(so, "pane-border-bg", 8);
|
|
||||||
options_set_number(so, "pane-border-fg", 8);
|
|
||||||
options_set_number(so, "repeat-time", 500);
|
|
||||||
options_set_number(so, "set-remain-on-exit", 0);
|
|
||||||
options_set_number(so, "set-titles", 0);
|
|
||||||
options_set_string(so, "set-titles-string", "#S:#I:#W - \"#T\"");
|
|
||||||
options_set_number(so, "status", 1);
|
|
||||||
options_set_number(so, "status-attr", 0);
|
|
||||||
options_set_number(so, "status-bg", 2);
|
|
||||||
options_set_number(so, "status-fg", 0);
|
|
||||||
options_set_number(so, "status-interval", 15);
|
|
||||||
options_set_number(so, "status-justify", 0);
|
|
||||||
options_set_string(so, "status-left", "[#S]");
|
|
||||||
options_set_number(so, "status-left-attr", 0);
|
|
||||||
options_set_number(so, "status-left-bg", 8);
|
|
||||||
options_set_number(so, "status-left-fg", 8);
|
|
||||||
options_set_number(so, "status-left-length", 10);
|
|
||||||
options_set_string(so, "status-right", "\"#22T\" %%H:%%M %%d-%%b-%%y");
|
|
||||||
options_set_number(so, "status-right-attr", 0);
|
|
||||||
options_set_number(so, "status-right-bg", 8);
|
|
||||||
options_set_number(so, "status-right-fg", 8);
|
|
||||||
options_set_number(so, "status-right-length", 40);
|
|
||||||
options_set_string(so, "terminal-overrides",
|
|
||||||
"*88col*:colors=88,*256col*:colors=256");
|
|
||||||
options_set_string(so, "update-environment",
|
|
||||||
"DISPLAY "
|
|
||||||
"SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION "
|
|
||||||
"WINDOWID "
|
|
||||||
"XAUTHORITY");
|
|
||||||
options_set_number(so, "visual-activity", 0);
|
|
||||||
options_set_number(so, "visual-bell", 0);
|
|
||||||
options_set_number(so, "visual-content", 0);
|
|
||||||
options_set_number(so, "visual-silence", 0);
|
|
||||||
|
|
||||||
|
options_init(&global_w_options, NULL);
|
||||||
|
options_table_populate_tree(window_options_table, &global_w_options);
|
||||||
|
|
||||||
|
/* Set the prefix option (its a list, so not in the table). */
|
||||||
keylist = xmalloc(sizeof *keylist);
|
keylist = xmalloc(sizeof *keylist);
|
||||||
ARRAY_INIT(keylist);
|
ARRAY_INIT(keylist);
|
||||||
ARRAY_ADD(keylist, '\002');
|
ARRAY_ADD(keylist, '\002');
|
||||||
options_set_data(so, "prefix", keylist, xfree);
|
options_set_data(&global_s_options, "prefix", keylist, xfree);
|
||||||
|
|
||||||
options_init(&global_w_options, NULL);
|
|
||||||
wo = &global_w_options;
|
|
||||||
options_set_number(wo, "aggressive-resize", 0);
|
|
||||||
options_set_number(wo, "alternate-screen", 1);
|
|
||||||
options_set_number(wo, "automatic-rename", 1);
|
|
||||||
options_set_number(wo, "clock-mode-colour", 4);
|
|
||||||
options_set_number(wo, "clock-mode-style", 1);
|
|
||||||
options_set_number(wo, "force-height", 0);
|
|
||||||
options_set_number(wo, "force-width", 0);
|
|
||||||
options_set_number(wo, "main-pane-height", 24);
|
|
||||||
options_set_number(wo, "main-pane-width", 80);
|
|
||||||
options_set_number(wo, "mode-attr", 0);
|
|
||||||
options_set_number(wo, "mode-bg", 3);
|
|
||||||
options_set_number(wo, "mode-fg", 0);
|
|
||||||
options_set_number(wo, "mode-mouse", 0);
|
|
||||||
options_set_number(wo, "monitor-activity", 0);
|
|
||||||
options_set_string(wo, "monitor-content", "%s", "");
|
|
||||||
options_set_number(wo, "monitor-silence", 0);
|
|
||||||
options_set_number(wo, "other-pane-height", 0);
|
|
||||||
options_set_number(wo, "other-pane-width", 0);
|
|
||||||
options_set_number(wo, "window-status-attr", 0);
|
|
||||||
options_set_number(wo, "window-status-bg", 8);
|
|
||||||
options_set_number(wo, "window-status-current-attr", 0);
|
|
||||||
options_set_number(wo, "window-status-current-bg", 8);
|
|
||||||
options_set_number(wo, "window-status-current-fg", 8);
|
|
||||||
options_set_number(wo, "window-status-fg", 8);
|
|
||||||
options_set_number(wo, "window-status-alert-attr", GRID_ATTR_REVERSE);
|
|
||||||
options_set_number(wo, "window-status-alert-bg", 8);
|
|
||||||
options_set_number(wo, "window-status-alert-fg", 8);
|
|
||||||
options_set_string(wo, "window-status-format", "#I:#W#F");
|
|
||||||
options_set_string(wo, "window-status-current-format", "#I:#W#F");
|
|
||||||
options_set_string(wo, "word-separators", " -_@");
|
|
||||||
options_set_number(wo, "xterm-keys", 0);
|
|
||||||
options_set_number(wo, "remain-on-exit", 0);
|
|
||||||
options_set_number(wo, "synchronize-panes", 0);
|
|
||||||
|
|
||||||
|
/* Enable UTF-8 if the first client is on UTF-8 terminal. */
|
||||||
if (flags & IDENTIFY_UTF8) {
|
if (flags & IDENTIFY_UTF8) {
|
||||||
options_set_number(so, "status-utf8", 1);
|
options_set_number(&global_s_options, "status-utf8", 1);
|
||||||
options_set_number(wo, "utf8", 1);
|
options_set_number(&global_w_options, "utf8", 1);
|
||||||
} else {
|
|
||||||
options_set_number(so, "status-utf8", 0);
|
|
||||||
options_set_number(wo, "utf8", 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
keys = MODEKEY_EMACS;
|
/* Override keys to vi if VISUAL or EDITOR are set. */
|
||||||
if ((s = getenv("VISUAL")) != NULL || (s = getenv("EDITOR")) != NULL) {
|
if ((s = getenv("VISUAL")) != NULL || (s = getenv("EDITOR")) != NULL) {
|
||||||
if (strrchr(s, '/') != NULL)
|
if (strrchr(s, '/') != NULL)
|
||||||
s = strrchr(s, '/') + 1;
|
s = strrchr(s, '/') + 1;
|
||||||
if (strstr(s, "vi") != NULL)
|
if (strstr(s, "vi") != NULL)
|
||||||
keys = MODEKEY_VI;
|
keys = MODEKEY_VI;
|
||||||
|
else
|
||||||
|
keys = MODEKEY_EMACS;
|
||||||
|
options_set_number(&global_s_options, "status-keys", keys);
|
||||||
|
options_set_number(&global_w_options, "mode-keys", keys);
|
||||||
}
|
}
|
||||||
options_set_number(so, "status-keys", keys);
|
|
||||||
options_set_number(wo, "mode-keys", keys);
|
|
||||||
|
|
||||||
/* Locate the configuration file. */
|
/* Locate the configuration file. */
|
||||||
if (cfg_file == NULL) {
|
if (cfg_file == NULL) {
|
||||||
|
56
tmux.h
56
tmux.h
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tmux.h,v 1.599 2011-01-03 23:31:26 tcunha Exp $ */
|
/* $Id: tmux.h,v 1.600 2011-01-03 23:52:38 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -1266,23 +1266,31 @@ struct key_binding {
|
|||||||
};
|
};
|
||||||
SPLAY_HEAD(key_bindings, key_binding);
|
SPLAY_HEAD(key_bindings, key_binding);
|
||||||
|
|
||||||
/* Set/display option data. */
|
/*
|
||||||
struct set_option_entry {
|
* Option table entries. The option table is the user-visible part of the
|
||||||
const char *name;
|
* option, as opposed to the internal options (struct option) which are just
|
||||||
enum {
|
* number or string.
|
||||||
SET_OPTION_STRING,
|
*/
|
||||||
SET_OPTION_NUMBER,
|
enum options_table_type {
|
||||||
SET_OPTION_KEYS,
|
OPTIONS_TABLE_STRING,
|
||||||
SET_OPTION_COLOUR,
|
OPTIONS_TABLE_NUMBER,
|
||||||
SET_OPTION_ATTRIBUTES,
|
OPTIONS_TABLE_KEYS,
|
||||||
SET_OPTION_FLAG,
|
OPTIONS_TABLE_COLOUR,
|
||||||
SET_OPTION_CHOICE
|
OPTIONS_TABLE_ATTRIBUTES,
|
||||||
} type;
|
OPTIONS_TABLE_FLAG,
|
||||||
|
OPTIONS_TABLE_CHOICE
|
||||||
|
};
|
||||||
|
|
||||||
u_int minimum;
|
struct options_table_entry {
|
||||||
u_int maximum;
|
const char *name;
|
||||||
|
enum options_table_type type;
|
||||||
|
|
||||||
const char **choices;
|
u_int minimum;
|
||||||
|
u_int maximum;
|
||||||
|
const char **choices;
|
||||||
|
|
||||||
|
const char *default_str;
|
||||||
|
long long default_num;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* List of configuration causes. */
|
/* List of configuration causes. */
|
||||||
@ -1352,6 +1360,15 @@ struct options_entry *options_set_data(
|
|||||||
struct options *, const char *, void *, void (*)(void *));
|
struct options *, const char *, void *, void (*)(void *));
|
||||||
void *options_get_data(struct options *, const char *);
|
void *options_get_data(struct options *, const char *);
|
||||||
|
|
||||||
|
/* options-table.c */
|
||||||
|
extern const struct options_table_entry server_options_table[];
|
||||||
|
extern const struct options_table_entry session_options_table[];
|
||||||
|
extern const struct options_table_entry window_options_table[];
|
||||||
|
void options_table_populate_tree(
|
||||||
|
const struct options_table_entry *, struct options *);
|
||||||
|
const char *options_table_print_entry(
|
||||||
|
const struct options_table_entry *, struct options_entry *);
|
||||||
|
|
||||||
/* job.c */
|
/* job.c */
|
||||||
extern struct joblist all_jobs;
|
extern struct joblist all_jobs;
|
||||||
int job_cmp(struct job *, struct job *);
|
int job_cmp(struct job *, struct job *);
|
||||||
@ -1457,13 +1474,6 @@ char *paste_print(struct paste_buffer *, size_t);
|
|||||||
extern const char clock_table[14][5][5];
|
extern const char clock_table[14][5][5];
|
||||||
void clock_draw(struct screen_write_ctx *, int, int);
|
void clock_draw(struct screen_write_ctx *, int, int);
|
||||||
|
|
||||||
/* cmd-set-option.c */
|
|
||||||
extern const struct set_option_entry set_option_table[];
|
|
||||||
extern const struct set_option_entry set_session_option_table[];
|
|
||||||
extern const struct set_option_entry set_window_option_table[];
|
|
||||||
const char *cmd_set_option_print(
|
|
||||||
const struct set_option_entry *, struct options_entry *);
|
|
||||||
|
|
||||||
/* cmd.c */
|
/* cmd.c */
|
||||||
int cmd_pack_argv(int, char **, char *, size_t);
|
int cmd_pack_argv(int, char **, char *, size_t);
|
||||||
int cmd_unpack_argv(char *, size_t, int, char ***);
|
int cmd_unpack_argv(char *, size_t, int, char ***);
|
||||||
|
Loading…
Reference in New Issue
Block a user