diff options
Diffstat (limited to 'cmd-set-window-option.c')
-rw-r--r-- | cmd-set-window-option.c | 337 |
1 files changed, 78 insertions, 259 deletions
diff --git a/cmd-set-window-option.c b/cmd-set-window-option.c index cafce6bb..c628da8d 100644 --- a/cmd-set-window-option.c +++ b/cmd-set-window-option.c @@ -1,7 +1,7 @@ -/* $Id: cmd-set-window-option.c,v 1.13 2008-11-16 13:28:59 nicm Exp $ */ +/* $Id: cmd-set-window-option.c,v 1.14 2008-12-08 16:19:51 nicm Exp $ */ /* - * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> + * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -35,286 +35,105 @@ void cmd_set_window_option_recv(struct cmd *, struct buffer *); void cmd_set_window_option_free(struct cmd *); void cmd_set_window_option_print(struct cmd *, char *, size_t); -struct cmd_set_window_option_data { - char *target; - char *option; - char *value; -}; - const struct cmd_entry cmd_set_window_option_entry = { "set-window-option", "setw", - "[-t target-window] option value", - 0, + "[-g] [-t target-window] option value", + CMD_GFLAG, NULL, - cmd_set_window_option_parse, + cmd_option_parse, cmd_set_window_option_exec, - cmd_set_window_option_send, - cmd_set_window_option_recv, - cmd_set_window_option_free, - cmd_set_window_option_print + cmd_option_send, + cmd_option_recv, + cmd_option_free, + cmd_option_print }; -int -cmd_set_window_option_parse( - struct cmd *self, int argc, char **argv, char **cause) -{ - struct cmd_set_window_option_data *data; - int opt; - - self->data = data = xmalloc(sizeof *data); - data->target = NULL; - data->option = NULL; - data->value = NULL; - - while ((opt = getopt(argc, argv, GETOPT_PREFIX "t:")) != EOF) { - switch (opt) { - case 't': - if (data->target == NULL) - data->target = xstrdup(optarg); - break; - default: - goto usage; - } - } - argc -= optind; - argv += optind; - if (argc != 1 && argc != 2) - goto usage; - - data->option = xstrdup(argv[0]); - if (argc == 2) - data->value = xstrdup(argv[1]); - - return (0); - -usage: - xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage); - - self->entry->free(self); - return (-1); -} +const char *set_option_mode_keys_list[] = { + "emacs", "vi", NULL +}; +const struct set_option_entry set_window_option_table[NSETWINDOWOPTION] = { + { "aggressive-resize", SET_OPTION_FLAG, 0, 0, NULL }, + { "force-height", SET_OPTION_NUMBER, 0, INT_MAX, NULL }, + { "force-width", SET_OPTION_NUMBER, 0, INT_MAX, 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 }, + { "monitor-activity", SET_OPTION_FLAG, 0, 0, NULL }, + { "remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL }, + { "utf8", SET_OPTION_FLAG, 0, 0, NULL }, +}; void cmd_set_window_option_exec(struct cmd *self, struct cmd_ctx *ctx) { - struct cmd_set_window_option_data *data = self->data; - struct winlink *wl; - struct session *s; - const char *errstr; - int number, flag; - u_int i; - - if (data == NULL) - return; - - wl = cmd_find_window(ctx, data->target, &s); - if (wl == NULL) - return; + struct cmd_option_data *data = self->data; + struct winlink *wl; + struct client *c; + struct options *oo; + const struct set_option_entry *entry; + u_int i; + + if (data->flags & CMD_GFLAG) + oo = &global_window_options; + else { + if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) + return; + oo = &wl->window->options; + } if (*data->option == '\0') { ctx->error(ctx, "invalid option"); return; } - number = -1; - if (data->value != NULL) { - number = strtonum(data->value, 0, INT_MAX, &errstr); - - flag = -1; - if (number == 1 || strcasecmp(data->value, "on") == 0 || - strcasecmp(data->value, "yes") == 0) - flag = 1; - else if (number == 0 || strcasecmp(data->value, "off") == 0 || - strcasecmp(data->value, "no") == 0) - flag = 0; - } else - flag = -2; - - if (strcmp(data->option, "monitor-activity") == 0) { - if (flag == -1) { - ctx->error(ctx, "bad value: %s", data->value); + entry = NULL; + for (i = 0; i < NSETWINDOWOPTION; i++) { + if (strncmp(set_window_option_table[i].name, + data->option, strlen(data->option)) != 0) + continue; + if (entry != NULL) { + ctx->error(ctx, "ambiguous option: %s", data->option); return; } + entry = &set_window_option_table[i]; - if (flag == -2) - wl->window->flags ^= WINDOW_MONITOR; - else { - if (flag) - wl->window->flags |= WINDOW_MONITOR; - else - wl->window->flags &= ~WINDOW_MONITOR; - } - - if (wl->window->flags & WINDOW_MONITOR) { - ctx->info(ctx, "window %s:%d: set %s", - s->name, wl->idx, data->option); - } else { - ctx->info(ctx, "window %s:%d: cleared %s", - s->name, wl->idx, data->option); - } - - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - s = ARRAY_ITEM(&sessions, i); - if (s != NULL) - session_alert_cancel(s, wl); - } - } else if (strcmp(data->option, "aggressive-resize") == 0) { - if (flag == -1) { - ctx->error(ctx, "bad value: %s", data->value); - return; - } - - if (flag == -2) - wl->window->flags ^= WINDOW_AGGRESSIVE; - else { - if (flag) - wl->window->flags |= WINDOW_AGGRESSIVE; - else - wl->window->flags &= ~WINDOW_AGGRESSIVE; - } - - if (wl->window->flags & WINDOW_AGGRESSIVE) { - ctx->info(ctx, "window %s:%d: set %s", - s->name, wl->idx, data->option); - } else { - ctx->info(ctx, "window %s:%d: cleared %s", - s->name, wl->idx, data->option); - } - - recalculate_sizes(); - } else if (strcmp(data->option, "utf8") == 0) { - if (flag == -1) { - ctx->error(ctx, "bad value: %s", data->value); - return; - } - - if (flag == -2) - wl->window->flags ^= WINDOW_UTF8; - else { - if (flag) - wl->window->flags |= WINDOW_UTF8; - else - wl->window->flags &= ~WINDOW_UTF8; - } - - if (wl->window->flags & WINDOW_UTF8) { - ctx->info(ctx, "window %s:%d: set %s", - s->name, wl->idx, data->option); - } else { - ctx->info(ctx, "window %s:%d: cleared %s", - s->name, wl->idx, data->option); - } - - recalculate_sizes(); - } else if (strcmp(data->option, "force-width") == 0) { - if (data->value == NULL || number == -1) { - ctx->error(ctx, "invalid value"); - return; - } - if (errstr != NULL) { - ctx->error(ctx, "force-width %s", errstr); - return; - } - if (number == 0) - wl->window->limitx = UINT_MAX; - else - wl->window->limitx = number; - - ctx->info(ctx, "window %s:%d: set force-width %u", - s->name, wl->idx, number); - - recalculate_sizes(); - } else if (strcmp(data->option, "force-height") == 0) { - if (data->value == NULL || number == -1) { - ctx->error(ctx, "invalid value"); - return; - } - if (errstr != NULL) { - ctx->error(ctx, "force-height %s", errstr); - return; - } - if (number == 0) - wl->window->limity = UINT_MAX; - else - wl->window->limity = number; - - ctx->info(ctx, "window %s:%d: set force-height %u", - s->name, wl->idx, number); - - recalculate_sizes(); - } else if (strcmp(data->option, "remain-on-exit") == 0) { - if (flag == -1) { - ctx->error(ctx, "bad value: %s", data->value); - return; - } - - if (flag == -2) - wl->window->flags ^= WINDOW_ZOMBIFY; - else { - if (flag) - wl->window->flags |= WINDOW_ZOMBIFY; - else - wl->window->flags &= ~WINDOW_ZOMBIFY; - } - } else { + /* Bail now if an exact match. */ + if (strcmp(entry->name, data->option) == 0) + break; + } + if (entry == NULL) { ctx->error(ctx, "unknown option: %s", data->option); return; } - if (ctx->cmdclient != NULL) - server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0); -} - -void -cmd_set_window_option_send(struct cmd *self, struct buffer *b) -{ - struct cmd_set_window_option_data *data = self->data; - - buffer_write(b, data, sizeof *data); - cmd_send_string(b, data->target); - cmd_send_string(b, data->option); - cmd_send_string(b, data->value); -} - -void -cmd_set_window_option_recv(struct cmd *self, struct buffer *b) -{ - struct cmd_set_window_option_data *data; - - self->data = data = xmalloc(sizeof *data); - buffer_read(b, data, sizeof *data); - data->target = cmd_recv_string(b); - data->option = cmd_recv_string(b); - data->value = cmd_recv_string(b); -} - -void -cmd_set_window_option_free(struct cmd *self) -{ - struct cmd_set_window_option_data *data = self->data; - - if (data->target != NULL) - xfree(data->target); - if (data->option != NULL) - xfree(data->option); - if (data->value != NULL) - xfree(data->value); - xfree(data); -} + switch (entry->type) { + case SET_OPTION_STRING: + set_option_string(ctx, oo, entry, data->value); + break; + case SET_OPTION_NUMBER: + set_option_number(ctx, oo, entry, data->value); + break; + case SET_OPTION_KEY: + set_option_key(ctx, oo, entry, data->value); + break; + case SET_OPTION_COLOUR: + set_option_colour(ctx, oo, entry, data->value); + break; + case SET_OPTION_FLAG: + set_option_flag(ctx, oo, entry, data->value); + break; + case SET_OPTION_CHOICE: + set_option_choice(ctx, oo, entry, data->value); + break; + } -void -cmd_set_window_option_print(struct cmd *self, char *buf, size_t len) -{ - struct cmd_set_window_option_data *data = self->data; - size_t off = 0; + 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); + } - off += xsnprintf(buf, len, "%s", self->entry->name); - if (data == NULL) - return; - if (off < len && data->target != NULL) - off += xsnprintf(buf + off, len - off, " -t %s", data->target); - if (off < len && data->option != NULL) - off += xsnprintf(buf + off, len - off, " %s", data->option); - if (off < len && data->value != NULL) - off += xsnprintf(buf + off, len - off, " %s", data->value); + if (ctx->cmdclient != NULL) + server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0); } |