Annotation of src/usr.bin/tmux/options-table.c, Revision 1.23
1.23 ! nicm 1: /* $OpenBSD: options-table.c,v 1.22 2012/02/25 12:57:42 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: };
1.12 nicm 39: const char *options_table_mode_mouse_list[] = {
40: "off", "on", "copy-mode", NULL
41: };
1.1 nicm 42: const char *options_table_clock_mode_style_list[] = {
43: "12", "24", NULL
44: };
45: const char *options_table_status_keys_list[] = {
46: "emacs", "vi", NULL
47: };
48: const char *options_table_status_justify_list[] = {
49: "left", "centre", "right", NULL
50: };
1.20 nicm 51: const char *options_table_status_position_list[] = {
52: "top", "bottom", NULL
53: };
1.1 nicm 54: const char *options_table_bell_action_list[] = {
55: "none", "any", "current", NULL
56: };
57:
58: /* Server options. */
59: const struct options_table_entry server_options_table[] = {
60: { .name = "buffer-limit",
61: .type = OPTIONS_TABLE_NUMBER,
62: .minimum = 1,
63: .maximum = INT_MAX,
1.4 nicm 64: .default_num = 20
1.1 nicm 65: },
66:
67: { .name = "escape-time",
68: .type = OPTIONS_TABLE_NUMBER,
69: .minimum = 0,
70: .maximum = INT_MAX,
71: .default_num = 500
72: },
73:
74: { .name = "exit-unattached",
75: .type = OPTIONS_TABLE_FLAG,
76: .default_num = 0
77: },
78:
79: { .name = "quiet",
80: .type = OPTIONS_TABLE_FLAG,
81: .default_num = 0 /* overridden in main() */
82: },
83:
1.8 nicm 84: { .name = "set-clipboard",
85: .type = OPTIONS_TABLE_FLAG,
86: .default_num = 1
87: },
88:
1.1 nicm 89: { .name = NULL }
90: };
91:
92: /* Session options. */
93: const struct options_table_entry session_options_table[] = {
94: { .name = "base-index",
95: .type = OPTIONS_TABLE_NUMBER,
96: .minimum = 0,
97: .maximum = INT_MAX,
98: .default_num = 0
99: },
100:
101: { .name = "bell-action",
102: .type = OPTIONS_TABLE_CHOICE,
103: .choices = options_table_bell_action_list,
104: .default_num = BELL_ANY
1.11 nicm 105: },
106:
107: { .name = "bell-on-alert",
108: .type = OPTIONS_TABLE_FLAG,
109: .default_num = 0
1.1 nicm 110: },
111:
112: { .name = "default-command",
113: .type = OPTIONS_TABLE_STRING,
114: .default_str = ""
115: },
116:
117: { .name = "default-path",
118: .type = OPTIONS_TABLE_STRING,
119: .default_str = ""
120: },
121:
122: { .name = "default-shell",
123: .type = OPTIONS_TABLE_STRING,
124: .default_str = _PATH_BSHELL
125: },
126:
127: { .name = "default-terminal",
128: .type = OPTIONS_TABLE_STRING,
129: .default_str = "screen"
130: },
131:
132: { .name = "destroy-unattached",
133: .type = OPTIONS_TABLE_FLAG,
134: .default_num = 0
135: },
136:
137: { .name = "detach-on-destroy",
138: .type = OPTIONS_TABLE_FLAG,
139: .default_num = 1
140: },
141:
142: { .name = "display-panes-active-colour",
143: .type = OPTIONS_TABLE_COLOUR,
144: .default_num = 1
145: },
146:
147: { .name = "display-panes-colour",
148: .type = OPTIONS_TABLE_COLOUR,
149: .default_num = 4
150: },
151:
152: { .name = "display-panes-time",
153: .type = OPTIONS_TABLE_NUMBER,
154: .minimum = 1,
155: .maximum = INT_MAX,
156: .default_num = 1000
157: },
158:
159: { .name = "display-time",
160: .type = OPTIONS_TABLE_NUMBER,
161: .minimum = 1,
162: .maximum = INT_MAX,
163: .default_num = 750
164: },
165:
166: { .name = "history-limit",
167: .type = OPTIONS_TABLE_NUMBER,
168: .minimum = 0,
1.3 nicm 169: .maximum = INT_MAX,
1.1 nicm 170: .default_num = 2000
171: },
172:
173: { .name = "lock-after-time",
174: .type = OPTIONS_TABLE_NUMBER,
175: .minimum = 0,
176: .maximum = INT_MAX,
177: .default_num = 0
178: },
179:
180: { .name = "lock-command",
181: .type = OPTIONS_TABLE_STRING,
182: .default_str = "lock -np"
183: },
184:
185: { .name = "lock-server",
186: .type = OPTIONS_TABLE_FLAG,
187: .default_num = 1
188: },
189:
190: { .name = "message-attr",
191: .type = OPTIONS_TABLE_ATTRIBUTES,
192: .default_num = 0
193: },
194:
195: { .name = "message-bg",
1.15 nicm 196: .type = OPTIONS_TABLE_COLOUR,
197: .default_num = 3
198: },
199:
200: { .name = "message-command-attr",
201: .type = OPTIONS_TABLE_ATTRIBUTES,
202: .default_num = 0
203: },
204:
205: { .name = "message-command-bg",
206: .type = OPTIONS_TABLE_COLOUR,
207: .default_num = 0
208: },
209:
210: { .name = "message-command-fg",
1.1 nicm 211: .type = OPTIONS_TABLE_COLOUR,
212: .default_num = 3
213: },
214:
215: { .name = "message-fg",
216: .type = OPTIONS_TABLE_COLOUR,
217: .default_num = 0
218: },
219:
220: { .name = "message-limit",
221: .type = OPTIONS_TABLE_NUMBER,
222: .minimum = 0,
223: .maximum = INT_MAX,
224: .default_num = 20
1.7 nicm 225: },
226:
227: { .name = "mouse-resize-pane",
228: .type = OPTIONS_TABLE_FLAG,
229: .default_num = 0
1.1 nicm 230: },
231:
232: { .name = "mouse-select-pane",
1.5 nicm 233: .type = OPTIONS_TABLE_FLAG,
234: .default_num = 0
235: },
236:
237: { .name = "mouse-select-window",
1.2 nicm 238: .type = OPTIONS_TABLE_FLAG,
239: .default_num = 0
240: },
241:
242: { .name = "mouse-utf8",
1.1 nicm 243: .type = OPTIONS_TABLE_FLAG,
244: .default_num = 0
245: },
246:
247: { .name = "pane-active-border-bg",
248: .type = OPTIONS_TABLE_COLOUR,
249: .default_num = 8
250: },
251:
252: { .name = "pane-active-border-fg",
253: .type = OPTIONS_TABLE_COLOUR,
254: .default_num = 2
255: },
256:
257: { .name = "pane-border-bg",
258: .type = OPTIONS_TABLE_COLOUR,
259: .default_num = 8
260: },
261:
262: { .name = "pane-border-fg",
263: .type = OPTIONS_TABLE_COLOUR,
264: .default_num = 8
265: },
266:
267: { .name = "prefix",
1.19 nicm 268: .type = OPTIONS_TABLE_KEY,
269: .default_num = '\002',
270: },
271:
272: { .name = "prefix2",
273: .type = OPTIONS_TABLE_KEY,
274: .default_num = KEYC_NONE,
1.1 nicm 275: },
276:
277: { .name = "repeat-time",
278: .type = OPTIONS_TABLE_NUMBER,
279: .minimum = 0,
280: .maximum = SHRT_MAX,
281: .default_num = 500
282: },
283:
284: { .name = "set-remain-on-exit",
285: .type = OPTIONS_TABLE_FLAG,
286: .default_num = 0
287: },
288:
289: { .name = "set-titles",
290: .type = OPTIONS_TABLE_FLAG,
291: .default_num = 0
292: },
293:
294: { .name = "set-titles-string",
295: .type = OPTIONS_TABLE_STRING,
296: .default_str = "#S:#I:#W - \"#T\""
297: },
298:
299: { .name = "status",
300: .type = OPTIONS_TABLE_FLAG,
301: .default_num = 1
302: },
303:
304: { .name = "status-attr",
305: .type = OPTIONS_TABLE_ATTRIBUTES,
306: .default_num = 0
307: },
308:
309: { .name = "status-bg",
310: .type = OPTIONS_TABLE_COLOUR,
311: .default_num = 2
312: },
313:
314: { .name = "status-fg",
315: .type = OPTIONS_TABLE_COLOUR,
316: .default_num = 0
317: },
318:
319: { .name = "status-interval",
320: .type = OPTIONS_TABLE_NUMBER,
321: .minimum = 0,
322: .maximum = INT_MAX,
323: .default_num = 15
324: },
325:
326: { .name = "status-justify",
327: .type = OPTIONS_TABLE_CHOICE,
328: .choices = options_table_status_justify_list,
329: .default_num = 0
330: },
331:
332: { .name = "status-keys",
333: .type = OPTIONS_TABLE_CHOICE,
334: .choices = options_table_status_keys_list,
335: .default_num = MODEKEY_EMACS
336: },
337:
338: { .name = "status-left",
339: .type = OPTIONS_TABLE_STRING,
340: .default_str = "[#S]"
341: },
342:
343: { .name = "status-left-attr",
344: .type = OPTIONS_TABLE_ATTRIBUTES,
345: .default_num = 0
346: },
347:
348: { .name = "status-left-bg",
349: .type = OPTIONS_TABLE_COLOUR,
350: .default_num = 8
351: },
352:
353: { .name = "status-left-fg",
354: .type = OPTIONS_TABLE_COLOUR,
355: .default_num = 8
356: },
357:
358: { .name = "status-left-length",
359: .type = OPTIONS_TABLE_NUMBER,
360: .minimum = 0,
361: .maximum = SHRT_MAX,
362: .default_num = 10
1.20 nicm 363: },
364:
365: { .name = "status-position",
366: .type = OPTIONS_TABLE_CHOICE,
367: .choices = options_table_status_position_list,
368: .default_num = 1
1.1 nicm 369: },
370:
371: { .name = "status-right",
372: .type = OPTIONS_TABLE_STRING,
373: .default_str = "\"#22T\" %H:%M %d-%b-%y"
374: },
375:
376: { .name = "status-right-attr",
377: .type = OPTIONS_TABLE_ATTRIBUTES,
378: .default_num = 0
379: },
380:
381: { .name = "status-right-bg",
382: .type = OPTIONS_TABLE_COLOUR,
383: .default_num = 8
384: },
385:
386: { .name = "status-right-fg",
387: .type = OPTIONS_TABLE_COLOUR,
388: .default_num = 8
389: },
390:
391: { .name = "status-right-length",
392: .type = OPTIONS_TABLE_NUMBER,
393: .minimum = 0,
394: .maximum = SHRT_MAX,
395: .default_num = 40
396: },
397:
398: { .name = "status-utf8",
399: .type = OPTIONS_TABLE_FLAG,
400: .default_num = 0 /* overridden in main() */
401: },
402:
403: { .name = "terminal-overrides",
404: .type = OPTIONS_TABLE_STRING,
1.8 nicm 405: .default_str = "*88col*:colors=88,*256col*:colors=256"
1.9 nicm 406: ",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007"
407: ":Cc=\\E]12;%p1%s\\007:Cr=\\E]112\\007"
1.14 nicm 408: ":Cs=\\E[%p1%d q:Csr=\\E[2 q,screen*:XT"
1.1 nicm 409: },
410:
411: { .name = "update-environment",
412: .type = OPTIONS_TABLE_STRING,
413: .default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
1.9 nicm 414: "SSH_CONNECTION WINDOWID XAUTHORITY"
1.1 nicm 415:
416: },
417:
418: { .name = "visual-activity",
419: .type = OPTIONS_TABLE_FLAG,
420: .default_num = 0
421: },
422:
423: { .name = "visual-bell",
424: .type = OPTIONS_TABLE_FLAG,
425: .default_num = 0
426: },
427:
428: { .name = "visual-content",
429: .type = OPTIONS_TABLE_FLAG,
430: .default_num = 0
431: },
432:
433: { .name = "visual-silence",
434: .type = OPTIONS_TABLE_FLAG,
435: .default_num = 0
436: },
437:
1.16 nicm 438: { .name = "word-separators",
439: .type = OPTIONS_TABLE_STRING,
440: .default_str = " -_@"
441: },
442:
1.1 nicm 443: { .name = NULL }
444: };
445:
446: /* Window options. */
447: const struct options_table_entry window_options_table[] = {
448: { .name = "aggressive-resize",
449: .type = OPTIONS_TABLE_FLAG,
450: .default_num = 0
1.17 nicm 451: },
452:
453: { .name = "allow-rename",
454: .type = OPTIONS_TABLE_FLAG,
455: .default_num = 1
1.1 nicm 456: },
457:
458: { .name = "alternate-screen",
459: .type = OPTIONS_TABLE_FLAG,
460: .default_num = 1
461: },
462:
463: { .name = "automatic-rename",
464: .type = OPTIONS_TABLE_FLAG,
465: .default_num = 1
466: },
467:
468: { .name = "clock-mode-colour",
469: .type = OPTIONS_TABLE_COLOUR,
470: .default_num = 4
471: },
472:
473: { .name = "clock-mode-style",
474: .type = OPTIONS_TABLE_CHOICE,
475: .choices = options_table_clock_mode_style_list,
476: .default_num = 1
477: },
478:
479: { .name = "force-height",
480: .type = OPTIONS_TABLE_NUMBER,
481: .minimum = 0,
482: .maximum = INT_MAX,
483: .default_num = 0
484: },
485:
486: { .name = "force-width",
487: .type = OPTIONS_TABLE_NUMBER,
488: .minimum = 0,
489: .maximum = INT_MAX,
490: .default_num = 0
491: },
492:
493: { .name = "main-pane-height",
494: .type = OPTIONS_TABLE_NUMBER,
495: .minimum = 1,
496: .maximum = INT_MAX,
497: .default_num = 24
498: },
499:
500: { .name = "main-pane-width",
501: .type = OPTIONS_TABLE_NUMBER,
502: .minimum = 1,
503: .maximum = INT_MAX,
504: .default_num = 80
505: },
506:
507: { .name = "mode-attr",
508: .type = OPTIONS_TABLE_ATTRIBUTES,
509: .default_num = 0
510: },
511:
512: { .name = "mode-bg",
513: .type = OPTIONS_TABLE_COLOUR,
514: .default_num = 3
515: },
516:
517: { .name = "mode-fg",
518: .type = OPTIONS_TABLE_COLOUR,
519: .default_num = 0
520: },
521:
522: { .name = "mode-keys",
523: .type = OPTIONS_TABLE_CHOICE,
524: .choices = options_table_mode_keys_list,
525: .default_num = MODEKEY_EMACS
526: },
527:
528: { .name = "mode-mouse",
1.12 nicm 529: .type = OPTIONS_TABLE_CHOICE,
530: .choices = options_table_mode_mouse_list,
1.1 nicm 531: .default_num = 0
532: },
533:
534: { .name = "monitor-activity",
535: .type = OPTIONS_TABLE_FLAG,
536: .default_num = 0
537: },
538:
539: { .name = "monitor-content",
540: .type = OPTIONS_TABLE_STRING,
541: .default_str = ""
542: },
543:
544: { .name = "monitor-silence",
545: .type = OPTIONS_TABLE_NUMBER,
546: .minimum = 0,
547: .maximum = INT_MAX,
548: .default_num = 0
549: },
550:
551: { .name = "other-pane-height",
552: .type = OPTIONS_TABLE_NUMBER,
553: .minimum = 0,
554: .maximum = INT_MAX,
555: .default_num = 0
556: },
557:
558: { .name = "other-pane-width",
559: .type = OPTIONS_TABLE_NUMBER,
560: .minimum = 0,
561: .maximum = INT_MAX,
1.13 nicm 562: .default_num = 0
563: },
564:
565: { .name = "pane-base-index",
566: .type = OPTIONS_TABLE_NUMBER,
567: .minimum = 0,
568: .maximum = USHRT_MAX,
1.22 nicm 569: .default_num = 0
570: },
571:
1.1 nicm 572: { .name = "remain-on-exit",
573: .type = OPTIONS_TABLE_FLAG,
574: .default_num = 0
575: },
576:
577: { .name = "synchronize-panes",
578: .type = OPTIONS_TABLE_FLAG,
579: .default_num = 0
580: },
581:
582: { .name = "utf8",
583: .type = OPTIONS_TABLE_FLAG,
584: .default_num = 0 /* overridden in main() */
585: },
586:
1.21 nicm 587: { .name = "window-status-activity-attr",
1.1 nicm 588: .type = OPTIONS_TABLE_ATTRIBUTES,
589: .default_num = GRID_ATTR_REVERSE
590: },
591:
1.21 nicm 592: { .name = "window-status-activity-bg",
1.1 nicm 593: .type = OPTIONS_TABLE_COLOUR,
594: .default_num = 8
595: },
596:
1.21 nicm 597: { .name = "window-status-activity-fg",
1.18 nicm 598: .type = OPTIONS_TABLE_COLOUR,
599: .default_num = 8
600: },
601:
1.21 nicm 602: { .name = "window-status-bell-attr",
1.18 nicm 603: .type = OPTIONS_TABLE_ATTRIBUTES,
604: .default_num = GRID_ATTR_REVERSE
605: },
606:
1.21 nicm 607: { .name = "window-status-bell-bg",
1.18 nicm 608: .type = OPTIONS_TABLE_COLOUR,
609: .default_num = 8
610: },
611:
1.21 nicm 612: { .name = "window-status-bell-fg",
1.18 nicm 613: .type = OPTIONS_TABLE_COLOUR,
614: .default_num = 8
615: },
616:
1.21 nicm 617: { .name = "window-status-content-attr",
1.18 nicm 618: .type = OPTIONS_TABLE_ATTRIBUTES,
619: .default_num = GRID_ATTR_REVERSE
620: },
621:
1.21 nicm 622: { .name = "window-status-content-bg",
1.18 nicm 623: .type = OPTIONS_TABLE_COLOUR,
624: .default_num = 8
625: },
626:
1.21 nicm 627: { .name = "window-status-content-fg",
1.1 nicm 628: .type = OPTIONS_TABLE_COLOUR,
629: .default_num = 8
630: },
631:
632: { .name = "window-status-attr",
633: .type = OPTIONS_TABLE_ATTRIBUTES,
634: .default_num = 0
635: },
636:
637: { .name = "window-status-bg",
638: .type = OPTIONS_TABLE_COLOUR,
639: .default_num = 8
640: },
641:
642: { .name = "window-status-current-attr",
643: .type = OPTIONS_TABLE_ATTRIBUTES,
644: .default_num = 0
645: },
646:
647: { .name = "window-status-current-bg",
648: .type = OPTIONS_TABLE_COLOUR,
649: .default_num = 8
650: },
651:
652: { .name = "window-status-current-fg",
653: .type = OPTIONS_TABLE_COLOUR,
654: .default_num = 8
655: },
656:
657: { .name = "window-status-current-format",
658: .type = OPTIONS_TABLE_STRING,
659: .default_str = "#I:#W#F"
660: },
661:
662: { .name = "window-status-fg",
663: .type = OPTIONS_TABLE_COLOUR,
664: .default_num = 8
665: },
666:
667: { .name = "window-status-format",
668: .type = OPTIONS_TABLE_STRING,
669: .default_str = "#I:#W#F"
670: },
671:
672: { .name = "xterm-keys",
673: .type = OPTIONS_TABLE_FLAG,
674: .default_num = 0
675: },
676:
677: { .name = NULL }
678: };
679:
680: /* Populate an options tree from a table. */
681: void
682: options_table_populate_tree(
683: const struct options_table_entry *table, struct options *oo)
684: {
685: const struct options_table_entry *oe;
686:
687: for (oe = table; oe->name != NULL; oe++) {
688: if (oe->default_str != NULL)
689: options_set_string(oo, oe->name, "%s", oe->default_str);
690: else
691: options_set_number(oo, oe->name, oe->default_num);
692: }
693: }
694:
695: /* Print an option using its type from the table. */
696: const char *
697: options_table_print_entry(
698: const struct options_table_entry *oe, struct options_entry *o)
699: {
1.19 nicm 700: static char out[BUFSIZ];
701: const char *s;
1.1 nicm 702:
703: *out = '\0';
704: switch (oe->type) {
705: case OPTIONS_TABLE_STRING:
706: xsnprintf(out, sizeof out, "\"%s\"", o->str);
707: break;
708: case OPTIONS_TABLE_NUMBER:
709: xsnprintf(out, sizeof out, "%lld", o->num);
710: break;
1.19 nicm 711: case OPTIONS_TABLE_KEY:
712: xsnprintf(out, sizeof out, "%s", key_string_lookup_key(o->num));
1.1 nicm 713: break;
714: case OPTIONS_TABLE_COLOUR:
715: s = colour_tostring(o->num);
716: xsnprintf(out, sizeof out, "%s", s);
717: break;
718: case OPTIONS_TABLE_ATTRIBUTES:
719: s = attributes_tostring(o->num);
720: xsnprintf(out, sizeof out, "%s", s);
721: break;
722: case OPTIONS_TABLE_FLAG:
723: if (o->num)
724: strlcpy(out, "on", sizeof out);
725: else
726: strlcpy(out, "off", sizeof out);
727: break;
728: case OPTIONS_TABLE_CHOICE:
729: s = oe->choices[o->num];
730: xsnprintf(out, sizeof out, "%s", s);
731: break;
732: }
733: return (out);
1.22 nicm 734: }
735:
736: /* Find an option. */
737: int
738: options_table_find(
739: const char *optstr, const struct options_table_entry **table,
740: const struct options_table_entry **oe)
741: {
742: static const struct options_table_entry *tables[] = {
743: server_options_table,
744: window_options_table,
745: session_options_table
746: };
747: const struct options_table_entry *oe_loop;
748: u_int i;
749:
750: for (i = 0; i < nitems(tables); i++) {
751: for (oe_loop = tables[i]; oe_loop->name != NULL; oe_loop++) {
752: if (strncmp(oe_loop->name, optstr, strlen(optstr)) != 0)
753: continue;
754:
755: /* If already found, ambiguous. */
756: if (*oe != NULL)
757: return (-1);
758: *oe = oe_loop;
759: *table = tables[i];
760:
761: /* Bail now if an exact match. */
762: if (strcmp((*oe)->name, optstr) == 0)
763: break;
764: }
765: }
766: return (0);
1.1 nicm 767: }