summaryrefslogtreecommitdiffstats
path: root/options-table.c
Side-by-side diff
Diffstat (limited to 'options-table.c') (more/less context) (ignore whitespace changes)
-rw-r--r--options-table.c643
1 files changed, 643 insertions, 0 deletions
diff --git a/options-table.c b/options-table.c
new file mode 100644
index 0000000..96ffd28
--- a/dev/null
+++ b/options-table.c
@@ -0,0 +1,643 @@
+/* $Id: options-table.c,v 1.4 2011/01/21 23:54:19 tcunha Exp $ */
+
+/*
+ * Copyright (c) 2011 Nicholas Marriott <[email protected]>
+ *
+ * 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 "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 = INT_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 = "mouse-utf8",
+ .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 = " [email protected]"
+ },
+
+ { .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);
+}