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