Annotation of src/usr.bin/tmux/options-table.c, Revision 1.3
1.3 ! nicm 1: /* $OpenBSD: options-table.c,v 1.2 2011/01/03 23:35:21 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,
58: .default_num = 9
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
194: },
195:
196: { .name = "mouse-select-pane",
1.2 nicm 197: .type = OPTIONS_TABLE_FLAG,
198: .default_num = 0
199: },
200:
201: { .name = "mouse-utf8",
1.1 nicm 202: .type = OPTIONS_TABLE_FLAG,
203: .default_num = 0
204: },
205:
206: { .name = "pane-active-border-bg",
207: .type = OPTIONS_TABLE_COLOUR,
208: .default_num = 8
209: },
210:
211: { .name = "pane-active-border-fg",
212: .type = OPTIONS_TABLE_COLOUR,
213: .default_num = 2
214: },
215:
216: { .name = "pane-border-bg",
217: .type = OPTIONS_TABLE_COLOUR,
218: .default_num = 8
219: },
220:
221: { .name = "pane-border-fg",
222: .type = OPTIONS_TABLE_COLOUR,
223: .default_num = 8
224: },
225:
226: { .name = "prefix",
227: .type = OPTIONS_TABLE_KEYS,
228: /* set in main() */
229: },
230:
231: { .name = "repeat-time",
232: .type = OPTIONS_TABLE_NUMBER,
233: .minimum = 0,
234: .maximum = SHRT_MAX,
235: .default_num = 500
236: },
237:
238: { .name = "set-remain-on-exit",
239: .type = OPTIONS_TABLE_FLAG,
240: .default_num = 0
241: },
242:
243: { .name = "set-titles",
244: .type = OPTIONS_TABLE_FLAG,
245: .default_num = 0
246: },
247:
248: { .name = "set-titles-string",
249: .type = OPTIONS_TABLE_STRING,
250: .default_str = "#S:#I:#W - \"#T\""
251: },
252:
253: { .name = "status",
254: .type = OPTIONS_TABLE_FLAG,
255: .default_num = 1
256: },
257:
258: { .name = "status-attr",
259: .type = OPTIONS_TABLE_ATTRIBUTES,
260: .default_num = 0
261: },
262:
263: { .name = "status-bg",
264: .type = OPTIONS_TABLE_COLOUR,
265: .default_num = 2
266: },
267:
268: { .name = "status-fg",
269: .type = OPTIONS_TABLE_COLOUR,
270: .default_num = 0
271: },
272:
273: { .name = "status-interval",
274: .type = OPTIONS_TABLE_NUMBER,
275: .minimum = 0,
276: .maximum = INT_MAX,
277: .default_num = 15
278: },
279:
280: { .name = "status-justify",
281: .type = OPTIONS_TABLE_CHOICE,
282: .choices = options_table_status_justify_list,
283: .default_num = 0
284: },
285:
286: { .name = "status-keys",
287: .type = OPTIONS_TABLE_CHOICE,
288: .choices = options_table_status_keys_list,
289: .default_num = MODEKEY_EMACS
290: },
291:
292: { .name = "status-left",
293: .type = OPTIONS_TABLE_STRING,
294: .default_str = "[#S]"
295: },
296:
297: { .name = "status-left-attr",
298: .type = OPTIONS_TABLE_ATTRIBUTES,
299: .default_num = 0
300: },
301:
302: { .name = "status-left-bg",
303: .type = OPTIONS_TABLE_COLOUR,
304: .default_num = 8
305: },
306:
307: { .name = "status-left-fg",
308: .type = OPTIONS_TABLE_COLOUR,
309: .default_num = 8
310: },
311:
312: { .name = "status-left-length",
313: .type = OPTIONS_TABLE_NUMBER,
314: .minimum = 0,
315: .maximum = SHRT_MAX,
316: .default_num = 10
317: },
318:
319: { .name = "status-right",
320: .type = OPTIONS_TABLE_STRING,
321: .default_str = "\"#22T\" %H:%M %d-%b-%y"
322: },
323:
324: { .name = "status-right-attr",
325: .type = OPTIONS_TABLE_ATTRIBUTES,
326: .default_num = 0
327: },
328:
329: { .name = "status-right-bg",
330: .type = OPTIONS_TABLE_COLOUR,
331: .default_num = 8
332: },
333:
334: { .name = "status-right-fg",
335: .type = OPTIONS_TABLE_COLOUR,
336: .default_num = 8
337: },
338:
339: { .name = "status-right-length",
340: .type = OPTIONS_TABLE_NUMBER,
341: .minimum = 0,
342: .maximum = SHRT_MAX,
343: .default_num = 40
344: },
345:
346: { .name = "status-utf8",
347: .type = OPTIONS_TABLE_FLAG,
348: .default_num = 0 /* overridden in main() */
349: },
350:
351: { .name = "terminal-overrides",
352: .type = OPTIONS_TABLE_STRING,
353: .default_str = "*88col*:colors=88,*256col*:colors=256"
354: },
355:
356: { .name = "update-environment",
357: .type = OPTIONS_TABLE_STRING,
358: .default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
359: "SSH_CONNECTION WINDOWID XAUTHORITY"
360:
361: },
362:
363: { .name = "visual-activity",
364: .type = OPTIONS_TABLE_FLAG,
365: .default_num = 0
366: },
367:
368: { .name = "visual-bell",
369: .type = OPTIONS_TABLE_FLAG,
370: .default_num = 0
371: },
372:
373: { .name = "visual-content",
374: .type = OPTIONS_TABLE_FLAG,
375: .default_num = 0
376: },
377:
378: { .name = "visual-silence",
379: .type = OPTIONS_TABLE_FLAG,
380: .default_num = 0
381: },
382:
383: { .name = NULL }
384: };
385:
386: /* Window options. */
387: const struct options_table_entry window_options_table[] = {
388: { .name = "aggressive-resize",
389: .type = OPTIONS_TABLE_FLAG,
390: .default_num = 0
391: },
392:
393: { .name = "alternate-screen",
394: .type = OPTIONS_TABLE_FLAG,
395: .default_num = 1
396: },
397:
398: { .name = "automatic-rename",
399: .type = OPTIONS_TABLE_FLAG,
400: .default_num = 1
401: },
402:
403: { .name = "clock-mode-colour",
404: .type = OPTIONS_TABLE_COLOUR,
405: .default_num = 4
406: },
407:
408: { .name = "clock-mode-style",
409: .type = OPTIONS_TABLE_CHOICE,
410: .choices = options_table_clock_mode_style_list,
411: .default_num = 1
412: },
413:
414: { .name = "force-height",
415: .type = OPTIONS_TABLE_NUMBER,
416: .minimum = 0,
417: .maximum = INT_MAX,
418: .default_num = 0
419: },
420:
421: { .name = "force-width",
422: .type = OPTIONS_TABLE_NUMBER,
423: .minimum = 0,
424: .maximum = INT_MAX,
425: .default_num = 0
426: },
427:
428: { .name = "main-pane-height",
429: .type = OPTIONS_TABLE_NUMBER,
430: .minimum = 1,
431: .maximum = INT_MAX,
432: .default_num = 24
433: },
434:
435: { .name = "main-pane-width",
436: .type = OPTIONS_TABLE_NUMBER,
437: .minimum = 1,
438: .maximum = INT_MAX,
439: .default_num = 80
440: },
441:
442: { .name = "mode-attr",
443: .type = OPTIONS_TABLE_ATTRIBUTES,
444: .default_num = 0
445: },
446:
447: { .name = "mode-bg",
448: .type = OPTIONS_TABLE_COLOUR,
449: .default_num = 3
450: },
451:
452: { .name = "mode-fg",
453: .type = OPTIONS_TABLE_COLOUR,
454: .default_num = 0
455: },
456:
457: { .name = "mode-keys",
458: .type = OPTIONS_TABLE_CHOICE,
459: .choices = options_table_mode_keys_list,
460: .default_num = MODEKEY_EMACS
461: },
462:
463: { .name = "mode-mouse",
464: .type = OPTIONS_TABLE_FLAG,
465: .default_num = 0
466: },
467:
468: { .name = "monitor-activity",
469: .type = OPTIONS_TABLE_FLAG,
470: .default_num = 0
471: },
472:
473: { .name = "monitor-content",
474: .type = OPTIONS_TABLE_STRING,
475: .default_str = ""
476: },
477:
478: { .name = "monitor-silence",
479: .type = OPTIONS_TABLE_NUMBER,
480: .minimum = 0,
481: .maximum = INT_MAX,
482: .default_num = 0
483: },
484:
485: { .name = "other-pane-height",
486: .type = OPTIONS_TABLE_NUMBER,
487: .minimum = 0,
488: .maximum = INT_MAX,
489: .default_num = 0
490: },
491:
492: { .name = "other-pane-width",
493: .type = OPTIONS_TABLE_NUMBER,
494: .minimum = 0,
495: .maximum = INT_MAX,
496: .default_num = 0
497: },
498:
499: { .name = "remain-on-exit",
500: .type = OPTIONS_TABLE_FLAG,
501: .default_num = 0
502: },
503:
504: { .name = "synchronize-panes",
505: .type = OPTIONS_TABLE_FLAG,
506: .default_num = 0
507: },
508:
509: { .name = "utf8",
510: .type = OPTIONS_TABLE_FLAG,
511: .default_num = 0 /* overridden in main() */
512: },
513:
514: { .name = "window-status-alert-attr",
515: .type = OPTIONS_TABLE_ATTRIBUTES,
516: .default_num = GRID_ATTR_REVERSE
517: },
518:
519: { .name = "window-status-alert-bg",
520: .type = OPTIONS_TABLE_COLOUR,
521: .default_num = 8
522: },
523:
524: { .name = "window-status-alert-fg",
525: .type = OPTIONS_TABLE_COLOUR,
526: .default_num = 8
527: },
528:
529: { .name = "window-status-attr",
530: .type = OPTIONS_TABLE_ATTRIBUTES,
531: .default_num = 0
532: },
533:
534: { .name = "window-status-bg",
535: .type = OPTIONS_TABLE_COLOUR,
536: .default_num = 8
537: },
538:
539: { .name = "window-status-current-attr",
540: .type = OPTIONS_TABLE_ATTRIBUTES,
541: .default_num = 0
542: },
543:
544: { .name = "window-status-current-bg",
545: .type = OPTIONS_TABLE_COLOUR,
546: .default_num = 8
547: },
548:
549: { .name = "window-status-current-fg",
550: .type = OPTIONS_TABLE_COLOUR,
551: .default_num = 8
552: },
553:
554: { .name = "window-status-current-format",
555: .type = OPTIONS_TABLE_STRING,
556: .default_str = "#I:#W#F"
557: },
558:
559: { .name = "window-status-fg",
560: .type = OPTIONS_TABLE_COLOUR,
561: .default_num = 8
562: },
563:
564: { .name = "window-status-format",
565: .type = OPTIONS_TABLE_STRING,
566: .default_str = "#I:#W#F"
567: },
568:
569: { .name = "word-separators",
570: .type = OPTIONS_TABLE_STRING,
571: .default_str = " -_@"
572: },
573:
574: { .name = "xterm-keys",
575: .type = OPTIONS_TABLE_FLAG,
576: .default_num = 0
577: },
578:
579: { .name = NULL }
580: };
581:
582: /* Populate an options tree from a table. */
583: void
584: options_table_populate_tree(
585: const struct options_table_entry *table, struct options *oo)
586: {
587: const struct options_table_entry *oe;
588:
589: for (oe = table; oe->name != NULL; oe++) {
590: if (oe->default_str != NULL)
591: options_set_string(oo, oe->name, "%s", oe->default_str);
592: else
593: options_set_number(oo, oe->name, oe->default_num);
594: }
595: }
596:
597: /* Print an option using its type from the table. */
598: const char *
599: options_table_print_entry(
600: const struct options_table_entry *oe, struct options_entry *o)
601: {
602: static char out[BUFSIZ];
603: const char *s;
604: struct keylist *keylist;
605: u_int i;
606:
607: *out = '\0';
608: switch (oe->type) {
609: case OPTIONS_TABLE_STRING:
610: xsnprintf(out, sizeof out, "\"%s\"", o->str);
611: break;
612: case OPTIONS_TABLE_NUMBER:
613: xsnprintf(out, sizeof out, "%lld", o->num);
614: break;
615: case OPTIONS_TABLE_KEYS:
616: keylist = o->data;
617: for (i = 0; i < ARRAY_LENGTH(keylist); i++) {
618: s = key_string_lookup_key(ARRAY_ITEM(keylist, i));
619: strlcat(out, s, sizeof out);
620: if (i != ARRAY_LENGTH(keylist) - 1)
621: strlcat(out, ",", sizeof out);
622: }
623: break;
624: case OPTIONS_TABLE_COLOUR:
625: s = colour_tostring(o->num);
626: xsnprintf(out, sizeof out, "%s", s);
627: break;
628: case OPTIONS_TABLE_ATTRIBUTES:
629: s = attributes_tostring(o->num);
630: xsnprintf(out, sizeof out, "%s", s);
631: break;
632: case OPTIONS_TABLE_FLAG:
633: if (o->num)
634: strlcpy(out, "on", sizeof out);
635: else
636: strlcpy(out, "off", sizeof out);
637: break;
638: case OPTIONS_TABLE_CHOICE:
639: s = oe->choices[o->num];
640: xsnprintf(out, sizeof out, "%s", s);
641: break;
642: }
643: return (out);
644: }