[BACK]Return to cmd-set-window-option.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Diff for /src/usr.bin/tmux/Attic/cmd-set-window-option.c between version 1.15 and 1.16

version 1.15, 2009/11/19 16:22:10 version 1.16, 2009/12/03 17:44:02
Line 18 
Line 18 
   
 #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 *);
Line 40 
Line 37 
         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);  
 }  }

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.16