"Fossies" - the Fresh Open Source Software Archive

Member "tmux-3.2a/options-table.c" (10 Jun 2021, 34817 Bytes) of package /linux/misc/tmux-3.2a.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "options-table.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 3.2_vs_3.2a.

    1 /* $OpenBSD$ */
    2 
    3 /*
    4  * Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
    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 
   23 #include "tmux.h"
   24 
   25 /*
   26  * This file has a tables with all the server, session and window
   27  * options. These tables are the master copy of the options with their real
   28  * (user-visible) types, range limits and default values. At start these are
   29  * copied into the runtime global options trees (which only has number and
   30  * string types). These tables are then used to look up the real type when the
   31  * user sets an option or its value needs to be shown.
   32  */
   33 
   34 /* Choice option type lists. */
   35 static const char *options_table_mode_keys_list[] = {
   36     "emacs", "vi", NULL
   37 };
   38 static const char *options_table_clock_mode_style_list[] = {
   39     "12", "24", NULL
   40 };
   41 static const char *options_table_status_list[] = {
   42     "off", "on", "2", "3", "4", "5", NULL
   43 };
   44 static const char *options_table_status_keys_list[] = {
   45     "emacs", "vi", NULL
   46 };
   47 static const char *options_table_status_justify_list[] = {
   48     "left", "centre", "right", "absolute-centre", NULL
   49 };
   50 static const char *options_table_status_position_list[] = {
   51     "top", "bottom", NULL
   52 };
   53 static const char *options_table_bell_action_list[] = {
   54     "none", "any", "current", "other", NULL
   55 };
   56 static const char *options_table_visual_bell_list[] = {
   57     "off", "on", "both", NULL
   58 };
   59 static const char *options_table_pane_status_list[] = {
   60     "off", "top", "bottom", NULL
   61 };
   62 static const char *options_table_pane_lines_list[] = {
   63     "single", "double", "heavy", "simple", "number", NULL
   64 };
   65 static const char *options_table_set_clipboard_list[] = {
   66     "off", "external", "on", NULL
   67 };
   68 static const char *options_table_window_size_list[] = {
   69     "largest", "smallest", "manual", "latest", NULL
   70 };
   71 static const char *options_table_remain_on_exit_list[] = {
   72     "off", "on", "failed", NULL
   73 };
   74 static const char *options_table_detach_on_destroy_list[] = {
   75     "off", "on", "no-detached", NULL
   76 };
   77 static const char *options_table_extended_keys_list[] = {
   78     "off", "on", "always", NULL
   79 };
   80 
   81 /* Status line format. */
   82 #define OPTIONS_TABLE_STATUS_FORMAT1 \
   83     "#[align=left range=left #{status-left-style}]" \
   84     "#[push-default]" \
   85     "#{T;=/#{status-left-length}:status-left}" \
   86     "#[pop-default]" \
   87     "#[norange default]" \
   88     "#[list=on align=#{status-justify}]" \
   89     "#[list=left-marker]<#[list=right-marker]>#[list=on]" \
   90     "#{W:" \
   91         "#[range=window|#{window_index} " \
   92             "#{window-status-style}" \
   93             "#{?#{&&:#{window_last_flag}," \
   94                 "#{!=:#{window-status-last-style},default}}, " \
   95                 "#{window-status-last-style}," \
   96             "}" \
   97             "#{?#{&&:#{window_bell_flag}," \
   98                 "#{!=:#{window-status-bell-style},default}}, " \
   99                 "#{window-status-bell-style}," \
  100                 "#{?#{&&:#{||:#{window_activity_flag}," \
  101                          "#{window_silence_flag}}," \
  102                     "#{!=:" \
  103                     "#{window-status-activity-style}," \
  104                     "default}}, " \
  105                     "#{window-status-activity-style}," \
  106                 "}" \
  107             "}" \
  108         "]" \
  109         "#[push-default]" \
  110         "#{T:window-status-format}" \
  111         "#[pop-default]" \
  112         "#[norange default]" \
  113         "#{?window_end_flag,,#{window-status-separator}}" \
  114     "," \
  115         "#[range=window|#{window_index} list=focus " \
  116             "#{?#{!=:#{window-status-current-style},default}," \
  117                 "#{window-status-current-style}," \
  118                 "#{window-status-style}" \
  119             "}" \
  120             "#{?#{&&:#{window_last_flag}," \
  121                 "#{!=:#{window-status-last-style},default}}, " \
  122                 "#{window-status-last-style}," \
  123             "}" \
  124             "#{?#{&&:#{window_bell_flag}," \
  125                 "#{!=:#{window-status-bell-style},default}}, " \
  126                 "#{window-status-bell-style}," \
  127                 "#{?#{&&:#{||:#{window_activity_flag}," \
  128                          "#{window_silence_flag}}," \
  129                     "#{!=:" \
  130                     "#{window-status-activity-style}," \
  131                     "default}}, " \
  132                     "#{window-status-activity-style}," \
  133                 "}" \
  134             "}" \
  135         "]" \
  136         "#[push-default]" \
  137         "#{T:window-status-current-format}" \
  138         "#[pop-default]" \
  139         "#[norange list=on default]" \
  140         "#{?window_end_flag,,#{window-status-separator}}" \
  141     "}" \
  142     "#[nolist align=right range=right #{status-right-style}]" \
  143     "#[push-default]" \
  144     "#{T;=/#{status-right-length}:status-right}" \
  145     "#[pop-default]" \
  146     "#[norange default]"
  147 #define OPTIONS_TABLE_STATUS_FORMAT2 \
  148     "#[align=centre]#{P:#{?pane_active,#[reverse],}" \
  149     "#{pane_index}[#{pane_width}x#{pane_height}]#[default] }"
  150 static const char *options_table_status_format_default[] = {
  151     OPTIONS_TABLE_STATUS_FORMAT1, OPTIONS_TABLE_STATUS_FORMAT2, NULL
  152 };
  153 
  154 /* Helpers for hook options. */
  155 #define OPTIONS_TABLE_HOOK(hook_name, default_value) \
  156     { .name = hook_name, \
  157       .type = OPTIONS_TABLE_COMMAND, \
  158       .scope = OPTIONS_TABLE_SESSION, \
  159       .flags = OPTIONS_TABLE_IS_ARRAY|OPTIONS_TABLE_IS_HOOK, \
  160       .default_str = default_value, \
  161       .separator = "" \
  162     }
  163 
  164 #define OPTIONS_TABLE_PANE_HOOK(hook_name, default_value) \
  165     { .name = hook_name, \
  166       .type = OPTIONS_TABLE_COMMAND, \
  167       .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE, \
  168       .flags = OPTIONS_TABLE_IS_ARRAY|OPTIONS_TABLE_IS_HOOK, \
  169       .default_str = default_value, \
  170       .separator = "" \
  171     }
  172 
  173 #define OPTIONS_TABLE_WINDOW_HOOK(hook_name, default_value) \
  174     { .name = hook_name, \
  175       .type = OPTIONS_TABLE_COMMAND, \
  176       .scope = OPTIONS_TABLE_WINDOW, \
  177       .flags = OPTIONS_TABLE_IS_ARRAY|OPTIONS_TABLE_IS_HOOK, \
  178       .default_str = default_value, \
  179       .separator = "" \
  180     }
  181 
  182 /* Map of name conversions. */
  183 const struct options_name_map options_other_names[] = {
  184     { "display-panes-color", "display-panes-colour" },
  185     { "display-panes-active-color", "display-panes-active-colour" },
  186     { "clock-mode-color", "clock-mode-colour" },
  187     { NULL, NULL }
  188 };
  189 
  190 /* Top-level options. */
  191 const struct options_table_entry options_table[] = {
  192     /* Server options. */
  193     { .name = "backspace",
  194       .type = OPTIONS_TABLE_KEY,
  195       .scope = OPTIONS_TABLE_SERVER,
  196       .default_num = '\177',
  197       .text = "The key to send for backspace."
  198     },
  199 
  200     { .name = "buffer-limit",
  201       .type = OPTIONS_TABLE_NUMBER,
  202       .scope = OPTIONS_TABLE_SERVER,
  203       .minimum = 1,
  204       .maximum = INT_MAX,
  205       .default_num = 50,
  206       .text = "The maximum number of automatic buffers. "
  207           "When this is reached, the oldest buffer is deleted."
  208     },
  209 
  210     { .name = "command-alias",
  211       .type = OPTIONS_TABLE_STRING,
  212       .scope = OPTIONS_TABLE_SERVER,
  213       .flags = OPTIONS_TABLE_IS_ARRAY,
  214       .default_str = "split-pane=split-window,"
  215              "splitp=split-window,"
  216              "server-info=show-messages -JT,"
  217              "info=show-messages -JT,"
  218              "choose-window=choose-tree -w,"
  219              "choose-session=choose-tree -s",
  220       .separator = ",",
  221       .text = "Array of command aliases. "
  222           "Each entry is an alias and a command separated by '='."
  223     },
  224 
  225     { .name = "copy-command",
  226       .type = OPTIONS_TABLE_STRING,
  227       .scope = OPTIONS_TABLE_SERVER,
  228       .default_str = "",
  229       .text = "Shell command run when text is copied. "
  230           "If empty, no command is run."
  231     },
  232 
  233     { .name = "default-terminal",
  234       .type = OPTIONS_TABLE_STRING,
  235       .scope = OPTIONS_TABLE_SERVER,
  236       .default_str = "screen",
  237       .text = "Default for the 'TERM' environment variable."
  238     },
  239 
  240     { .name = "editor",
  241       .type = OPTIONS_TABLE_STRING,
  242       .scope = OPTIONS_TABLE_SERVER,
  243       .default_str = _PATH_VI,
  244       .text = "Editor run to edit files."
  245     },
  246 
  247     { .name = "escape-time",
  248       .type = OPTIONS_TABLE_NUMBER,
  249       .scope = OPTIONS_TABLE_SERVER,
  250       .minimum = 0,
  251       .maximum = INT_MAX,
  252       .default_num = 500,
  253       .text = "Time to wait before assuming a key is Escape."
  254     },
  255 
  256     { .name = "exit-empty",
  257       .type = OPTIONS_TABLE_FLAG,
  258       .scope = OPTIONS_TABLE_SERVER,
  259       .default_num = 1,
  260       .text = "Whether the server should exit if there are no sessions."
  261     },
  262 
  263     { .name = "exit-unattached",
  264       .type = OPTIONS_TABLE_FLAG,
  265       .scope = OPTIONS_TABLE_SERVER,
  266       .default_num = 0,
  267       .text = "Whether the server should exit if there are no attached "
  268           "clients."
  269     },
  270 
  271     { .name = "extended-keys",
  272       .type = OPTIONS_TABLE_CHOICE,
  273       .scope = OPTIONS_TABLE_SERVER,
  274       .choices = options_table_extended_keys_list,
  275       .default_num = 0,
  276       .text = "Whether to request extended key sequences from terminals "
  277               "that support it."
  278     },
  279 
  280     { .name = "focus-events",
  281       .type = OPTIONS_TABLE_FLAG,
  282       .scope = OPTIONS_TABLE_SERVER,
  283       .default_num = 0,
  284       .text = "Whether to send focus events to applications."
  285     },
  286 
  287     { .name = "history-file",
  288       .type = OPTIONS_TABLE_STRING,
  289       .scope = OPTIONS_TABLE_SERVER,
  290       .default_str = "",
  291       .text = "Location of the command prompt history file. "
  292           "Empty does not write a history file."
  293     },
  294 
  295     { .name = "message-limit",
  296       .type = OPTIONS_TABLE_NUMBER,
  297       .scope = OPTIONS_TABLE_SERVER,
  298       .minimum = 0,
  299       .maximum = INT_MAX,
  300       .default_num = 1000,
  301       .text = "Maximum number of server messages to keep."
  302     },
  303 
  304     { .name = "set-clipboard",
  305       .type = OPTIONS_TABLE_CHOICE,
  306       .scope = OPTIONS_TABLE_SERVER,
  307       .choices = options_table_set_clipboard_list,
  308       .default_num = 1,
  309       .text = "Whether to attempt to set the system clipboard ('on' or "
  310           "'external') and whether to allow applications to create "
  311           "paste buffers with an escape sequence ('on' only)."
  312     },
  313 
  314     { .name = "terminal-overrides",
  315       .type = OPTIONS_TABLE_STRING,
  316       .scope = OPTIONS_TABLE_SERVER,
  317       .flags = OPTIONS_TABLE_IS_ARRAY,
  318       .default_str = "",
  319       .separator = ",",
  320       .text = "List of terminal capabilities overrides."
  321     },
  322 
  323     { .name = "terminal-features",
  324       .type = OPTIONS_TABLE_STRING,
  325       .scope = OPTIONS_TABLE_SERVER,
  326       .flags = OPTIONS_TABLE_IS_ARRAY,
  327       .default_str = "xterm*:clipboard:ccolour:cstyle:focus:title,"
  328              "screen*:title",
  329       .separator = ",",
  330       .text = "List of terminal features, used if they cannot be "
  331           "automatically detected."
  332     },
  333 
  334     { .name = "user-keys",
  335       .type = OPTIONS_TABLE_STRING,
  336       .scope = OPTIONS_TABLE_SERVER,
  337       .flags = OPTIONS_TABLE_IS_ARRAY,
  338       .default_str = "",
  339       .separator = ",",
  340       .text = "User key assignments. "
  341           "Each sequence in the list is translated into a key: "
  342           "'User0', 'User1' and so on."
  343     },
  344 
  345     /* Session options. */
  346     { .name = "activity-action",
  347       .type = OPTIONS_TABLE_CHOICE,
  348       .scope = OPTIONS_TABLE_SESSION,
  349       .choices = options_table_bell_action_list,
  350       .default_num = ALERT_OTHER,
  351       .text = "Action to take on an activity alert."
  352     },
  353 
  354     { .name = "assume-paste-time",
  355       .type = OPTIONS_TABLE_NUMBER,
  356       .scope = OPTIONS_TABLE_SESSION,
  357       .minimum = 0,
  358       .maximum = INT_MAX,
  359       .default_num = 1,
  360       .unit = "milliseconds",
  361       .text = "Maximum time between input to assume it pasting rather "
  362           "than typing."
  363     },
  364 
  365     { .name = "base-index",
  366       .type = OPTIONS_TABLE_NUMBER,
  367       .scope = OPTIONS_TABLE_SESSION,
  368       .minimum = 0,
  369       .maximum = INT_MAX,
  370       .default_num = 0,
  371       .text = "Default index of the first window in each session."
  372     },
  373 
  374     { .name = "bell-action",
  375       .type = OPTIONS_TABLE_CHOICE,
  376       .scope = OPTIONS_TABLE_SESSION,
  377       .choices = options_table_bell_action_list,
  378       .default_num = ALERT_ANY,
  379       .text = "Action to take on a bell alert."
  380     },
  381 
  382     { .name = "default-command",
  383       .type = OPTIONS_TABLE_STRING,
  384       .scope = OPTIONS_TABLE_SESSION,
  385       .default_str = "",
  386       .text = "Default command to run in new panes. If empty, a shell is "
  387           "started."
  388     },
  389 
  390     { .name = "default-shell",
  391       .type = OPTIONS_TABLE_STRING,
  392       .scope = OPTIONS_TABLE_SESSION,
  393       .default_str = _PATH_BSHELL,
  394       .text = "Location of default shell."
  395     },
  396 
  397     { .name = "default-size",
  398       .type = OPTIONS_TABLE_STRING,
  399       .scope = OPTIONS_TABLE_SESSION,
  400       .pattern = "[0-9]*x[0-9]*",
  401       .default_str = "80x24",
  402       .text = "Initial size of new sessions."
  403     },
  404 
  405     { .name = "destroy-unattached",
  406       .type = OPTIONS_TABLE_FLAG,
  407       .scope = OPTIONS_TABLE_SESSION,
  408       .default_num = 0,
  409       .text = "Whether to destroy sessions when they have no attached "
  410           "clients."
  411     },
  412 
  413     { .name = "detach-on-destroy",
  414       .type = OPTIONS_TABLE_CHOICE,
  415       .scope = OPTIONS_TABLE_SESSION,
  416       .choices = options_table_detach_on_destroy_list,
  417       .default_num = 1,
  418       .text = "Whether to detach when a session is destroyed, or switch "
  419           "the client to another session if any exist."
  420     },
  421 
  422     { .name = "display-panes-active-colour",
  423       .type = OPTIONS_TABLE_COLOUR,
  424       .scope = OPTIONS_TABLE_SESSION,
  425       .default_num = 1,
  426       .text = "Colour of the active pane for 'display-panes'."
  427     },
  428 
  429     { .name = "display-panes-colour",
  430       .type = OPTIONS_TABLE_COLOUR,
  431       .scope = OPTIONS_TABLE_SESSION,
  432       .default_num = 4,
  433       .text = "Colour of not active panes for 'display-panes'."
  434     },
  435 
  436     { .name = "display-panes-time",
  437       .type = OPTIONS_TABLE_NUMBER,
  438       .scope = OPTIONS_TABLE_SESSION,
  439       .minimum = 1,
  440       .maximum = INT_MAX,
  441       .default_num = 1000,
  442       .unit = "milliseconds",
  443       .text = "Time for which 'display-panes' should show pane numbers."
  444     },
  445 
  446     { .name = "display-time",
  447       .type = OPTIONS_TABLE_NUMBER,
  448       .scope = OPTIONS_TABLE_SESSION,
  449       .minimum = 0,
  450       .maximum = INT_MAX,
  451       .default_num = 750,
  452       .unit = "milliseconds",
  453       .text = "Time for which status line messages should appear."
  454     },
  455 
  456     { .name = "history-limit",
  457       .type = OPTIONS_TABLE_NUMBER,
  458       .scope = OPTIONS_TABLE_SESSION,
  459       .minimum = 0,
  460       .maximum = INT_MAX,
  461       .default_num = 2000,
  462       .unit = "lines",
  463       .text = "Maximum number of lines to keep in the history for each "
  464           "pane. "
  465           "If changed, the new value applies only to new panes."
  466     },
  467 
  468     { .name = "key-table",
  469       .type = OPTIONS_TABLE_STRING,
  470       .scope = OPTIONS_TABLE_SESSION,
  471       .default_str = "root",
  472       .text = "Default key table. "
  473           "Key presses are first looked up in this table."
  474     },
  475 
  476     { .name = "lock-after-time",
  477       .type = OPTIONS_TABLE_NUMBER,
  478       .scope = OPTIONS_TABLE_SESSION,
  479       .minimum = 0,
  480       .maximum = INT_MAX,
  481       .default_num = 0,
  482       .unit = "seconds",
  483       .text = "Time after which a client is locked if not used."
  484     },
  485 
  486     { .name = "lock-command",
  487       .type = OPTIONS_TABLE_STRING,
  488       .scope = OPTIONS_TABLE_SESSION,
  489       .default_str = "lock -np",
  490       .text = "Shell command to run to lock a client."
  491     },
  492 
  493     { .name = "message-command-style",
  494       .type = OPTIONS_TABLE_STRING,
  495       .scope = OPTIONS_TABLE_SESSION,
  496       .default_str = "bg=black,fg=yellow",
  497       .flags = OPTIONS_TABLE_IS_STYLE,
  498       .separator = ",",
  499       .text = "Style of the command prompt when in command mode, if "
  500           "'mode-keys' is set to 'vi'."
  501     },
  502 
  503     { .name = "message-style",
  504       .type = OPTIONS_TABLE_STRING,
  505       .scope = OPTIONS_TABLE_SESSION,
  506       .default_str = "bg=yellow,fg=black",
  507       .flags = OPTIONS_TABLE_IS_STYLE,
  508       .separator = ",",
  509       .text = "Style of the command prompt."
  510     },
  511 
  512     { .name = "mouse",
  513       .type = OPTIONS_TABLE_FLAG,
  514       .scope = OPTIONS_TABLE_SESSION,
  515       .default_num = 0,
  516       .text = "Whether the mouse is recognised and mouse key bindings are "
  517           "executed. "
  518           "Applications inside panes can use the mouse even when 'off'."
  519     },
  520 
  521     { .name = "prefix",
  522       .type = OPTIONS_TABLE_KEY,
  523       .scope = OPTIONS_TABLE_SESSION,
  524       .default_num = '\002',
  525       .text = "The prefix key."
  526     },
  527 
  528     { .name = "prefix2",
  529       .type = OPTIONS_TABLE_KEY,
  530       .scope = OPTIONS_TABLE_SESSION,
  531       .default_num = KEYC_NONE,
  532       .text = "A second prefix key."
  533     },
  534 
  535     { .name = "renumber-windows",
  536       .type = OPTIONS_TABLE_FLAG,
  537       .scope = OPTIONS_TABLE_SESSION,
  538       .default_num = 0,
  539       .text = "Whether windows are automatically renumbered rather than "
  540           "leaving gaps."
  541     },
  542 
  543     { .name = "repeat-time",
  544       .type = OPTIONS_TABLE_NUMBER,
  545       .scope = OPTIONS_TABLE_SESSION,
  546       .minimum = 0,
  547       .maximum = SHRT_MAX,
  548       .default_num = 500,
  549       .unit = "milliseconds",
  550       .text = "Time to wait for a key binding to repeat, if it is bound "
  551           "with the '-r' flag."
  552     },
  553 
  554     { .name = "set-titles",
  555       .type = OPTIONS_TABLE_FLAG,
  556       .scope = OPTIONS_TABLE_SESSION,
  557       .default_num = 0,
  558       .text = "Whether to set the terminal title, if supported."
  559     },
  560 
  561     { .name = "set-titles-string",
  562       .type = OPTIONS_TABLE_STRING,
  563       .scope = OPTIONS_TABLE_SESSION,
  564       .default_str = "#S:#I:#W - \"#T\" #{session_alerts}",
  565       .text = "Format of the terminal title to set."
  566     },
  567 
  568     { .name = "silence-action",
  569       .type = OPTIONS_TABLE_CHOICE,
  570       .scope = OPTIONS_TABLE_SESSION,
  571       .choices = options_table_bell_action_list,
  572       .default_num = ALERT_OTHER,
  573       .text = "Action to take on a silence alert."
  574     },
  575 
  576     { .name = "status",
  577       .type = OPTIONS_TABLE_CHOICE,
  578       .scope = OPTIONS_TABLE_SESSION,
  579       .choices = options_table_status_list,
  580       .default_num = 1,
  581       .text = "Number of lines in the status line."
  582     },
  583 
  584     { .name = "status-bg",
  585       .type = OPTIONS_TABLE_COLOUR,
  586       .scope = OPTIONS_TABLE_SESSION,
  587       .default_num = 8,
  588       .text = "Background colour of the status line. This option is "
  589           "deprecated, use 'status-style' instead."
  590     },
  591 
  592     { .name = "status-fg",
  593       .type = OPTIONS_TABLE_COLOUR,
  594       .scope = OPTIONS_TABLE_SESSION,
  595       .default_num = 8,
  596       .text = "Foreground colour of the status line. This option is "
  597           "deprecated, use 'status-style' instead."
  598     },
  599 
  600     { .name = "status-format",
  601       .type = OPTIONS_TABLE_STRING,
  602       .scope = OPTIONS_TABLE_SESSION,
  603       .flags = OPTIONS_TABLE_IS_ARRAY,
  604       .default_arr = options_table_status_format_default,
  605       .text = "Formats for the status lines. "
  606           "Each array member is the format for one status line. "
  607           "The default status line is made up of several components "
  608           "which may be configured individually with other option such "
  609           "as 'status-left'."
  610     },
  611 
  612     { .name = "status-interval",
  613       .type = OPTIONS_TABLE_NUMBER,
  614       .scope = OPTIONS_TABLE_SESSION,
  615       .minimum = 0,
  616       .maximum = INT_MAX,
  617       .default_num = 15,
  618       .unit = "seconds",
  619       .text = "Number of seconds between status line updates."
  620     },
  621 
  622     { .name = "status-justify",
  623       .type = OPTIONS_TABLE_CHOICE,
  624       .scope = OPTIONS_TABLE_SESSION,
  625       .choices = options_table_status_justify_list,
  626       .default_num = 0,
  627       .text = "Position of the window list in the status line."
  628     },
  629 
  630     { .name = "status-keys",
  631       .type = OPTIONS_TABLE_CHOICE,
  632       .scope = OPTIONS_TABLE_SESSION,
  633       .choices = options_table_status_keys_list,
  634       .default_num = MODEKEY_EMACS,
  635       .text = "Key set to use at the command prompt."
  636     },
  637 
  638     { .name = "status-left",
  639       .type = OPTIONS_TABLE_STRING,
  640       .scope = OPTIONS_TABLE_SESSION,
  641       .default_str = "[#{session_name}] ",
  642       .text = "Contents of the left side of the status line."
  643     },
  644 
  645     { .name = "status-left-length",
  646       .type = OPTIONS_TABLE_NUMBER,
  647       .scope = OPTIONS_TABLE_SESSION,
  648       .minimum = 0,
  649       .maximum = SHRT_MAX,
  650       .default_num = 10,
  651       .text = "Maximum width of the left side of the status line."
  652     },
  653 
  654     { .name = "status-left-style",
  655       .type = OPTIONS_TABLE_STRING,
  656       .scope = OPTIONS_TABLE_SESSION,
  657       .default_str = "default",
  658       .flags = OPTIONS_TABLE_IS_STYLE,
  659       .separator = ",",
  660       .text = "Style of the left side of the status line."
  661     },
  662 
  663     { .name = "status-position",
  664       .type = OPTIONS_TABLE_CHOICE,
  665       .scope = OPTIONS_TABLE_SESSION,
  666       .choices = options_table_status_position_list,
  667       .default_num = 1,
  668       .text = "Position of the status line."
  669     },
  670 
  671     { .name = "status-right",
  672       .type = OPTIONS_TABLE_STRING,
  673       .scope = OPTIONS_TABLE_SESSION,
  674       .default_str = "#{?window_bigger,"
  675              "[#{window_offset_x}#,#{window_offset_y}] ,}"
  676              "\"#{=21:pane_title}\" %H:%M %d-%b-%y",
  677       .text = "Contents of the right side of the status line."
  678 
  679     },
  680 
  681     { .name = "status-right-length",
  682       .type = OPTIONS_TABLE_NUMBER,
  683       .scope = OPTIONS_TABLE_SESSION,
  684       .minimum = 0,
  685       .maximum = SHRT_MAX,
  686       .default_num = 40,
  687       .text = "Maximum width of the right side of the status line."
  688     },
  689 
  690     { .name = "status-right-style",
  691       .type = OPTIONS_TABLE_STRING,
  692       .scope = OPTIONS_TABLE_SESSION,
  693       .default_str = "default",
  694       .flags = OPTIONS_TABLE_IS_STYLE,
  695       .separator = ",",
  696       .text = "Style of the right side of the status line."
  697     },
  698 
  699     { .name = "status-style",
  700       .type = OPTIONS_TABLE_STRING,
  701       .scope = OPTIONS_TABLE_SESSION,
  702       .default_str = "bg=green,fg=black",
  703       .flags = OPTIONS_TABLE_IS_STYLE,
  704       .separator = ",",
  705       .text = "Style of the status line."
  706     },
  707 
  708     { .name = "update-environment",
  709       .type = OPTIONS_TABLE_STRING,
  710       .scope = OPTIONS_TABLE_SESSION,
  711       .flags = OPTIONS_TABLE_IS_ARRAY,
  712       .default_str = "DISPLAY KRB5CCNAME SSH_ASKPASS SSH_AUTH_SOCK "
  713              "SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY",
  714       .text = "List of environment variables to update in the session "
  715           "environment when a client is attached."
  716     },
  717 
  718     { .name = "visual-activity",
  719       .type = OPTIONS_TABLE_CHOICE,
  720       .scope = OPTIONS_TABLE_SESSION,
  721       .choices = options_table_visual_bell_list,
  722       .default_num = VISUAL_OFF,
  723       .text = "How activity alerts should be shown: a message ('on'), "
  724           "a message and a bell ('both') or nothing ('off')."
  725     },
  726 
  727     { .name = "visual-bell",
  728       .type = OPTIONS_TABLE_CHOICE,
  729       .scope = OPTIONS_TABLE_SESSION,
  730       .choices = options_table_visual_bell_list,
  731       .default_num = VISUAL_OFF,
  732       .text = "How bell alerts should be shown: a message ('on'), "
  733           "a message and a bell ('both') or nothing ('off')."
  734     },
  735 
  736     { .name = "visual-silence",
  737       .type = OPTIONS_TABLE_CHOICE,
  738       .scope = OPTIONS_TABLE_SESSION,
  739       .choices = options_table_visual_bell_list,
  740       .default_num = VISUAL_OFF,
  741       .text = "How silence alerts should be shown: a message ('on'), "
  742           "a message and a bell ('both') or nothing ('off')."
  743     },
  744 
  745     { .name = "word-separators",
  746       .type = OPTIONS_TABLE_STRING,
  747       .scope = OPTIONS_TABLE_SESSION,
  748       .default_str = " ",
  749       .text = "Characters considered to separate words."
  750     },
  751 
  752     /* Window options. */
  753     { .name = "aggressive-resize",
  754       .type = OPTIONS_TABLE_FLAG,
  755       .scope = OPTIONS_TABLE_WINDOW,
  756       .default_num = 0,
  757       .text = "When 'window-size' is 'smallest', whether the maximum size "
  758           "of a window is the smallest attached session where it is "
  759           "the current window ('on') or the smallest session it is "
  760           "linked to ('off')."
  761     },
  762 
  763     { .name = "allow-rename",
  764       .type = OPTIONS_TABLE_FLAG,
  765       .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
  766       .default_num = 0,
  767       .text = "Whether applications are allowed to use the escape sequence "
  768           "to rename windows."
  769     },
  770 
  771     { .name = "alternate-screen",
  772       .type = OPTIONS_TABLE_FLAG,
  773       .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
  774       .default_num = 1,
  775       .text = "Whether applications are allowed to use the alternate "
  776           "screen."
  777     },
  778 
  779     { .name = "automatic-rename",
  780       .type = OPTIONS_TABLE_FLAG,
  781       .scope = OPTIONS_TABLE_WINDOW,
  782       .default_num = 1,
  783       .text = "Whether windows are automatically renamed."
  784     },
  785 
  786     { .name = "automatic-rename-format",
  787       .type = OPTIONS_TABLE_STRING,
  788       .scope = OPTIONS_TABLE_WINDOW,
  789       .default_str = "#{?pane_in_mode,[tmux],#{pane_current_command}}"
  790              "#{?pane_dead,[dead],}",
  791       .text = "Format used to automatically rename windows."
  792     },
  793 
  794     { .name = "clock-mode-colour",
  795       .type = OPTIONS_TABLE_COLOUR,
  796       .scope = OPTIONS_TABLE_WINDOW,
  797       .default_num = 4,
  798       .text = "Colour of the clock in clock mode."
  799     },
  800 
  801     { .name = "clock-mode-style",
  802       .type = OPTIONS_TABLE_CHOICE,
  803       .scope = OPTIONS_TABLE_WINDOW,
  804       .choices = options_table_clock_mode_style_list,
  805       .default_num = 1,
  806       .text = "Time format of the clock in clock mode."
  807     },
  808 
  809     { .name = "copy-mode-match-style",
  810       .type = OPTIONS_TABLE_STRING,
  811       .scope = OPTIONS_TABLE_WINDOW,
  812       .default_str = "bg=cyan,fg=black",
  813       .flags = OPTIONS_TABLE_IS_STYLE,
  814       .separator = ",",
  815       .text = "Style of search matches in copy mode."
  816     },
  817 
  818     { .name = "copy-mode-current-match-style",
  819       .type = OPTIONS_TABLE_STRING,
  820       .scope = OPTIONS_TABLE_WINDOW,
  821       .default_str = "bg=magenta,fg=black",
  822       .flags = OPTIONS_TABLE_IS_STYLE,
  823       .separator = ",",
  824       .text = "Style of the current search match in copy mode."
  825     },
  826 
  827     { .name = "copy-mode-mark-style",
  828       .type = OPTIONS_TABLE_STRING,
  829       .scope = OPTIONS_TABLE_WINDOW,
  830       .default_str = "bg=red,fg=black",
  831       .flags = OPTIONS_TABLE_IS_STYLE,
  832       .separator = ",",
  833       .text = "Style of the marked line in copy mode."
  834     },
  835 
  836     { .name = "main-pane-height",
  837       .type = OPTIONS_TABLE_STRING,
  838       .scope = OPTIONS_TABLE_WINDOW,
  839       .default_str = "24",
  840       .text = "Height of the main pane in the 'main-horizontal' layout. "
  841           "This may be a percentage, for example '10%'."
  842     },
  843 
  844     { .name = "main-pane-width",
  845       .type = OPTIONS_TABLE_STRING,
  846       .scope = OPTIONS_TABLE_WINDOW,
  847       .default_str = "80",
  848       .text = "Width of the main pane in the 'main-vertical' layout. "
  849           "This may be a percentage, for example '10%'."
  850     },
  851 
  852     { .name = "mode-keys",
  853       .type = OPTIONS_TABLE_CHOICE,
  854       .scope = OPTIONS_TABLE_WINDOW,
  855       .choices = options_table_mode_keys_list,
  856       .default_num = MODEKEY_EMACS,
  857       .text = "Key set used in copy mode."
  858     },
  859 
  860     { .name = "mode-style",
  861       .type = OPTIONS_TABLE_STRING,
  862       .scope = OPTIONS_TABLE_WINDOW,
  863       .default_str = "bg=yellow,fg=black",
  864       .flags = OPTIONS_TABLE_IS_STYLE,
  865       .separator = ",",
  866       .text = "Style of indicators and highlighting in modes."
  867     },
  868 
  869     { .name = "monitor-activity",
  870       .type = OPTIONS_TABLE_FLAG,
  871       .scope = OPTIONS_TABLE_WINDOW,
  872       .default_num = 0,
  873       .text = "Whether an alert is triggered by activity."
  874     },
  875 
  876     { .name = "monitor-bell",
  877       .type = OPTIONS_TABLE_FLAG,
  878       .scope = OPTIONS_TABLE_WINDOW,
  879       .default_num = 1,
  880       .text = "Whether an alert is triggered by a bell."
  881     },
  882 
  883     { .name = "monitor-silence",
  884       .type = OPTIONS_TABLE_NUMBER,
  885       .scope = OPTIONS_TABLE_WINDOW,
  886       .minimum = 0,
  887       .maximum = INT_MAX,
  888       .default_num = 0,
  889       .text = "Time after which an alert is triggered by silence. "
  890           "Zero means no alert."
  891 
  892     },
  893 
  894     { .name = "other-pane-height",
  895       .type = OPTIONS_TABLE_STRING,
  896       .scope = OPTIONS_TABLE_WINDOW,
  897       .default_str = "0",
  898       .text = "Height of the other panes in the 'main-horizontal' layout. "
  899           "This may be a percentage, for example '10%'."
  900     },
  901 
  902     { .name = "other-pane-width",
  903       .type = OPTIONS_TABLE_STRING,
  904       .scope = OPTIONS_TABLE_WINDOW,
  905       .default_str = "0",
  906       .text = "Height of the other panes in the 'main-vertical' layout. "
  907           "This may be a percentage, for example '10%'."
  908     },
  909 
  910     { .name = "pane-active-border-style",
  911       .type = OPTIONS_TABLE_STRING,
  912       .scope = OPTIONS_TABLE_WINDOW,
  913       .default_str = "#{?pane_in_mode,fg=yellow,#{?synchronize-panes,fg=red,fg=green}}",
  914       .flags = OPTIONS_TABLE_IS_STYLE,
  915       .separator = ",",
  916       .text = "Style of the active pane border."
  917     },
  918 
  919     { .name = "pane-base-index",
  920       .type = OPTIONS_TABLE_NUMBER,
  921       .scope = OPTIONS_TABLE_WINDOW,
  922       .minimum = 0,
  923       .maximum = USHRT_MAX,
  924       .default_num = 0,
  925       .text = "Index of the first pane in each window."
  926     },
  927 
  928     { .name = "pane-border-format",
  929       .type = OPTIONS_TABLE_STRING,
  930       .scope = OPTIONS_TABLE_WINDOW,
  931       .default_str = "#{?pane_active,#[reverse],}#{pane_index}#[default] "
  932              "\"#{pane_title}\"",
  933       .text = "Format of text in the pane status lines."
  934     },
  935 
  936     { .name = "pane-border-lines",
  937       .type = OPTIONS_TABLE_CHOICE,
  938       .scope = OPTIONS_TABLE_WINDOW,
  939       .choices = options_table_pane_lines_list,
  940       .default_num = PANE_LINES_SINGLE,
  941       .text = "Type of the pane type lines."
  942     },
  943 
  944     { .name = "pane-border-status",
  945       .type = OPTIONS_TABLE_CHOICE,
  946       .scope = OPTIONS_TABLE_WINDOW,
  947       .choices = options_table_pane_status_list,
  948       .default_num = PANE_STATUS_OFF,
  949       .text = "Position of the pane status lines."
  950     },
  951 
  952     { .name = "pane-border-style",
  953       .type = OPTIONS_TABLE_STRING,
  954       .scope = OPTIONS_TABLE_WINDOW,
  955       .default_str = "default",
  956       .flags = OPTIONS_TABLE_IS_STYLE,
  957       .separator = ",",
  958       .text = "Style of the pane status lines."
  959     },
  960 
  961     { .name = "remain-on-exit",
  962       .type = OPTIONS_TABLE_CHOICE,
  963       .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
  964       .choices = options_table_remain_on_exit_list,
  965       .default_num = 0,
  966       .text = "Whether panes should remain ('on') or be automatically "
  967           "killed ('off' or 'failed') when the program inside exits."
  968     },
  969 
  970     { .name = "synchronize-panes",
  971       .type = OPTIONS_TABLE_FLAG,
  972       .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
  973       .default_num = 0,
  974       .text = "Whether typing should be sent to all panes simultaneously."
  975     },
  976 
  977     { .name = "window-active-style",
  978       .type = OPTIONS_TABLE_STRING,
  979       .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
  980       .default_str = "default",
  981       .flags = OPTIONS_TABLE_IS_STYLE,
  982       .separator = ",",
  983       .text = "Default style of the active pane."
  984     },
  985 
  986     { .name = "window-size",
  987       .type = OPTIONS_TABLE_CHOICE,
  988       .scope = OPTIONS_TABLE_WINDOW,
  989       .choices = options_table_window_size_list,
  990       .default_num = WINDOW_SIZE_LATEST,
  991       .text = "How window size is calculated. "
  992           "'latest' uses the size of the most recently used client, "
  993           "'largest' the largest client, 'smallest' the smallest "
  994           "client and 'manual' a size set by the 'resize-window' "
  995           "command."
  996     },
  997 
  998     { .name = "window-style",
  999       .type = OPTIONS_TABLE_STRING,
 1000       .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
 1001       .default_str = "default",
 1002       .flags = OPTIONS_TABLE_IS_STYLE,
 1003       .separator = ",",
 1004       .text = "Default style of panes that are not the active pane."
 1005     },
 1006 
 1007     { .name = "window-status-activity-style",
 1008       .type = OPTIONS_TABLE_STRING,
 1009       .scope = OPTIONS_TABLE_WINDOW,
 1010       .default_str = "reverse",
 1011       .flags = OPTIONS_TABLE_IS_STYLE,
 1012       .separator = ",",
 1013       .text = "Style of windows in the status line with an activity alert."
 1014     },
 1015 
 1016     { .name = "window-status-bell-style",
 1017       .type = OPTIONS_TABLE_STRING,
 1018       .scope = OPTIONS_TABLE_WINDOW,
 1019       .default_str = "reverse",
 1020       .flags = OPTIONS_TABLE_IS_STYLE,
 1021       .separator = ",",
 1022       .text = "Style of windows in the status line with a bell alert."
 1023     },
 1024 
 1025     { .name = "window-status-current-format",
 1026       .type = OPTIONS_TABLE_STRING,
 1027       .scope = OPTIONS_TABLE_WINDOW,
 1028       .default_str = "#I:#W#{?window_flags,#{window_flags}, }",
 1029       .text = "Format of the current window in the status line."
 1030     },
 1031 
 1032     { .name = "window-status-current-style",
 1033       .type = OPTIONS_TABLE_STRING,
 1034       .scope = OPTIONS_TABLE_WINDOW,
 1035       .default_str = "default",
 1036       .flags = OPTIONS_TABLE_IS_STYLE,
 1037       .separator = ",",
 1038       .text = "Style of the current window in the status line."
 1039     },
 1040 
 1041     { .name = "window-status-format",
 1042       .type = OPTIONS_TABLE_STRING,
 1043       .scope = OPTIONS_TABLE_WINDOW,
 1044       .default_str = "#I:#W#{?window_flags,#{window_flags}, }",
 1045       .text = "Format of windows in the status line, except the current "
 1046           "window."
 1047     },
 1048 
 1049     { .name = "window-status-last-style",
 1050       .type = OPTIONS_TABLE_STRING,
 1051       .scope = OPTIONS_TABLE_WINDOW,
 1052       .default_str = "default",
 1053       .flags = OPTIONS_TABLE_IS_STYLE,
 1054       .separator = ",",
 1055       .text = "Style of the last window in the status line."
 1056     },
 1057 
 1058     { .name = "window-status-separator",
 1059       .type = OPTIONS_TABLE_STRING,
 1060       .scope = OPTIONS_TABLE_WINDOW,
 1061       .default_str = " ",
 1062       .text = "Separator between windows in the status line."
 1063     },
 1064 
 1065     { .name = "window-status-style",
 1066       .type = OPTIONS_TABLE_STRING,
 1067       .scope = OPTIONS_TABLE_WINDOW,
 1068       .default_str = "default",
 1069       .flags = OPTIONS_TABLE_IS_STYLE,
 1070       .separator = ",",
 1071       .text = "Style of windows in the status line, except the current and "
 1072           "last windows."
 1073     },
 1074 
 1075     { .name = "wrap-search",
 1076       .type = OPTIONS_TABLE_FLAG,
 1077       .scope = OPTIONS_TABLE_WINDOW,
 1078       .default_num = 1,
 1079       .text = "Whether searching in copy mode should wrap at the top or "
 1080           "bottom."
 1081     },
 1082 
 1083     { .name = "xterm-keys", /* no longer used */
 1084       .type = OPTIONS_TABLE_FLAG,
 1085       .scope = OPTIONS_TABLE_WINDOW,
 1086       .default_num = 1,
 1087       .text = "Whether xterm-style function key sequences should be sent. "
 1088               "This option is no longer used."
 1089     },
 1090 
 1091     /* Hook options. */
 1092     OPTIONS_TABLE_HOOK("after-bind-key", ""),
 1093     OPTIONS_TABLE_HOOK("after-capture-pane", ""),
 1094     OPTIONS_TABLE_HOOK("after-copy-mode", ""),
 1095     OPTIONS_TABLE_HOOK("after-display-message", ""),
 1096     OPTIONS_TABLE_HOOK("after-display-panes", ""),
 1097     OPTIONS_TABLE_HOOK("after-kill-pane", ""),
 1098     OPTIONS_TABLE_HOOK("after-list-buffers", ""),
 1099     OPTIONS_TABLE_HOOK("after-list-clients", ""),
 1100     OPTIONS_TABLE_HOOK("after-list-keys", ""),
 1101     OPTIONS_TABLE_HOOK("after-list-panes", ""),
 1102     OPTIONS_TABLE_HOOK("after-list-sessions", ""),
 1103     OPTIONS_TABLE_HOOK("after-list-windows", ""),
 1104     OPTIONS_TABLE_HOOK("after-load-buffer", ""),
 1105     OPTIONS_TABLE_HOOK("after-lock-server", ""),
 1106     OPTIONS_TABLE_HOOK("after-new-session", ""),
 1107     OPTIONS_TABLE_HOOK("after-new-window", ""),
 1108     OPTIONS_TABLE_HOOK("after-paste-buffer", ""),
 1109     OPTIONS_TABLE_HOOK("after-pipe-pane", ""),
 1110     OPTIONS_TABLE_HOOK("after-queue", ""),
 1111     OPTIONS_TABLE_HOOK("after-refresh-client", ""),
 1112     OPTIONS_TABLE_HOOK("after-rename-session", ""),
 1113     OPTIONS_TABLE_HOOK("after-rename-window", ""),
 1114     OPTIONS_TABLE_HOOK("after-resize-pane", ""),
 1115     OPTIONS_TABLE_HOOK("after-resize-window", ""),
 1116     OPTIONS_TABLE_HOOK("after-save-buffer", ""),
 1117     OPTIONS_TABLE_HOOK("after-select-layout", ""),
 1118     OPTIONS_TABLE_HOOK("after-select-pane", ""),
 1119     OPTIONS_TABLE_HOOK("after-select-window", ""),
 1120     OPTIONS_TABLE_HOOK("after-send-keys", ""),
 1121     OPTIONS_TABLE_HOOK("after-set-buffer", ""),
 1122     OPTIONS_TABLE_HOOK("after-set-environment", ""),
 1123     OPTIONS_TABLE_HOOK("after-set-hook", ""),
 1124     OPTIONS_TABLE_HOOK("after-set-option", ""),
 1125     OPTIONS_TABLE_HOOK("after-show-environment", ""),
 1126     OPTIONS_TABLE_HOOK("after-show-messages", ""),
 1127     OPTIONS_TABLE_HOOK("after-show-options", ""),
 1128     OPTIONS_TABLE_HOOK("after-split-window", ""),
 1129     OPTIONS_TABLE_HOOK("after-unbind-key", ""),
 1130     OPTIONS_TABLE_HOOK("alert-activity", ""),
 1131     OPTIONS_TABLE_HOOK("alert-bell", ""),
 1132     OPTIONS_TABLE_HOOK("alert-silence", ""),
 1133     OPTIONS_TABLE_HOOK("client-attached", ""),
 1134     OPTIONS_TABLE_HOOK("client-detached", ""),
 1135     OPTIONS_TABLE_HOOK("client-resized", ""),
 1136     OPTIONS_TABLE_HOOK("client-session-changed", ""),
 1137     OPTIONS_TABLE_PANE_HOOK("pane-died", ""),
 1138     OPTIONS_TABLE_PANE_HOOK("pane-exited", ""),
 1139     OPTIONS_TABLE_PANE_HOOK("pane-focus-in", ""),
 1140     OPTIONS_TABLE_PANE_HOOK("pane-focus-out", ""),
 1141     OPTIONS_TABLE_PANE_HOOK("pane-mode-changed", ""),
 1142     OPTIONS_TABLE_PANE_HOOK("pane-set-clipboard", ""),
 1143     OPTIONS_TABLE_PANE_HOOK("pane-title-changed", ""),
 1144     OPTIONS_TABLE_HOOK("session-closed", ""),
 1145     OPTIONS_TABLE_HOOK("session-created", ""),
 1146     OPTIONS_TABLE_HOOK("session-renamed", ""),
 1147     OPTIONS_TABLE_HOOK("session-window-changed", ""),
 1148     OPTIONS_TABLE_WINDOW_HOOK("window-layout-changed", ""),
 1149     OPTIONS_TABLE_WINDOW_HOOK("window-linked", ""),
 1150     OPTIONS_TABLE_WINDOW_HOOK("window-pane-changed", ""),
 1151     OPTIONS_TABLE_WINDOW_HOOK("window-renamed", ""),
 1152     OPTIONS_TABLE_WINDOW_HOOK("window-unlinked", ""),
 1153 
 1154     { .name = NULL }
 1155 };