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

Diff for /src/usr.bin/tmux/cmd-split-window.c between version 1.91 and 1.92

version 1.91, 2018/10/18 08:38:01 version 1.92, 2019/04/17 14:37:48
Line 53 
Line 53 
 static enum cmd_retval  static enum cmd_retval
 cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)  cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
 {  {
         struct cmd_find_state   *current = &item->shared->current;  
         struct args             *args = self->args;          struct args             *args = self->args;
           struct cmd_find_state   *current = &item->shared->current;
           struct spawn_context     sc;
         struct client           *c = cmd_find_client(item, NULL, 1);          struct client           *c = cmd_find_client(item, NULL, 1);
         struct session          *s = item->target.s;          struct session          *s = item->target.s;
         struct winlink          *wl = item->target.wl;          struct winlink          *wl = item->target.wl;
         struct window           *w = wl->window;          struct window_pane      *wp = item->target.wp, *new_wp;
         struct window_pane      *wp = item->target.wp, *new_wp = NULL;  
         struct environ          *env;  
         const char              *cmd, *path, *shell, *template, *tmp;  
         char                   **argv, *cause, *new_cause, *cp, *cwd;  
         u_int                    hlimit;  
         int                      argc, size, percentage, before;  
         enum layout_type         type;          enum layout_type         type;
         struct layout_cell      *lc;          struct layout_cell      *lc;
         struct environ_entry    *envent;          struct cmd_find_state    fs;
         struct cmd_find_state    fs;          int                      size, percentage, flags;
           const char              *template;
           char                    *cause, *cp;
   
         server_unzoom_window(w);  
   
         if (args->argc == 0) {  
                 cmd = options_get_string(s->options, "default-command");  
                 if (cmd != NULL && *cmd != '\0') {  
                         argc = 1;  
                         argv = (char **)&cmd;  
                 } else {  
                         argc = 0;  
                         argv = NULL;  
                 }  
         } else {  
                 argc = args->argc;  
                 argv = args->argv;  
         }  
   
         if ((tmp = args_get(args, 'c')) != NULL)  
                 cwd = format_single(item, tmp, c, s, NULL, NULL);  
         else  
                 cwd = xstrdup(server_client_get_cwd(item->client, s));  
   
         type = LAYOUT_TOPBOTTOM;  
         if (args_has(args, 'h'))          if (args_has(args, 'h'))
                 type = LAYOUT_LEFTRIGHT;                  type = LAYOUT_LEFTRIGHT;
         before = args_has(args, 'b');          else
                   type = LAYOUT_TOPBOTTOM;
         size = -1;  
         if (args_has(args, 'l')) {          if (args_has(args, 'l')) {
                 size = args_strtonum(args, 'l', 0, INT_MAX, &cause);                  size = args_strtonum(args, 'l', 0, INT_MAX, &cause);
                 if (cause != NULL) {                  if (cause != NULL) {
                         xasprintf(&new_cause, "size %s", cause);                          cmdq_error(item, "create pane failed: -l %s", cause);
                         free(cause);                          free(cause);
                         cause = new_cause;                          return (CMD_RETURN_ERROR);
                         goto error;  
                 }                  }
         } else if (args_has(args, 'p')) {          } else if (args_has(args, 'p')) {
                 percentage = args_strtonum(args, 'p', 0, INT_MAX, &cause);                  percentage = args_strtonum(args, 'p', 0, INT_MAX, &cause);
                 if (cause != NULL) {                  if (cause != NULL) {
                         xasprintf(&new_cause, "percentage %s", cause);                          cmdq_error(item, "create pane failed: -p %s", cause);
                         free(cause);                          free(cause);
                         cause = new_cause;                          return (CMD_RETURN_ERROR);
                         goto error;  
                 }                  }
                 if (type == LAYOUT_TOPBOTTOM)                  if (type == LAYOUT_TOPBOTTOM)
                         size = (wp->sy * percentage) / 100;                          size = (wp->sy * percentage) / 100;
                 else                  else
                         size = (wp->sx * percentage) / 100;                          size = (wp->sx * percentage) / 100;
         }          } else
         hlimit = options_get_number(s->options, "history-limit");                  size = -1;
   
         shell = options_get_string(s->options, "default-shell");          server_unzoom_window(wp->window);
         if (*shell == '\0' || areshell(shell))  
                 shell = _PATH_BSHELL;  
   
         lc = layout_split_pane(wp, type, size, before, args_has(args, 'f'));          flags = 0;
           if (args_has(args, 'b'))
                   flags |= SPAWN_BEFORE;
           if (args_has(args, 'f'))
                   flags |= SPAWN_FULLSIZE;
   
           lc = layout_split_pane(wp, type, size, flags);
         if (lc == NULL) {          if (lc == NULL) {
                 cause = xstrdup("pane too small");                  cmdq_error(item, "no space for new pane");
                 goto error;                  return (CMD_RETURN_ERROR);
         }          }
         new_wp = window_add_pane(w, wp, before, args_has(args, 'f'), hlimit);  
         layout_make_leaf(lc, new_wp);  
   
         path = NULL;          memset(&sc, 0, sizeof sc);
         if (item->client != NULL && item->client->session == NULL)          sc.item = item;
                 envent = environ_find(item->client->environ, "PATH");          sc.s = s;
         else          sc.wl = wl;
                 envent = environ_find(s->environ, "PATH");  
         if (envent != NULL)  
                 path = envent->value;  
   
         env = environ_for_session(s, 0);          sc.wp0 = wp;
         if (window_pane_spawn(new_wp, argc, argv, path, shell, cwd, env,          sc.lc = lc;
             s->tio, &cause) != 0) {  
                 environ_free(env);  
                 goto error;  
         }  
         environ_free(env);  
   
         layout_fix_panes(w);          sc.name = NULL;
         server_redraw_window(w);          sc.argc = args->argc;
           sc.argv = args->argv;
   
         if (!args_has(args, 'd')) {          sc.idx = -1;
                 window_set_active_pane(w, new_wp);          sc.cwd = args_get(args, 'c');
                 session_select(s, wl->idx);  
                 cmd_find_from_session(current, s, 0);  
                 server_redraw_session(s);  
         } else  
                 server_status_session(s);  
   
           sc.flags = flags;
           if (args_has(args, 'd'))
                   sc.flags |= SPAWN_DETACHED;
   
           if ((new_wp = spawn_pane(&sc, &cause)) == NULL) {
                   cmdq_error(item, "create pane failed: %s", cause);
                   free(cause);
                   return (CMD_RETURN_ERROR);
           }
           if (!args_has(args, 'd'))
                   cmd_find_from_winlink_pane(current, wl, new_wp, 0);
           server_redraw_window(wp->window);
           server_status_session(s);
   
         if (args_has(args, 'P')) {          if (args_has(args, 'P')) {
                 if ((template = args_get(args, 'F')) == NULL)                  if ((template = args_get(args, 'F')) == NULL)
                         template = SPLIT_WINDOW_TEMPLATE;                          template = SPLIT_WINDOW_TEMPLATE;
Line 166 
Line 142 
                 cmdq_print(item, "%s", cp);                  cmdq_print(item, "%s", cp);
                 free(cp);                  free(cp);
         }          }
         notify_window("window-layout-changed", w);  
   
         cmd_find_from_winlink_pane(&fs, wl, new_wp, 0);          cmd_find_from_winlink_pane(&fs, wl, new_wp, 0);
         hooks_insert(s->hooks, item, &fs, "after-split-window");          hooks_insert(s->hooks, item, &fs, "after-split-window");
   
         free(cwd);  
         return (CMD_RETURN_NORMAL);          return (CMD_RETURN_NORMAL);
   
 error:  
         if (new_wp != NULL) {  
                 layout_close_pane(new_wp);  
                 window_remove_pane(w, new_wp);  
         }  
         cmdq_error(item, "create pane failed: %s", cause);  
         free(cause);  
   
         free(cwd);  
         return (CMD_RETURN_ERROR);  
 }  }

Legend:
Removed from v.1.91  
changed lines
  Added in v.1.92