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

Diff for /src/usr.bin/tmux/cmd-respawn-window.c between version 1.37 and 1.38

version 1.37, 2019/03/12 11:16:50 version 1.38, 2019/04/17 14:37:48
Line 19 
Line 19 
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <stdlib.h>  #include <stdlib.h>
 #include <unistd.h>  #include <string.h>
   
 #include "tmux.h"  #include "tmux.h"
   
Line 48 
Line 48 
 cmd_respawn_window_exec(struct cmd *self, struct cmdq_item *item)  cmd_respawn_window_exec(struct cmd *self, struct cmdq_item *item)
 {  {
         struct args             *args = self->args;          struct args             *args = self->args;
           struct spawn_context     sc;
         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;          char                    *cause = NULL;
         struct window_pane      *wp;  
         struct client           *c = cmd_find_client(item, NULL, 1);  
         struct environ          *env;  
         const char              *path = NULL, *cp;  
         char                    *cause, *cwd = NULL;  
         struct environ_entry    *envent;  
   
         if (!args_has(self->args, 'k')) {          memset(&sc, 0, sizeof sc);
                 TAILQ_FOREACH(wp, &w->panes, entry) {          sc.item = item;
                         if (wp->fd == -1)          sc.s = s;
                                 continue;          sc.wl = wl;
                         cmdq_error(item, "window still active: %s:%d", s->name,  
                             wl->idx);  
                         return (CMD_RETURN_ERROR);  
                 }  
         }  
   
         wp = TAILQ_FIRST(&w->panes);          sc.name = NULL;
         TAILQ_REMOVE(&w->panes, wp, entry);          sc.argc = args->argc;
         layout_free(w);          sc.argv = args->argv;
         window_destroy_panes(w);  
         TAILQ_INSERT_HEAD(&w->panes, wp, entry);  
         window_pane_resize(wp, w->sx, w->sy);  
   
         if (item->client != NULL && item->client->session == NULL)          sc.idx = -1;
                 envent = environ_find(item->client->environ, "PATH");          sc.cwd = args_get(args, 'c');
         else  
                 envent = environ_find(s->environ, "PATH");  
         if (envent != NULL)  
                 path = envent->value;  
   
         if ((cp = args_get(args, 'c')) != NULL)          sc.flags = SPAWN_RESPAWN;
                 cwd = format_single(item, cp, c, s, NULL, NULL);          if (args_has(args, 'k'))
                   sc.flags |= SPAWN_KILL;
   
         env = environ_for_session(s, 0);          if (spawn_window(&sc, &cause) == NULL) {
         if (window_pane_spawn(wp, args->argc, args->argv, path, NULL, cwd, env,  
             s->tio, &cause) != 0) {  
                 cmdq_error(item, "respawn window failed: %s", cause);                  cmdq_error(item, "respawn window failed: %s", cause);
                 free(cause);                  free(cause);
                 environ_free(env);  
                 free(cwd);  
                 server_destroy_pane(wp, 0);  
                 return (CMD_RETURN_ERROR);                  return (CMD_RETURN_ERROR);
         }          }
         environ_free(env);  
         free(cwd);  
   
         layout_init(w, wp);          server_redraw_window(wl->window);
         window_pane_reset_mode_all(wp);  
         screen_reinit(&wp->base);  
         input_init(wp);  
         window_set_active_pane(w, wp);  
   
         recalculate_sizes();  
         server_redraw_window(w);  
   
         return (CMD_RETURN_NORMAL);          return (CMD_RETURN_NORMAL);
 }  }

Legend:
Removed from v.1.37  
changed lines
  Added in v.1.38