summaryrefslogtreecommitdiffstats
path: root/cmd-set-window-option.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2009-12-04 22:11:23 +0000
committerTiago Cunha <tcunha@gmx.com>2009-12-04 22:11:23 +0000
commit1caa73afb4da381425160cbff68284a4dab1470b (patch)
treea5fa780cb150af303f72d4ec736fba9316d293a1 /cmd-set-window-option.c
parentddb5bb80fa9b24f47a1e5af9d808427d316bcf4a (diff)
Sync OpenBSD patchset 580:
Eliminate duplicate code and ease the passage for server-wide options by adding a -w flag to set-option and show-options and making setw and showw aliases to set -w and show -w. Note: setw and showw are still there, but now aliases for set -w and show -w.
Diffstat (limited to 'cmd-set-window-option.c')
-rw-r--r--cmd-set-window-option.c165
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));
}