version 1.15, 2009/11/19 16:22:10 |
version 1.16, 2009/12/03 17:44:02 |
|
|
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
#include "tmux.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 *); |
int cmd_set_window_option_exec(struct cmd *, struct cmd_ctx *); |
|
|
cmd_target_print |
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 |
int |
cmd_set_window_option_exec(struct cmd *self, struct cmd_ctx *ctx) |
cmd_set_window_option_exec(struct cmd *self, struct cmd_ctx *ctx) |
{ |
{ |
struct cmd_target_data *data = self->data; |
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')) |
cmd_set_flag(&data->chflags, 'w'); |
oo = &global_w_options; |
return (cmd_set_option_entry.exec(self, ctx)); |
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); |
|
} |
} |