4 * Copyright (c) 2011 Nicholas Marriott <nicm@users.sourceforge.net>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
27 * This file has a tables with all the server, session and window
28 * options. These tables are the master copy of the options with their real
29 * (user-visible) types, range limits and default values. At start these are
30 * copied into the runtime global options trees (which only has number and
31 * string types). These tables are then used to loop up the real type when
32 * the user sets an option or its value needs to be shown.
35 /* Choice option type lists. */
36 const char *options_table_mode_keys_list
[] = {
39 const char *options_table_mode_mouse_list
[] = {
40 "off", "on", "copy-mode", NULL
42 const char *options_table_clock_mode_style_list
[] = {
45 const char *options_table_status_keys_list
[] = {
48 const char *options_table_status_justify_list
[] = {
49 "left", "centre", "right", NULL
51 const char *options_table_bell_action_list
[] = {
52 "none", "any", "current", NULL
56 const struct options_table_entry server_options_table
[] = {
57 { .name
= "buffer-limit",
58 .type
= OPTIONS_TABLE_NUMBER
,
64 { .name
= "escape-time",
65 .type
= OPTIONS_TABLE_NUMBER
,
71 { .name
= "exit-unattached",
72 .type
= OPTIONS_TABLE_FLAG
,
77 .type
= OPTIONS_TABLE_FLAG
,
78 .default_num
= 0 /* overridden in main() */
81 { .name
= "set-clipboard",
82 .type
= OPTIONS_TABLE_FLAG
,
89 /* Session options. */
90 const struct options_table_entry session_options_table
[] = {
91 { .name
= "base-index",
92 .type
= OPTIONS_TABLE_NUMBER
,
98 { .name
= "bell-action",
99 .type
= OPTIONS_TABLE_CHOICE
,
100 .choices
= options_table_bell_action_list
,
101 .default_num
= BELL_ANY
104 { .name
= "bell-on-alert",
105 .type
= OPTIONS_TABLE_FLAG
,
109 { .name
= "default-command",
110 .type
= OPTIONS_TABLE_STRING
,
114 { .name
= "default-path",
115 .type
= OPTIONS_TABLE_STRING
,
119 { .name
= "default-shell",
120 .type
= OPTIONS_TABLE_STRING
,
121 .default_str
= _PATH_BSHELL
124 { .name
= "default-terminal",
125 .type
= OPTIONS_TABLE_STRING
,
126 .default_str
= "screen"
129 { .name
= "destroy-unattached",
130 .type
= OPTIONS_TABLE_FLAG
,
134 { .name
= "detach-on-destroy",
135 .type
= OPTIONS_TABLE_FLAG
,
139 { .name
= "display-panes-active-colour",
140 .type
= OPTIONS_TABLE_COLOUR
,
144 { .name
= "display-panes-colour",
145 .type
= OPTIONS_TABLE_COLOUR
,
149 { .name
= "display-panes-time",
150 .type
= OPTIONS_TABLE_NUMBER
,
156 { .name
= "display-time",
157 .type
= OPTIONS_TABLE_NUMBER
,
163 { .name
= "history-limit",
164 .type
= OPTIONS_TABLE_NUMBER
,
170 { .name
= "lock-after-time",
171 .type
= OPTIONS_TABLE_NUMBER
,
177 { .name
= "lock-command",
178 .type
= OPTIONS_TABLE_STRING
,
179 .default_str
= "lock -np"
182 { .name
= "lock-server",
183 .type
= OPTIONS_TABLE_FLAG
,
187 { .name
= "message-attr",
188 .type
= OPTIONS_TABLE_ATTRIBUTES
,
192 { .name
= "message-bg",
193 .type
= OPTIONS_TABLE_COLOUR
,
197 { .name
= "message-command-attr",
198 .type
= OPTIONS_TABLE_ATTRIBUTES
,
202 { .name
= "message-command-bg",
203 .type
= OPTIONS_TABLE_COLOUR
,
207 { .name
= "message-command-fg",
208 .type
= OPTIONS_TABLE_COLOUR
,
212 { .name
= "message-fg",
213 .type
= OPTIONS_TABLE_COLOUR
,
217 { .name
= "message-limit",
218 .type
= OPTIONS_TABLE_NUMBER
,
224 { .name
= "mouse-resize-pane",
225 .type
= OPTIONS_TABLE_FLAG
,
229 { .name
= "mouse-select-pane",
230 .type
= OPTIONS_TABLE_FLAG
,
234 { .name
= "mouse-select-window",
235 .type
= OPTIONS_TABLE_FLAG
,
239 { .name
= "mouse-utf8",
240 .type
= OPTIONS_TABLE_FLAG
,
244 { .name
= "pane-active-border-bg",
245 .type
= OPTIONS_TABLE_COLOUR
,
249 { .name
= "pane-active-border-fg",
250 .type
= OPTIONS_TABLE_COLOUR
,
254 { .name
= "pane-border-bg",
255 .type
= OPTIONS_TABLE_COLOUR
,
259 { .name
= "pane-border-fg",
260 .type
= OPTIONS_TABLE_COLOUR
,
265 .type
= OPTIONS_TABLE_KEYS
,
269 { .name
= "repeat-time",
270 .type
= OPTIONS_TABLE_NUMBER
,
276 { .name
= "set-remain-on-exit",
277 .type
= OPTIONS_TABLE_FLAG
,
281 { .name
= "set-titles",
282 .type
= OPTIONS_TABLE_FLAG
,
286 { .name
= "set-titles-string",
287 .type
= OPTIONS_TABLE_STRING
,
288 .default_str
= "#S:#I:#W - \"#T\""
292 .type
= OPTIONS_TABLE_FLAG
,
296 { .name
= "status-attr",
297 .type
= OPTIONS_TABLE_ATTRIBUTES
,
301 { .name
= "status-bg",
302 .type
= OPTIONS_TABLE_COLOUR
,
306 { .name
= "status-fg",
307 .type
= OPTIONS_TABLE_COLOUR
,
311 { .name
= "status-interval",
312 .type
= OPTIONS_TABLE_NUMBER
,
318 { .name
= "status-justify",
319 .type
= OPTIONS_TABLE_CHOICE
,
320 .choices
= options_table_status_justify_list
,
324 { .name
= "status-keys",
325 .type
= OPTIONS_TABLE_CHOICE
,
326 .choices
= options_table_status_keys_list
,
327 .default_num
= MODEKEY_EMACS
330 { .name
= "status-left",
331 .type
= OPTIONS_TABLE_STRING
,
332 .default_str
= "[#S]"
335 { .name
= "status-left-attr",
336 .type
= OPTIONS_TABLE_ATTRIBUTES
,
340 { .name
= "status-left-bg",
341 .type
= OPTIONS_TABLE_COLOUR
,
345 { .name
= "status-left-fg",
346 .type
= OPTIONS_TABLE_COLOUR
,
350 { .name
= "status-left-length",
351 .type
= OPTIONS_TABLE_NUMBER
,
357 { .name
= "status-right",
358 .type
= OPTIONS_TABLE_STRING
,
359 .default_str
= "\"#22T\" %H:%M %d-%b-%y"
362 { .name
= "status-right-attr",
363 .type
= OPTIONS_TABLE_ATTRIBUTES
,
367 { .name
= "status-right-bg",
368 .type
= OPTIONS_TABLE_COLOUR
,
372 { .name
= "status-right-fg",
373 .type
= OPTIONS_TABLE_COLOUR
,
377 { .name
= "status-right-length",
378 .type
= OPTIONS_TABLE_NUMBER
,
384 { .name
= "status-utf8",
385 .type
= OPTIONS_TABLE_FLAG
,
386 .default_num
= 0 /* overridden in main() */
389 { .name
= "terminal-overrides",
390 .type
= OPTIONS_TABLE_STRING
,
391 .default_str
= "*88col*:colors=88,*256col*:colors=256"
392 ",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007"
393 ":Cc=\\E]12;%p1%s\\007:Cr=\\E]112\\007"
394 ":Cs=\\E[%p1%d q:Csr=\\E[2 q,screen*:XT"
397 { .name
= "update-environment",
398 .type
= OPTIONS_TABLE_STRING
,
399 .default_str
= "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
400 "SSH_CONNECTION WINDOWID XAUTHORITY"
404 { .name
= "visual-activity",
405 .type
= OPTIONS_TABLE_FLAG
,
409 { .name
= "visual-bell",
410 .type
= OPTIONS_TABLE_FLAG
,
414 { .name
= "visual-content",
415 .type
= OPTIONS_TABLE_FLAG
,
419 { .name
= "visual-silence",
420 .type
= OPTIONS_TABLE_FLAG
,
427 /* Window options. */
428 const struct options_table_entry window_options_table
[] = {
429 { .name
= "aggressive-resize",
430 .type
= OPTIONS_TABLE_FLAG
,
434 { .name
= "alternate-screen",
435 .type
= OPTIONS_TABLE_FLAG
,
439 { .name
= "automatic-rename",
440 .type
= OPTIONS_TABLE_FLAG
,
444 { .name
= "clock-mode-colour",
445 .type
= OPTIONS_TABLE_COLOUR
,
449 { .name
= "clock-mode-style",
450 .type
= OPTIONS_TABLE_CHOICE
,
451 .choices
= options_table_clock_mode_style_list
,
455 { .name
= "force-height",
456 .type
= OPTIONS_TABLE_NUMBER
,
462 { .name
= "force-width",
463 .type
= OPTIONS_TABLE_NUMBER
,
469 { .name
= "main-pane-height",
470 .type
= OPTIONS_TABLE_NUMBER
,
476 { .name
= "main-pane-width",
477 .type
= OPTIONS_TABLE_NUMBER
,
483 { .name
= "mode-attr",
484 .type
= OPTIONS_TABLE_ATTRIBUTES
,
489 .type
= OPTIONS_TABLE_COLOUR
,
494 .type
= OPTIONS_TABLE_COLOUR
,
498 { .name
= "mode-keys",
499 .type
= OPTIONS_TABLE_CHOICE
,
500 .choices
= options_table_mode_keys_list
,
501 .default_num
= MODEKEY_EMACS
504 { .name
= "mode-mouse",
505 .type
= OPTIONS_TABLE_CHOICE
,
506 .choices
= options_table_mode_mouse_list
,
510 { .name
= "monitor-activity",
511 .type
= OPTIONS_TABLE_FLAG
,
515 { .name
= "monitor-content",
516 .type
= OPTIONS_TABLE_STRING
,
520 { .name
= "monitor-silence",
521 .type
= OPTIONS_TABLE_NUMBER
,
527 { .name
= "other-pane-height",
528 .type
= OPTIONS_TABLE_NUMBER
,
534 { .name
= "other-pane-width",
535 .type
= OPTIONS_TABLE_NUMBER
,
541 { .name
= "pane-base-index",
542 .type
= OPTIONS_TABLE_NUMBER
,
544 .maximum
= USHRT_MAX
,
548 { .name
= "remain-on-exit",
549 .type
= OPTIONS_TABLE_FLAG
,
553 { .name
= "synchronize-panes",
554 .type
= OPTIONS_TABLE_FLAG
,
559 .type
= OPTIONS_TABLE_FLAG
,
560 .default_num
= 0 /* overridden in main() */
563 { .name
= "window-status-alert-attr",
564 .type
= OPTIONS_TABLE_ATTRIBUTES
,
565 .default_num
= GRID_ATTR_REVERSE
568 { .name
= "window-status-alert-bg",
569 .type
= OPTIONS_TABLE_COLOUR
,
573 { .name
= "window-status-alert-fg",
574 .type
= OPTIONS_TABLE_COLOUR
,
578 { .name
= "window-status-attr",
579 .type
= OPTIONS_TABLE_ATTRIBUTES
,
583 { .name
= "window-status-bg",
584 .type
= OPTIONS_TABLE_COLOUR
,
588 { .name
= "window-status-current-attr",
589 .type
= OPTIONS_TABLE_ATTRIBUTES
,
593 { .name
= "window-status-current-bg",
594 .type
= OPTIONS_TABLE_COLOUR
,
598 { .name
= "window-status-current-fg",
599 .type
= OPTIONS_TABLE_COLOUR
,
603 { .name
= "window-status-current-format",
604 .type
= OPTIONS_TABLE_STRING
,
605 .default_str
= "#I:#W#F"
608 { .name
= "window-status-fg",
609 .type
= OPTIONS_TABLE_COLOUR
,
613 { .name
= "window-status-format",
614 .type
= OPTIONS_TABLE_STRING
,
615 .default_str
= "#I:#W#F"
618 { .name
= "word-separators",
619 .type
= OPTIONS_TABLE_STRING
,
620 .default_str
= " -_@"
623 { .name
= "xterm-keys",
624 .type
= OPTIONS_TABLE_FLAG
,
631 /* Populate an options tree from a table. */
633 options_table_populate_tree(
634 const struct options_table_entry
*table
, struct options
*oo
)
636 const struct options_table_entry
*oe
;
638 for (oe
= table
; oe
->name
!= NULL
; oe
++) {
639 if (oe
->default_str
!= NULL
)
640 options_set_string(oo
, oe
->name
, "%s", oe
->default_str
);
642 options_set_number(oo
, oe
->name
, oe
->default_num
);
646 /* Print an option using its type from the table. */
648 options_table_print_entry(
649 const struct options_table_entry
*oe
, struct options_entry
*o
)
651 static char out
[BUFSIZ
];
653 struct keylist
*keylist
;
658 case OPTIONS_TABLE_STRING
:
659 xsnprintf(out
, sizeof out
, "\"%s\"", o
->str
);
661 case OPTIONS_TABLE_NUMBER
:
662 xsnprintf(out
, sizeof out
, "%lld", o
->num
);
664 case OPTIONS_TABLE_KEYS
:
666 for (i
= 0; i
< ARRAY_LENGTH(keylist
); i
++) {
667 s
= key_string_lookup_key(ARRAY_ITEM(keylist
, i
));
668 strlcat(out
, s
, sizeof out
);
669 if (i
!= ARRAY_LENGTH(keylist
) - 1)
670 strlcat(out
, ",", sizeof out
);
673 case OPTIONS_TABLE_COLOUR
:
674 s
= colour_tostring(o
->num
);
675 xsnprintf(out
, sizeof out
, "%s", s
);
677 case OPTIONS_TABLE_ATTRIBUTES
:
678 s
= attributes_tostring(o
->num
);
679 xsnprintf(out
, sizeof out
, "%s", s
);
681 case OPTIONS_TABLE_FLAG
:
683 strlcpy(out
, "on", sizeof out
);
685 strlcpy(out
, "off", sizeof out
);
687 case OPTIONS_TABLE_CHOICE
:
688 s
= oe
->choices
[o
->num
];
689 xsnprintf(out
, sizeof out
, "%s", s
);