2009-06-01 22:58:49 +00:00
|
|
|
/* $OpenBSD$ */
|
|
|
|
|
|
|
|
/*
|
2016-01-19 15:59:12 +00:00
|
|
|
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
|
2009-06-01 22:58:49 +00:00
|
|
|
*
|
|
|
|
* 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 <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "tmux.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set an option.
|
|
|
|
*/
|
|
|
|
|
2016-10-16 19:04:05 +00:00
|
|
|
static enum cmd_retval cmd_set_option_exec(struct cmd *, struct cmdq_item *);
|
2013-03-21 16:17:01 +00:00
|
|
|
|
2016-10-16 19:04:05 +00:00
|
|
|
static enum cmd_retval cmd_set_option_user(struct cmd *, struct cmdq_item *,
|
|
|
|
const char *, const char *);
|
2009-06-01 22:58:49 +00:00
|
|
|
|
2016-10-16 19:04:05 +00:00
|
|
|
static int cmd_set_option_unset(struct cmd *, struct cmdq_item *,
|
2016-10-10 21:51:39 +00:00
|
|
|
const struct options_table_entry *, struct options *,
|
|
|
|
const char *);
|
2016-10-16 19:04:05 +00:00
|
|
|
static int cmd_set_option_set(struct cmd *, struct cmdq_item *,
|
2016-10-10 21:51:39 +00:00
|
|
|
const struct options_table_entry *, struct options *,
|
|
|
|
const char *);
|
2011-01-01 16:51:21 +00:00
|
|
|
|
2016-10-16 19:04:05 +00:00
|
|
|
static struct options_entry *cmd_set_option_string(struct cmd *,
|
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
|
|
|
struct options *, const char *);
|
|
|
|
static struct options_entry *cmd_set_option_number(struct cmd *,
|
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
|
|
|
struct options *, const char *);
|
|
|
|
static struct options_entry *cmd_set_option_key(struct cmd *,
|
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
|
|
|
struct options *, const char *);
|
|
|
|
static struct options_entry *cmd_set_option_colour(struct cmd *,
|
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
|
|
|
struct options *, const char *);
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *cmd_set_option_attributes(struct cmd *,
|
2016-10-16 19:04:05 +00:00
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
|
|
|
struct options *, const char *);
|
|
|
|
static struct options_entry *cmd_set_option_flag(struct cmd *,
|
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
|
|
|
struct options *, const char *);
|
|
|
|
static struct options_entry *cmd_set_option_choice(struct cmd *,
|
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
|
|
|
struct options *, const char *);
|
|
|
|
static struct options_entry *cmd_set_option_style(struct cmd *,
|
|
|
|
struct cmdq_item *, const struct options_table_entry *,
|
2016-10-10 21:51:39 +00:00
|
|
|
struct options *, const char *);
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2009-06-01 22:58:49 +00:00
|
|
|
const struct cmd_entry cmd_set_option_entry = {
|
2015-12-13 21:53:57 +00:00
|
|
|
.name = "set-option",
|
|
|
|
.alias = "set",
|
|
|
|
|
|
|
|
.args = { "agoqst:uw", 1, 2 },
|
|
|
|
.usage = "[-agosquw] [-t target-window] option [value]",
|
|
|
|
|
2015-12-14 00:31:54 +00:00
|
|
|
.tflag = CMD_WINDOW_CANFAIL,
|
|
|
|
|
2016-10-14 22:14:22 +00:00
|
|
|
.flags = CMD_AFTERHOOK,
|
2015-12-13 21:53:57 +00:00
|
|
|
.exec = cmd_set_option_exec
|
2009-06-01 22:58:49 +00:00
|
|
|
};
|
|
|
|
|
2011-01-04 02:03:41 +00:00
|
|
|
const struct cmd_entry cmd_set_window_option_entry = {
|
2015-12-13 21:53:57 +00:00
|
|
|
.name = "set-window-option",
|
|
|
|
.alias = "setw",
|
|
|
|
|
|
|
|
.args = { "agoqt:u", 1, 2 },
|
|
|
|
.usage = "[-agoqu] " CMD_TARGET_WINDOW_USAGE " option [value]",
|
|
|
|
|
2015-12-14 00:31:54 +00:00
|
|
|
.tflag = CMD_WINDOW_CANFAIL,
|
|
|
|
|
2016-10-14 22:14:22 +00:00
|
|
|
.flags = CMD_AFTERHOOK,
|
2015-12-13 21:53:57 +00:00
|
|
|
.exec = cmd_set_option_exec
|
2011-01-04 02:03:41 +00:00
|
|
|
};
|
|
|
|
|
2016-10-10 21:51:39 +00:00
|
|
|
static enum cmd_retval
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
|
2009-06-01 22:58:49 +00:00
|
|
|
{
|
2011-01-04 00:42:46 +00:00
|
|
|
struct args *args = self->args;
|
2016-10-16 19:04:05 +00:00
|
|
|
struct session *s = item->state.tflag.s;
|
|
|
|
struct winlink *wl = item->state.tflag.wl;
|
2015-12-13 14:32:38 +00:00
|
|
|
struct window *w;
|
2011-01-01 16:51:21 +00:00
|
|
|
struct client *c;
|
2015-12-13 14:32:38 +00:00
|
|
|
const struct options_table_entry *oe;
|
2011-01-01 16:51:21 +00:00
|
|
|
struct options *oo;
|
2016-03-03 14:15:22 +00:00
|
|
|
const char *optstr, *valstr, *target;
|
2011-01-01 16:51:21 +00:00
|
|
|
|
2011-03-29 21:09:13 +00:00
|
|
|
/* Get the option name and value. */
|
|
|
|
optstr = args->argv[0];
|
|
|
|
if (*optstr == '\0') {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "invalid option");
|
2012-07-11 07:10:15 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
2011-03-29 21:09:13 +00:00
|
|
|
}
|
|
|
|
if (args->argc < 2)
|
|
|
|
valstr = NULL;
|
|
|
|
else
|
|
|
|
valstr = args->argv[1];
|
|
|
|
|
2013-03-21 16:17:01 +00:00
|
|
|
/* Is this a user option? */
|
|
|
|
if (*optstr == '@')
|
2016-10-16 19:04:05 +00:00
|
|
|
return (cmd_set_option_user(self, item, optstr, valstr));
|
2013-03-21 16:17:01 +00:00
|
|
|
|
2017-01-11 14:56:44 +00:00
|
|
|
/* Find the option entry. */
|
2015-11-20 12:01:19 +00:00
|
|
|
oe = NULL;
|
|
|
|
if (options_table_find(optstr, &oe) != 0) {
|
2015-07-27 08:45:45 +00:00
|
|
|
if (!args_has(args, 'q')) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "ambiguous option: %s", optstr);
|
2015-07-27 08:45:45 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
}
|
|
|
|
return (CMD_RETURN_NORMAL);
|
2011-03-29 21:09:13 +00:00
|
|
|
}
|
|
|
|
if (oe == NULL) {
|
2014-04-17 07:51:38 +00:00
|
|
|
if (!args_has(args, 'q')) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "unknown option: %s", optstr);
|
2014-04-17 07:51:38 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
}
|
|
|
|
return (CMD_RETURN_NORMAL);
|
2011-03-29 21:09:13 +00:00
|
|
|
}
|
|
|
|
|
2015-11-20 12:01:19 +00:00
|
|
|
/* Work out the tree from the scope of the option. */
|
|
|
|
if (oe->scope == OPTIONS_TABLE_SERVER)
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = global_options;
|
2015-11-20 12:01:19 +00:00
|
|
|
else if (oe->scope == OPTIONS_TABLE_WINDOW) {
|
2011-01-04 00:42:46 +00:00
|
|
|
if (args_has(self->args, 'g'))
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = global_w_options;
|
2016-03-03 14:15:22 +00:00
|
|
|
else if (wl == NULL) {
|
|
|
|
target = args_get(args, 't');
|
|
|
|
if (target != NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no such window: %s",
|
2016-03-03 14:15:22 +00:00
|
|
|
target);
|
|
|
|
} else
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no current window");
|
2016-03-03 14:15:22 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
} else
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = wl->window->options;
|
2015-11-20 12:01:19 +00:00
|
|
|
} else if (oe->scope == OPTIONS_TABLE_SESSION) {
|
2011-01-04 00:42:46 +00:00
|
|
|
if (args_has(self->args, 'g'))
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = global_s_options;
|
2016-03-03 14:15:22 +00:00
|
|
|
else if (s == NULL) {
|
|
|
|
target = args_get(args, 't');
|
|
|
|
if (target != NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no such session: %s",
|
2016-03-03 14:15:22 +00:00
|
|
|
target);
|
|
|
|
} else
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no current session");
|
2016-03-03 14:15:22 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
} else
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = s->options;
|
2011-03-29 21:09:13 +00:00
|
|
|
} else {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "unknown table");
|
2012-07-11 07:10:15 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
2009-06-01 22:58:49 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Unset or set the option. */
|
2011-01-04 00:42:46 +00:00
|
|
|
if (args_has(args, 'u')) {
|
2016-10-16 19:04:05 +00:00
|
|
|
if (cmd_set_option_unset(self, item, oe, oo, valstr) != 0)
|
2012-07-11 07:10:15 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
2009-06-01 22:58:49 +00:00
|
|
|
} else {
|
2013-03-24 09:55:02 +00:00
|
|
|
if (args_has(args, 'o') && options_find1(oo, optstr) != NULL) {
|
2014-04-17 07:51:38 +00:00
|
|
|
if (!args_has(args, 'q')) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "already set: %s", optstr);
|
2014-04-17 07:51:38 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
}
|
2013-03-24 09:55:02 +00:00
|
|
|
return (CMD_RETURN_NORMAL);
|
|
|
|
}
|
2016-10-16 19:04:05 +00:00
|
|
|
if (cmd_set_option_set(self, item, oe, oo, valstr) != 0)
|
2012-07-11 07:10:15 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
2009-06-01 22:58:49 +00:00
|
|
|
}
|
|
|
|
|
2017-01-11 14:56:44 +00:00
|
|
|
/* Update timers and so on for various options. */
|
2014-02-14 13:59:01 +00:00
|
|
|
if (strcmp(oe->name, "automatic-rename") == 0) {
|
2015-04-22 15:30:11 +00:00
|
|
|
RB_FOREACH(w, windows, &windows) {
|
2016-11-04 18:56:25 +00:00
|
|
|
if (w->active == NULL)
|
|
|
|
continue;
|
2015-10-27 15:58:42 +00:00
|
|
|
if (options_get_number(w->options, "automatic-rename"))
|
2015-08-29 00:29:15 +00:00
|
|
|
w->active->flags |= PANE_CHANGED;
|
2012-04-08 06:47:26 +00:00
|
|
|
}
|
|
|
|
}
|
2015-12-12 18:32:24 +00:00
|
|
|
if (strcmp(oe->name, "key-table") == 0) {
|
|
|
|
TAILQ_FOREACH(c, &clients, entry)
|
|
|
|
server_client_set_key_table(c, NULL);
|
|
|
|
}
|
2015-08-28 12:16:28 +00:00
|
|
|
if (strcmp(oe->name, "status") == 0 ||
|
|
|
|
strcmp(oe->name, "status-interval") == 0)
|
|
|
|
status_timer_start_all();
|
2015-08-29 08:30:54 +00:00
|
|
|
if (strcmp(oe->name, "monitor-silence") == 0)
|
|
|
|
alerts_reset_all();
|
2016-05-30 09:50:20 +00:00
|
|
|
if (strcmp(oe->name, "window-style") == 0 ||
|
|
|
|
strcmp(oe->name, "window-active-style") == 0) {
|
|
|
|
RB_FOREACH(w, windows, &windows)
|
|
|
|
w->flags |= WINDOW_STYLECHANGED;
|
|
|
|
}
|
2016-04-29 15:00:48 +00:00
|
|
|
if (strcmp(oe->name, "pane-border-status") == 0) {
|
|
|
|
RB_FOREACH(w, windows, &windows)
|
|
|
|
layout_fix_panes(w, w->sx, w->sy);
|
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Update sizes and redraw. May not need it but meh. */
|
2009-06-01 22:58:49 +00:00
|
|
|
recalculate_sizes();
|
2015-04-24 23:17:11 +00:00
|
|
|
TAILQ_FOREACH(c, &clients, entry) {
|
|
|
|
if (c->session != NULL)
|
2009-12-03 17:44:02 +00:00
|
|
|
server_redraw_client(c);
|
|
|
|
}
|
2009-11-01 23:20:37 +00:00
|
|
|
|
2012-07-11 07:10:15 +00:00
|
|
|
return (CMD_RETURN_NORMAL);
|
2009-06-01 22:58:49 +00:00
|
|
|
}
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2013-03-21 16:17:01 +00:00
|
|
|
/* Set user option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static enum cmd_retval
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_user(struct cmd *self, struct cmdq_item *item,
|
|
|
|
const char *optstr, const char *valstr)
|
2013-03-21 16:17:01 +00:00
|
|
|
{
|
2016-09-26 09:02:34 +00:00
|
|
|
struct args *args = self->args;
|
2016-10-16 19:04:05 +00:00
|
|
|
struct session *s = item->state.tflag.s;
|
|
|
|
struct winlink *wl = item->state.tflag.wl;
|
2016-09-26 09:02:34 +00:00
|
|
|
struct options *oo;
|
|
|
|
struct options_entry *o;
|
2016-10-09 07:58:35 +00:00
|
|
|
const char *target;
|
2013-03-21 16:17:01 +00:00
|
|
|
|
|
|
|
if (args_has(args, 's'))
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = global_options;
|
2013-03-21 16:17:01 +00:00
|
|
|
else if (args_has(self->args, 'w') ||
|
|
|
|
self->entry == &cmd_set_window_option_entry) {
|
|
|
|
if (args_has(self->args, 'g'))
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = global_w_options;
|
2016-10-09 07:58:35 +00:00
|
|
|
else if (wl == NULL) {
|
|
|
|
target = args_get(args, 't');
|
|
|
|
if (target != NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no such window: %s",
|
2016-10-09 07:58:35 +00:00
|
|
|
target);
|
|
|
|
} else
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no current window");
|
2016-10-09 07:58:35 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
} else
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = wl->window->options;
|
2013-03-21 16:17:01 +00:00
|
|
|
} else {
|
|
|
|
if (args_has(self->args, 'g'))
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = global_s_options;
|
2016-10-09 07:58:35 +00:00
|
|
|
else if (s == NULL) {
|
|
|
|
target = args_get(args, 't');
|
|
|
|
if (target != NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no such session: %s",
|
2016-10-09 07:58:35 +00:00
|
|
|
target);
|
|
|
|
} else
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "no current session");
|
2016-10-09 07:58:35 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
} else
|
2015-10-27 15:58:42 +00:00
|
|
|
oo = s->options;
|
2013-03-21 16:17:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (args_has(args, 'u')) {
|
|
|
|
if (options_find1(oo, optstr) == NULL) {
|
2014-04-17 07:51:38 +00:00
|
|
|
if (!args_has(args, 'q')) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "unknown option: %s", optstr);
|
2014-04-17 07:51:38 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
}
|
|
|
|
return (CMD_RETURN_NORMAL);
|
2013-03-21 16:17:01 +00:00
|
|
|
}
|
|
|
|
if (valstr != NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "value passed to unset option: %s",
|
2013-03-21 16:17:01 +00:00
|
|
|
optstr);
|
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
}
|
|
|
|
options_remove(oo, optstr);
|
|
|
|
} else {
|
2016-09-26 09:02:34 +00:00
|
|
|
o = options_find1(oo, optstr);
|
|
|
|
if (args_has(args, 'o') && o != NULL) {
|
2014-04-17 07:51:38 +00:00
|
|
|
if (!args_has(args, 'q')) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "already set: %s", optstr);
|
2014-09-01 21:50:18 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
2014-04-17 07:51:38 +00:00
|
|
|
}
|
2013-03-24 09:55:02 +00:00
|
|
|
return (CMD_RETURN_NORMAL);
|
|
|
|
}
|
2016-09-26 09:02:34 +00:00
|
|
|
if (valstr == NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "empty value");
|
2016-09-26 09:02:34 +00:00
|
|
|
return (CMD_RETURN_ERROR);
|
|
|
|
}
|
2017-01-12 15:36:35 +00:00
|
|
|
options_set_string(oo, optstr, args_has(args, 'a'), "%s",
|
|
|
|
valstr);
|
2013-03-21 16:17:01 +00:00
|
|
|
}
|
|
|
|
return (CMD_RETURN_NORMAL);
|
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Unset an option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static int
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_unset(struct cmd *self, struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
2011-01-04 00:42:46 +00:00
|
|
|
struct args *args = self->args;
|
2011-01-01 16:51:21 +00:00
|
|
|
|
2011-01-04 00:42:46 +00:00
|
|
|
if (value != NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "value passed to unset option: %s", oe->name);
|
2011-01-01 16:51:21 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
2015-10-27 15:58:42 +00:00
|
|
|
if (args_has(args, 'g') || oo == global_options) {
|
2015-06-04 14:29:33 +00:00
|
|
|
switch (oe->type) {
|
|
|
|
case OPTIONS_TABLE_STRING:
|
2017-01-12 15:36:35 +00:00
|
|
|
options_set_string(oo, oe->name, 0, "%s",
|
|
|
|
oe->default_str);
|
2015-06-04 14:29:33 +00:00
|
|
|
break;
|
|
|
|
case OPTIONS_TABLE_STYLE:
|
2017-01-12 15:36:35 +00:00
|
|
|
options_set_style(oo, oe->name, 0, oe->default_str);
|
2015-06-04 14:29:33 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
options_set_number(oo, oe->name, oe->default_num);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
options_remove(oo, oe->name);
|
2011-01-01 16:51:21 +00:00
|
|
|
return (0);
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Set an option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static int
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_set(struct cmd *self, struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
|
|
|
struct options_entry *o;
|
|
|
|
|
2015-04-24 21:38:18 +00:00
|
|
|
switch (oe->type) {
|
|
|
|
case OPTIONS_TABLE_FLAG:
|
|
|
|
case OPTIONS_TABLE_CHOICE:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (value == NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "empty value");
|
2015-04-24 21:38:18 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
o = NULL;
|
|
|
|
switch (oe->type) {
|
|
|
|
case OPTIONS_TABLE_STRING:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_string(self, item, oe, oo, value);
|
2011-01-01 16:51:21 +00:00
|
|
|
break;
|
|
|
|
case OPTIONS_TABLE_NUMBER:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_number(self, item, oe, oo, value);
|
2011-01-01 16:51:21 +00:00
|
|
|
break;
|
2012-01-21 08:40:09 +00:00
|
|
|
case OPTIONS_TABLE_KEY:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_key(self, item, oe, oo, value);
|
2011-01-01 16:51:21 +00:00
|
|
|
break;
|
|
|
|
case OPTIONS_TABLE_COLOUR:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_colour(self, item, oe, oo, value);
|
2014-02-17 18:12:47 +00:00
|
|
|
if (o != NULL)
|
|
|
|
style_update_new(oo, o->name, oe->style);
|
2011-01-01 16:51:21 +00:00
|
|
|
break;
|
|
|
|
case OPTIONS_TABLE_ATTRIBUTES:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_attributes(self, item, oe, oo, value);
|
2014-02-17 18:12:47 +00:00
|
|
|
if (o != NULL)
|
|
|
|
style_update_new(oo, o->name, oe->style);
|
2011-01-01 16:51:21 +00:00
|
|
|
break;
|
|
|
|
case OPTIONS_TABLE_FLAG:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_flag(self, item, oe, oo, value);
|
2011-01-01 16:51:21 +00:00
|
|
|
break;
|
|
|
|
case OPTIONS_TABLE_CHOICE:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_choice(self, item, oe, oo, value);
|
2011-01-01 16:51:21 +00:00
|
|
|
break;
|
2014-01-28 23:07:09 +00:00
|
|
|
case OPTIONS_TABLE_STYLE:
|
2016-10-16 19:04:05 +00:00
|
|
|
o = cmd_set_option_style(self, item, oe, oo, value);
|
2014-01-28 23:07:09 +00:00
|
|
|
break;
|
2011-01-01 16:51:21 +00:00
|
|
|
}
|
|
|
|
if (o == NULL)
|
|
|
|
return (-1);
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set a string option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_string(struct cmd *self, __unused struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2011-01-01 16:51:21 +00:00
|
|
|
{
|
2017-01-12 15:36:35 +00:00
|
|
|
struct args *args = self->args;
|
|
|
|
int append = args_has(args, 'a');
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2017-01-12 15:36:35 +00:00
|
|
|
return (options_set_string(oo, oe->name, append, "%s", value));
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Set a number option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_number(__unused struct cmd *self, struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
2011-01-04 00:42:46 +00:00
|
|
|
long long ll;
|
|
|
|
const char *errstr;
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2011-01-04 00:42:46 +00:00
|
|
|
ll = strtonum(value, oe->minimum, oe->maximum, &errstr);
|
2009-12-03 17:44:02 +00:00
|
|
|
if (errstr != NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "value is %s: %s", errstr, value);
|
2011-01-01 16:51:21 +00:00
|
|
|
return (NULL);
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
return (options_set_number(oo, oe->name, ll));
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2012-01-21 08:40:09 +00:00
|
|
|
/* Set a key option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_key(__unused struct cmd *self, struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
2015-11-12 11:05:34 +00:00
|
|
|
key_code key;
|
2012-01-21 08:40:09 +00:00
|
|
|
|
2015-12-12 18:19:00 +00:00
|
|
|
key = key_string_lookup_string(value);
|
|
|
|
if (key == KEYC_UNKNOWN) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "bad key: %s", value);
|
2012-01-21 08:40:09 +00:00
|
|
|
return (NULL);
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2012-01-21 08:40:09 +00:00
|
|
|
return (options_set_number(oo, oe->name, key));
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Set a colour option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_colour(__unused struct cmd *self, struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
2011-01-04 00:42:46 +00:00
|
|
|
int colour;
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2011-01-04 00:42:46 +00:00
|
|
|
if ((colour = colour_fromstring(value)) == -1) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "bad colour: %s", value);
|
2011-01-01 16:51:21 +00:00
|
|
|
return (NULL);
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
return (options_set_number(oo, oe->name, colour));
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Set an attributes option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_attributes(__unused struct cmd *self, struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
2011-01-04 00:42:46 +00:00
|
|
|
int attr;
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2011-01-04 00:42:46 +00:00
|
|
|
if ((attr = attributes_fromstring(value)) == -1) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "bad attributes: %s", value);
|
2011-01-01 16:51:21 +00:00
|
|
|
return (NULL);
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
return (options_set_number(oo, oe->name, attr));
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Set a flag option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_flag(__unused struct cmd *self, struct cmdq_item *item,
|
2014-04-17 14:45:49 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
2011-01-04 00:42:46 +00:00
|
|
|
int flag;
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2011-01-04 00:42:46 +00:00
|
|
|
if (value == NULL || *value == '\0')
|
2011-01-01 16:51:21 +00:00
|
|
|
flag = !options_get_number(oo, oe->name);
|
2009-12-03 17:44:02 +00:00
|
|
|
else {
|
2011-01-04 00:42:46 +00:00
|
|
|
if ((value[0] == '1' && value[1] == '\0') ||
|
|
|
|
strcasecmp(value, "on") == 0 ||
|
|
|
|
strcasecmp(value, "yes") == 0)
|
2009-12-03 17:44:02 +00:00
|
|
|
flag = 1;
|
2011-01-04 00:42:46 +00:00
|
|
|
else if ((value[0] == '0' && value[1] == '\0') ||
|
|
|
|
strcasecmp(value, "off") == 0 ||
|
|
|
|
strcasecmp(value, "no") == 0)
|
2009-12-03 17:44:02 +00:00
|
|
|
flag = 0;
|
|
|
|
else {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "bad value: %s", value);
|
2011-01-01 16:51:21 +00:00
|
|
|
return (NULL);
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
return (options_set_number(oo, oe->name, flag));
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
/* Set a choice option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_choice(__unused struct cmd *self, struct cmdq_item *item,
|
2013-03-24 09:55:02 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
2009-12-03 17:44:02 +00:00
|
|
|
{
|
2011-01-04 00:42:46 +00:00
|
|
|
const char **choicep;
|
|
|
|
int n, choice = -1;
|
2009-12-03 17:44:02 +00:00
|
|
|
|
2015-04-24 21:38:18 +00:00
|
|
|
if (value == NULL) {
|
|
|
|
choice = options_get_number(oo, oe->name);
|
|
|
|
if (choice < 2)
|
|
|
|
choice = !choice;
|
|
|
|
} else {
|
|
|
|
n = 0;
|
|
|
|
for (choicep = oe->choices; *choicep != NULL; choicep++) {
|
|
|
|
n++;
|
|
|
|
if (strncmp(*choicep, value, strlen(value)) != 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (choice != -1) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "ambiguous value: %s", value);
|
2015-04-24 21:38:18 +00:00
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
choice = n - 1;
|
|
|
|
}
|
|
|
|
if (choice == -1) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "unknown value: %s", value);
|
2011-01-01 16:51:21 +00:00
|
|
|
return (NULL);
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-01 16:51:21 +00:00
|
|
|
return (options_set_number(oo, oe->name, choice));
|
2009-12-03 17:44:02 +00:00
|
|
|
}
|
2014-01-28 23:07:09 +00:00
|
|
|
|
|
|
|
/* Set a style option. */
|
2016-10-10 21:51:39 +00:00
|
|
|
static struct options_entry *
|
2016-10-16 19:04:05 +00:00
|
|
|
cmd_set_option_style(struct cmd *self, struct cmdq_item *item,
|
2014-01-28 23:07:09 +00:00
|
|
|
const struct options_table_entry *oe, struct options *oo,
|
|
|
|
const char *value)
|
|
|
|
{
|
|
|
|
struct args *args = self->args;
|
2017-01-12 15:36:35 +00:00
|
|
|
int append = args_has(args, 'a');
|
2014-01-28 23:07:09 +00:00
|
|
|
struct options_entry *o;
|
|
|
|
|
2017-01-12 15:36:35 +00:00
|
|
|
if ((o = options_set_style(oo, oe->name, append, value)) == NULL) {
|
2016-10-16 19:04:05 +00:00
|
|
|
cmdq_error(item, "bad style: %s", value);
|
2014-01-28 23:07:09 +00:00
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
style_update_old(oo, oe->name, &o->style);
|
|
|
|
return (o);
|
|
|
|
}
|