diff options
Diffstat (limited to 'cmd-set-window-option.c')
-rw-r--r-- | cmd-set-window-option.c | 165 |
1 files changed, 4 insertions, 161 deletions
diff --git a/cmd-set-window-option.c b/cmd-set-window-option.c index a66ff5dd..fc6b0ebb 100644 --- a/cmd-set-window-option.c +++ b/cmd-set-window-option.c @@ -1,4 +1,4 @@ -/* $Id: cmd-set-window-option.c,v 1.42 2009-11-19 22:35:10 tcunha Exp $ */ +/* $Id: cmd-set-window-option.c,v 1.43 2009-12-04 22:11:23 tcunha Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> @@ -18,13 +18,10 @@ #include <sys/types.h> -#include <stdlib.h> -#include <string.h> - #include "tmux.h" /* - * Set a window option. + * Set a window option. This is just an alias for set-option -w. */ int cmd_set_window_option_exec(struct cmd *, struct cmd_ctx *); @@ -40,165 +37,11 @@ const struct cmd_entry cmd_set_window_option_entry = { cmd_target_print }; -const char *set_option_mode_keys_list[] = { - "emacs", "vi", NULL -}; -const char *set_option_clock_mode_style_list[] = { - "12", "24", NULL -}; -const struct set_option_entry set_window_option_table[] = { - { "aggressive-resize", SET_OPTION_FLAG, 0, 0, NULL }, - { "automatic-rename", SET_OPTION_FLAG, 0, 0, NULL }, - { "clock-mode-colour", SET_OPTION_COLOUR, 0, 0, NULL }, - { "clock-mode-style", - SET_OPTION_CHOICE, 0, 0, set_option_clock_mode_style_list }, - { "force-height", SET_OPTION_NUMBER, 0, INT_MAX, NULL }, - { "force-width", SET_OPTION_NUMBER, 0, INT_MAX, NULL }, - { "main-pane-height", SET_OPTION_NUMBER, 1, INT_MAX, NULL }, - { "main-pane-width", SET_OPTION_NUMBER, 1, INT_MAX, NULL }, - { "mode-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL }, - { "mode-bg", SET_OPTION_COLOUR, 0, 0, NULL }, - { "mode-fg", SET_OPTION_COLOUR, 0, 0, NULL }, - { "mode-keys", SET_OPTION_CHOICE, 0, 0, set_option_mode_keys_list }, - { "mode-mouse", SET_OPTION_FLAG, 0, 0, NULL }, - { "monitor-activity", SET_OPTION_FLAG, 0, 0, NULL }, - { "monitor-content", SET_OPTION_STRING, 0, 0, NULL }, - { "remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL }, - { "synchronize-panes", SET_OPTION_FLAG, 0, 0, NULL }, - { "utf8", SET_OPTION_FLAG, 0, 0, NULL }, - { "window-status-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL }, - { "window-status-bg", SET_OPTION_COLOUR, 0, 0, NULL }, - { "window-status-current-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL }, - { "window-status-current-bg", SET_OPTION_COLOUR, 0, 0, NULL }, - { "window-status-current-fg", SET_OPTION_COLOUR, 0, 0, NULL }, - { "window-status-current-format", SET_OPTION_STRING, 0, 0, NULL }, - { "window-status-fg", SET_OPTION_COLOUR, 0, 0, NULL }, - { "window-status-format", SET_OPTION_STRING, 0, 0, NULL }, - { "xterm-keys", SET_OPTION_FLAG, 0, 0, NULL }, - { NULL, 0, 0, 0, NULL } -}; - int cmd_set_window_option_exec(struct cmd *self, struct cmd_ctx *ctx) { struct cmd_target_data *data = self->data; - struct winlink *wl; - struct client *c; - struct options *oo; - const struct set_option_entry *entry, *opt; - struct jobs *jobs; - struct job *job, *nextjob; - u_int i; - int try_again; - - if (cmd_check_flag(data->chflags, 'g')) - oo = &global_w_options; - else { - if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) - return (-1); - oo = &wl->window->options; - } - - if (*data->arg == '\0') { - ctx->error(ctx, "invalid option"); - return (-1); - } - - entry = NULL; - for (opt = set_window_option_table; opt->name != NULL; opt++) { - if (strncmp(opt->name, data->arg, strlen(data->arg)) != 0) - continue; - if (entry != NULL) { - ctx->error(ctx, "ambiguous option: %s", data->arg); - return (-1); - } - entry = opt; - - /* Bail now if an exact match. */ - if (strcmp(entry->name, data->arg) == 0) - break; - } - if (entry == NULL) { - ctx->error(ctx, "unknown option: %s", data->arg); - return (-1); - } - - if (cmd_check_flag(data->chflags, 'u')) { - if (cmd_check_flag(data->chflags, 'g')) { - ctx->error(ctx, - "can't unset global option: %s", entry->name); - return (-1); - } - if (data->arg2 != NULL) { - ctx->error(ctx, - "value passed to unset option: %s", entry->name); - return (-1); - } - - options_remove(oo, entry->name); - ctx->info(ctx, "unset option: %s", entry->name); - } else { - switch (entry->type) { - case SET_OPTION_STRING: - set_option_string(ctx, oo, entry, - data->arg2, cmd_check_flag(data->chflags, 'a')); - break; - case SET_OPTION_NUMBER: - set_option_number(ctx, oo, entry, data->arg2); - break; - case SET_OPTION_KEYS: - set_option_keys(ctx, oo, entry, data->arg2); - break; - case SET_OPTION_COLOUR: - set_option_colour(ctx, oo, entry, data->arg2); - break; - case SET_OPTION_ATTRIBUTES: - set_option_attributes(ctx, oo, entry, data->arg2); - break; - case SET_OPTION_FLAG: - set_option_flag(ctx, oo, entry, data->arg2); - break; - case SET_OPTION_CHOICE: - set_option_choice(ctx, oo, entry, data->arg2); - break; - } - } - - recalculate_sizes(); - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - c = ARRAY_ITEM(&clients, i); - if (c != NULL && c->session != NULL) - server_redraw_client(c); - } - - /* - * Special-case: kill all persistent jobs if window-status-format has - * changed. Persistent jobs are only used by the status line at the - * moment so this works XXX. - */ - if (strcmp(entry->name, "window-status-format") == 0) { - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - c = ARRAY_ITEM(&clients, i); - if (c == NULL || c->session == NULL) - continue; - - jobs = &c->status_jobs; - do { - try_again = 0; - job = RB_ROOT(jobs); - while (job != NULL) { - nextjob = RB_NEXT(jobs, jobs, job); - if (job->flags & JOB_PERSIST) { - job_remove(jobs, job); - try_again = 1; - break; - } - job = nextjob; - } - } while (try_again); - server_redraw_client(c); - } - } - return (0); + cmd_set_flag(&data->chflags, 'w'); + return (cmd_set_option_entry.exec(self, ctx)); } |