Annotation of src/usr.bin/tmux/options-table.c, Revision 1.7
1.7 ! nicm 1: /* $OpenBSD: options-table.c,v 1.6 2011/05/08 19:53:06 nicm Exp $ */
1.1 nicm 2:
3: /*
4: * Copyright (c) 2011 Nicholas Marriott <nicm@users.sourceforge.net>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: #include <sys/types.h>
20:
21: #include <string.h>
22: #include <paths.h>
23:
24: #include "tmux.h"
25:
26: /*
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.
33: */
34:
35: /* Choice option type lists. */
36: const char *options_table_mode_keys_list[] = {
37: "emacs", "vi", NULL
38: };
39: const char *options_table_clock_mode_style_list[] = {
40: "12", "24", NULL
41: };
42: const char *options_table_status_keys_list[] = {
43: "emacs", "vi", NULL
44: };
45: const char *options_table_status_justify_list[] = {
46: "left", "centre", "right", NULL
47: };
48: const char *options_table_bell_action_list[] = {
49: "none", "any", "current", NULL
50: };
51:
52: /* Server options. */
53: const struct options_table_entry server_options_table[] = {
54: { .name = "buffer-limit",
55: .type = OPTIONS_TABLE_NUMBER,
56: .minimum = 1,
57: .maximum = INT_MAX,
1.4 nicm 58: .default_num = 20
1.1 nicm 59: },
60:
61: { .name = "escape-time",
62: .type = OPTIONS_TABLE_NUMBER,
63: .minimum = 0,
64: .maximum = INT_MAX,
65: .default_num = 500
66: },
67:
68: { .name = "exit-unattached",
69: .type = OPTIONS_TABLE_FLAG,
70: .default_num = 0
71: },
72:
73: { .name = "quiet",
74: .type = OPTIONS_TABLE_FLAG,
75: .default_num = 0 /* overridden in main() */
76: },
77:
78: { .name = NULL }
79: };
80:
81: /* Session options. */
82: const struct options_table_entry session_options_table[] = {
83: { .name = "base-index",
84: .type = OPTIONS_TABLE_NUMBER,
85: .minimum = 0,
86: .maximum = INT_MAX,
87: .default_num = 0
88: },
89:
90: { .name = "bell-action",
91: .type = OPTIONS_TABLE_CHOICE,
92: .choices = options_table_bell_action_list,
93: .default_num = BELL_ANY
94: },
95:
96: { .name = "default-command",
97: .type = OPTIONS_TABLE_STRING,
98: .default_str = ""
99: },
100:
101: { .name = "default-path",
102: .type = OPTIONS_TABLE_STRING,
103: .default_str = ""
104: },
105:
106: { .name = "default-shell",
107: .type = OPTIONS_TABLE_STRING,
108: .default_str = _PATH_BSHELL
109: },
110:
111: { .name = "default-terminal",
112: .type = OPTIONS_TABLE_STRING,
113: .default_str = "screen"
114: },
115:
116: { .name = "destroy-unattached",
117: .type = OPTIONS_TABLE_FLAG,
118: .default_num = 0
119: },
120:
121: { .name = "detach-on-destroy",
122: .type = OPTIONS_TABLE_FLAG,
123: .default_num = 1
124: },
125:
126: { .name = "display-panes-active-colour",
127: .type = OPTIONS_TABLE_COLOUR,
128: .default_num = 1
129: },
130:
131: { .name = "display-panes-colour",
132: .type = OPTIONS_TABLE_COLOUR,
133: .default_num = 4
134: },
135:
136: { .name = "display-panes-time",
137: .type = OPTIONS_TABLE_NUMBER,
138: .minimum = 1,
139: .maximum = INT_MAX,
140: .default_num = 1000
141: },
142:
143: { .name = "display-time",
144: .type = OPTIONS_TABLE_NUMBER,
145: .minimum = 1,
146: .maximum = INT_MAX,
147: .default_num = 750
148: },
149:
150: { .name = "history-limit",
151: .type = OPTIONS_TABLE_NUMBER,
152: .minimum = 0,
1.3 nicm 153: .maximum = INT_MAX,
1.1 nicm 154: .default_num = 2000
155: },
156:
157: { .name = "lock-after-time",
158: .type = OPTIONS_TABLE_NUMBER,
159: .minimum = 0,
160: .maximum = INT_MAX,
161: .default_num = 0
162: },
163:
164: { .name = "lock-command",
165: .type = OPTIONS_TABLE_STRING,
166: .default_str = "lock -np"
167: },
168:
169: { .name = "lock-server",
170: .type = OPTIONS_TABLE_FLAG,
171: .default_num = 1
172: },
173:
174: { .name = "message-attr",
175: .type = OPTIONS_TABLE_ATTRIBUTES,
176: .default_num = 0
177: },
178:
179: { .name = "message-bg",
180: .type = OPTIONS_TABLE_COLOUR,
181: .default_num = 3
182: },
183:
184: { .name = "message-fg",
185: .type = OPTIONS_TABLE_COLOUR,
186: .default_num = 0
187: },
188:
189: { .name = "message-limit",
190: .type = OPTIONS_TABLE_NUMBER,
191: .minimum = 0,
192: .maximum = INT_MAX,
193: .default_num = 20
1.7 ! nicm 194: },
! 195:
! 196: { .name = "mouse-resize-pane",
! 197: .type = OPTIONS_TABLE_FLAG,
! 198: .default_num = 0
1.1 nicm 199: },
200:
201: { .name = "mouse-select-pane",
1.5 nicm 202: .type = OPTIONS_TABLE_FLAG,
203: .default_num = 0
204: },
205:
206: { .name = "mouse-select-window",
1.2 nicm 207: .type = OPTIONS_TABLE_FLAG,
208: .default_num = 0
209: },
210:
211: { .name = "mouse-utf8",
1.1 nicm 212: .type = OPTIONS_TABLE_FLAG,
213: .default_num = 0
214: },
215:
216: { .name = "pane-active-border-bg",
217: .type = OPTIONS_TABLE_COLOUR,
218: .default_num = 8
219: },
220:
221: { .name = "pane-active-border-fg",
222: .type = OPTIONS_TABLE_COLOUR,
223: .default_num = 2
224: },
225:
226: { .name = "pane-border-bg",
227: .type = OPTIONS_TABLE_COLOUR,
228: .default_num = 8
229: },
230:
231: { .name = "pane-border-fg",
232: .type = OPTIONS_TABLE_COLOUR,
233: .default_num = 8
234: },
235:
236: { .name = "prefix",
237: .type = OPTIONS_TABLE_KEYS,
238: /* set in main() */
239: },
240:
241: { .name = "repeat-time",
242: .type = OPTIONS_TABLE_NUMBER,
243: .minimum = 0,
244: .maximum = SHRT_MAX,
245: .default_num = 500
246: },
247:
248: { .name = "set-remain-on-exit",
249: .type = OPTIONS_TABLE_FLAG,
250: .default_num = 0
251: },
252:
253: { .name = "set-titles",
254: .type = OPTIONS_TABLE_FLAG,
255: .default_num = 0
256: },
257:
258: { .name = "set-titles-string",
259: .type = OPTIONS_TABLE_STRING,
260: .default_str = "#S:#I:#W - \"#T\""
261: },
262:
263: { .name = "status",
264: .type = OPTIONS_TABLE_FLAG,
265: .default_num = 1
266: },
267:
268: { .name = "status-attr",
269: .type = OPTIONS_TABLE_ATTRIBUTES,
270: .default_num = 0
271: },
272:
273: { .name = "status-bg",
274: .type = OPTIONS_TABLE_COLOUR,
275: .default_num = 2
276: },
277:
278: { .name = "status-fg",
279: .type = OPTIONS_TABLE_COLOUR,
280: .default_num = 0
281: },
282:
283: { .name = "status-interval",
284: .type = OPTIONS_TABLE_NUMBER,
285: .minimum = 0,
286: .maximum = INT_MAX,
287: .default_num = 15
288: },
289:
290: { .name = "status-justify",
291: .type = OPTIONS_TABLE_CHOICE,
292: .choices = options_table_status_justify_list,
293: .default_num = 0
294: },
295:
296: { .name = "status-keys",
297: .type = OPTIONS_TABLE_CHOICE,
298: .choices = options_table_status_keys_list,
299: .default_num = MODEKEY_EMACS
300: },
301:
302: { .name = "status-left",
303: .type = OPTIONS_TABLE_STRING,
304: .default_str = "[#S]"
305: },
306:
307: { .name = "status-left-attr",
308: .type = OPTIONS_TABLE_ATTRIBUTES,
309: .default_num = 0
310: },
311:
312: { .name = "status-left-bg",
313: .type = OPTIONS_TABLE_COLOUR,
314: .default_num = 8
315: },
316:
317: { .name = "status-left-fg",
318: .type = OPTIONS_TABLE_COLOUR,
319: .default_num = 8
320: },
321:
322: { .name = "status-left-length",
323: .type = OPTIONS_TABLE_NUMBER,
324: .minimum = 0,
325: .maximum = SHRT_MAX,
326: .default_num = 10
327: },
328:
329: { .name = "status-right",
330: .type = OPTIONS_TABLE_STRING,
331: .default_str = "\"#22T\" %H:%M %d-%b-%y"
332: },
333:
334: { .name = "status-right-attr",
335: .type = OPTIONS_TABLE_ATTRIBUTES,
336: .default_num = 0
337: },
338:
339: { .name = "status-right-bg",
340: .type = OPTIONS_TABLE_COLOUR,
341: .default_num = 8
342: },
343:
344: { .name = "status-right-fg",
345: .type = OPTIONS_TABLE_COLOUR,
346: .default_num = 8
347: },
348:
349: { .name = "status-right-length",
350: .type = OPTIONS_TABLE_NUMBER,
351: .minimum = 0,
352: .maximum = SHRT_MAX,
353: .default_num = 40
354: },
355:
356: { .name = "status-utf8",
357: .type = OPTIONS_TABLE_FLAG,
358: .default_num = 0 /* overridden in main() */
359: },
360:
361: { .name = "terminal-overrides",
362: .type = OPTIONS_TABLE_STRING,
1.6 nicm 363: .default_str = "*88col*:colors=88,*256col*:colors=256,xterm*:XT"
1.1 nicm 364: },
365:
366: { .name = "update-environment",
367: .type = OPTIONS_TABLE_STRING,
368: .default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
369: "SSH_CONNECTION WINDOWID XAUTHORITY"
370:
371: },
372:
373: { .name = "visual-activity",
374: .type = OPTIONS_TABLE_FLAG,
375: .default_num = 0
376: },
377:
378: { .name = "visual-bell",
379: .type = OPTIONS_TABLE_FLAG,
380: .default_num = 0
381: },
382:
383: { .name = "visual-content",
384: .type = OPTIONS_TABLE_FLAG,
385: .default_num = 0
386: },
387:
388: { .name = "visual-silence",
389: .type = OPTIONS_TABLE_FLAG,
390: .default_num = 0
391: },
392:
393: { .name = NULL }
394: };
395:
396: /* Window options. */
397: const struct options_table_entry window_options_table[] = {
398: { .name = "aggressive-resize",
399: .type = OPTIONS_TABLE_FLAG,
400: .default_num = 0
401: },
402:
403: { .name = "alternate-screen",
404: .type = OPTIONS_TABLE_FLAG,
405: .default_num = 1
406: },
407:
408: { .name = "automatic-rename",
409: .type = OPTIONS_TABLE_FLAG,
410: .default_num = 1
411: },
412:
413: { .name = "clock-mode-colour",
414: .type = OPTIONS_TABLE_COLOUR,
415: .default_num = 4
416: },
417:
418: { .name = "clock-mode-style",
419: .type = OPTIONS_TABLE_CHOICE,
420: .choices = options_table_clock_mode_style_list,
421: .default_num = 1
422: },
423:
424: { .name = "force-height",
425: .type = OPTIONS_TABLE_NUMBER,
426: .minimum = 0,
427: .maximum = INT_MAX,
428: .default_num = 0
429: },
430:
431: { .name = "force-width",
432: .type = OPTIONS_TABLE_NUMBER,
433: .minimum = 0,
434: .maximum = INT_MAX,
435: .default_num = 0
436: },
437:
438: { .name = "main-pane-height",
439: .type = OPTIONS_TABLE_NUMBER,
440: .minimum = 1,
441: .maximum = INT_MAX,
442: .default_num = 24
443: },
444:
445: { .name = "main-pane-width",
446: .type = OPTIONS_TABLE_NUMBER,
447: .minimum = 1,
448: .maximum = INT_MAX,
449: .default_num = 80
450: },
451:
452: { .name = "mode-attr",
453: .type = OPTIONS_TABLE_ATTRIBUTES,
454: .default_num = 0
455: },
456:
457: { .name = "mode-bg",
458: .type = OPTIONS_TABLE_COLOUR,
459: .default_num = 3
460: },
461:
462: { .name = "mode-fg",
463: .type = OPTIONS_TABLE_COLOUR,
464: .default_num = 0
465: },
466:
467: { .name = "mode-keys",
468: .type = OPTIONS_TABLE_CHOICE,
469: .choices = options_table_mode_keys_list,
470: .default_num = MODEKEY_EMACS
471: },
472:
473: { .name = "mode-mouse",
474: .type = OPTIONS_TABLE_FLAG,
475: .default_num = 0
476: },
477:
478: { .name = "monitor-activity",
479: .type = OPTIONS_TABLE_FLAG,
480: .default_num = 0
481: },
482:
483: { .name = "monitor-content",
484: .type = OPTIONS_TABLE_STRING,
485: .default_str = ""
486: },
487:
488: { .name = "monitor-silence",
489: .type = OPTIONS_TABLE_NUMBER,
490: .minimum = 0,
491: .maximum = INT_MAX,
492: .default_num = 0
493: },
494:
495: { .name = "other-pane-height",
496: .type = OPTIONS_TABLE_NUMBER,
497: .minimum = 0,
498: .maximum = INT_MAX,
499: .default_num = 0
500: },
501:
502: { .name = "other-pane-width",
503: .type = OPTIONS_TABLE_NUMBER,
504: .minimum = 0,
505: .maximum = INT_MAX,
506: .default_num = 0
507: },
508:
509: { .name = "remain-on-exit",
510: .type = OPTIONS_TABLE_FLAG,
511: .default_num = 0
512: },
513:
514: { .name = "synchronize-panes",
515: .type = OPTIONS_TABLE_FLAG,
516: .default_num = 0
517: },
518:
519: { .name = "utf8",
520: .type = OPTIONS_TABLE_FLAG,
521: .default_num = 0 /* overridden in main() */
522: },
523:
524: { .name = "window-status-alert-attr",
525: .type = OPTIONS_TABLE_ATTRIBUTES,
526: .default_num = GRID_ATTR_REVERSE
527: },
528:
529: { .name = "window-status-alert-bg",
530: .type = OPTIONS_TABLE_COLOUR,
531: .default_num = 8
532: },
533:
534: { .name = "window-status-alert-fg",
535: .type = OPTIONS_TABLE_COLOUR,
536: .default_num = 8
537: },
538:
539: { .name = "window-status-attr",
540: .type = OPTIONS_TABLE_ATTRIBUTES,
541: .default_num = 0
542: },
543:
544: { .name = "window-status-bg",
545: .type = OPTIONS_TABLE_COLOUR,
546: .default_num = 8
547: },
548:
549: { .name = "window-status-current-attr",
550: .type = OPTIONS_TABLE_ATTRIBUTES,
551: .default_num = 0
552: },
553:
554: { .name = "window-status-current-bg",
555: .type = OPTIONS_TABLE_COLOUR,
556: .default_num = 8
557: },
558:
559: { .name = "window-status-current-fg",
560: .type = OPTIONS_TABLE_COLOUR,
561: .default_num = 8
562: },
563:
564: { .name = "window-status-current-format",
565: .type = OPTIONS_TABLE_STRING,
566: .default_str = "#I:#W#F"
567: },
568:
569: { .name = "window-status-fg",
570: .type = OPTIONS_TABLE_COLOUR,
571: .default_num = 8
572: },
573:
574: { .name = "window-status-format",
575: .type = OPTIONS_TABLE_STRING,
576: .default_str = "#I:#W#F"
577: },
578:
579: { .name = "word-separators",
580: .type = OPTIONS_TABLE_STRING,
581: .default_str = " -_@"
582: },
583:
584: { .name = "xterm-keys",
585: .type = OPTIONS_TABLE_FLAG,
586: .default_num = 0
587: },
588:
589: { .name = NULL }
590: };
591:
592: /* Populate an options tree from a table. */
593: void
594: options_table_populate_tree(
595: const struct options_table_entry *table, struct options *oo)
596: {
597: const struct options_table_entry *oe;
598:
599: for (oe = table; oe->name != NULL; oe++) {
600: if (oe->default_str != NULL)
601: options_set_string(oo, oe->name, "%s", oe->default_str);
602: else
603: options_set_number(oo, oe->name, oe->default_num);
604: }
605: }
606:
607: /* Print an option using its type from the table. */
608: const char *
609: options_table_print_entry(
610: const struct options_table_entry *oe, struct options_entry *o)
611: {
612: static char out[BUFSIZ];
613: const char *s;
614: struct keylist *keylist;
615: u_int i;
616:
617: *out = '\0';
618: switch (oe->type) {
619: case OPTIONS_TABLE_STRING:
620: xsnprintf(out, sizeof out, "\"%s\"", o->str);
621: break;
622: case OPTIONS_TABLE_NUMBER:
623: xsnprintf(out, sizeof out, "%lld", o->num);
624: break;
625: case OPTIONS_TABLE_KEYS:
626: keylist = o->data;
627: for (i = 0; i < ARRAY_LENGTH(keylist); i++) {
628: s = key_string_lookup_key(ARRAY_ITEM(keylist, i));
629: strlcat(out, s, sizeof out);
630: if (i != ARRAY_LENGTH(keylist) - 1)
631: strlcat(out, ",", sizeof out);
632: }
633: break;
634: case OPTIONS_TABLE_COLOUR:
635: s = colour_tostring(o->num);
636: xsnprintf(out, sizeof out, "%s", s);
637: break;
638: case OPTIONS_TABLE_ATTRIBUTES:
639: s = attributes_tostring(o->num);
640: xsnprintf(out, sizeof out, "%s", s);
641: break;
642: case OPTIONS_TABLE_FLAG:
643: if (o->num)
644: strlcpy(out, "on", sizeof out);
645: else
646: strlcpy(out, "off", sizeof out);
647: break;
648: case OPTIONS_TABLE_CHOICE:
649: s = oe->choices[o->num];
650: xsnprintf(out, sizeof out, "%s", s);
651: break;
652: }
653: return (out);
654: }