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

Diff for /src/usr.bin/tmux/cmd-find-window.c between version 1.18 and 1.19

version 1.18, 2012/08/14 08:51:53 version 1.19, 2012/09/03 12:20:17
Line 30 
Line 30 
   
 enum cmd_retval  cmd_find_window_exec(struct cmd *, struct cmd_ctx *);  enum cmd_retval  cmd_find_window_exec(struct cmd *, struct cmd_ctx *);
   
 u_int   cmd_find_window_match_flags(struct args *);  
 void    cmd_find_window_callback(struct window_choose_data *);  void    cmd_find_window_callback(struct window_choose_data *);
 void    cmd_find_window_free(struct window_choose_data *);  void    cmd_find_window_free(struct window_choose_data *);
   
Line 54 
Line 53 
         cmd_find_window_exec          cmd_find_window_exec
 };  };
   
   struct cmd_find_window_data {
           struct winlink  *wl;
           char            *list_ctx;
           u_int            pane_id;
   };
   ARRAY_DECL(cmd_find_window_data_list, struct cmd_find_window_data);
   
   u_int   cmd_find_window_match_flags(struct args *);
   void    cmd_find_window_match(struct cmd_find_window_data_list *, int,
               struct winlink *, const char *, const char *);
   
 u_int  u_int
 cmd_find_window_match_flags(struct args *args)  cmd_find_window_match_flags(struct args *args)
 {  {
Line 74 
Line 84 
         return (match_flags);          return (match_flags);
 }  }
   
   void
   cmd_find_window_match(struct cmd_find_window_data_list *find_list,
       int match_flags, struct winlink *wl, const char *str, const char *searchstr)
   {
           struct cmd_find_window_data      find_data;
           struct window_pane              *wp;
           u_int                            i, line;
           char                            *sres;
   
           memset(&find_data, 0, sizeof find_data);
   
           i = 0;
           TAILQ_FOREACH(wp, &wl->window->panes, entry) {
                   i++;
   
                   if ((match_flags & CMD_FIND_WINDOW_BY_NAME) &&
                       fnmatch(searchstr, wl->window->name, 0) == 0) {
                           find_data.list_ctx = xstrdup("");
                           break;
                   }
   
                   if ((match_flags & CMD_FIND_WINDOW_BY_TITLE) &&
                       fnmatch(searchstr, wp->base.title, 0) == 0) {
                           xasprintf(&find_data.list_ctx,
                               "pane %u title: \"%s\"", i - 1, wp->base.title);
                           break;
                   }
   
                   if (match_flags & CMD_FIND_WINDOW_BY_CONTENT &&
                       (sres = window_pane_search(wp, str, &line)) != NULL) {
                           xasprintf(&find_data.list_ctx,
                               "pane %u line %u: \"%s\"", i - 1, line + 1, sres);
                           free(sres);
                           break;
                   }
           }
           if (find_data.list_ctx != NULL) {
                   find_data.wl = wl;
                   find_data.pane_id = i - 1;
                   ARRAY_ADD(find_list, find_data);
           }
   }
   
 enum cmd_retval  enum cmd_retval
 cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)  cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 {  {
Line 81 
Line 134 
         struct window_choose_data       *cdata;          struct window_choose_data       *cdata;
         struct session                  *s;          struct session                  *s;
         struct winlink                  *wl, *wm;          struct winlink                  *wl, *wm;
         struct window_pane              *wp;          struct cmd_find_window_data_list find_list;
         ARRAY_DECL(, u_int)              list_idx;          char                            *str, *searchstr;
         ARRAY_DECL(, char *)             list_ctx;  
         char                            *str, *sres, *sctx, *searchstr;  
         const char                      *template;          const char                      *template;
         u_int                            i, line, match_flags;          u_int                            i, match_flags;
   
         if (ctx->curclient == NULL) {          if (ctx->curclient == NULL) {
                 ctx->error(ctx, "must be run interactively");                  ctx->error(ctx, "must be run interactively");
Line 103 
Line 154 
         match_flags = cmd_find_window_match_flags(args);          match_flags = cmd_find_window_match_flags(args);
         str = args->argv[0];          str = args->argv[0];
   
         ARRAY_INIT(&list_idx);          ARRAY_INIT(&find_list);
         ARRAY_INIT(&list_ctx);  
   
         xasprintf(&searchstr, "*%s*", str);          xasprintf(&searchstr, "*%s*", str);
         RB_FOREACH(wm, winlinks, &s->windows) {          RB_FOREACH(wm, winlinks, &s->windows)
                 i = 0;              cmd_find_window_match (&find_list, match_flags, wm, str, searchstr);
                 TAILQ_FOREACH(wp, &wm->window->panes, entry) {  
                         i++;  
   
                         if ((match_flags & CMD_FIND_WINDOW_BY_NAME) &&  
                             fnmatch(searchstr, wm->window->name, 0) == 0)  
                                 sctx = xstrdup("");  
                         else {  
                                 sres = NULL;  
                                 if (match_flags & CMD_FIND_WINDOW_BY_CONTENT) {  
                                         sres = window_pane_search(  
                                             wp, str, &line);  
                                 }  
   
                                 if (sres == NULL &&  
                                     (!(match_flags & CMD_FIND_WINDOW_BY_TITLE) ||  
                                      fnmatch(searchstr, wp->base.title, 0) != 0))  
                                         continue;  
   
                                 if (sres == NULL) {  
                                         xasprintf(&sctx,  
                                             "pane %u title: \"%s\"", i - 1,  
                                             wp->base.title);  
                                 } else {  
                                         xasprintf(&sctx,  
                                             "pane %u line %u: \"%s\"", i - 1,  
                                             line + 1, sres);  
                                         free(sres);  
                                 }  
                         }  
   
                         ARRAY_ADD(&list_idx, wm->idx);  
                         ARRAY_ADD(&list_ctx, sctx);  
                         break;  
                 }  
         }  
         free(searchstr);          free(searchstr);
   
         if (ARRAY_LENGTH(&list_idx) == 0) {          if (ARRAY_LENGTH(&find_list) == 0) {
                 ctx->error(ctx, "no windows matching: %s", str);                  ctx->error(ctx, "no windows matching: %s", str);
                 ARRAY_FREE(&list_idx);                  ARRAY_FREE(&find_list);
                 ARRAY_FREE(&list_ctx);  
                 return (CMD_RETURN_ERROR);                  return (CMD_RETURN_ERROR);
         }          }
   
         if (ARRAY_LENGTH(&list_idx) == 1) {          if (ARRAY_LENGTH(&find_list) == 1) {
                 if (session_select(s, ARRAY_FIRST(&list_idx)) == 0)                  if (session_select(s, ARRAY_FIRST(&find_list).wl->idx) == 0)
                         server_redraw_session(s);                          server_redraw_session(s);
                 recalculate_sizes();                  recalculate_sizes();
                 goto out;                  goto out;
Line 163 
Line 177 
         if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)          if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
                 goto out;                  goto out;
   
         for (i = 0; i < ARRAY_LENGTH(&list_idx); i++) {          for (i = 0; i < ARRAY_LENGTH(&find_list); i++) {
                 wm = winlink_find_by_index(                  wm = ARRAY_ITEM(&find_list, i).wl;
                     &s->windows, ARRAY_ITEM(&list_idx, i));  
   
                 cdata = window_choose_data_create(ctx);                  cdata = window_choose_data_create(ctx);
                 cdata->idx = wm->idx;                  cdata->idx = wm->idx;
                 cdata->client->references++;                  cdata->client->references++;
                   cdata->wl = wm;
   
                 cdata->ft_template = xstrdup(template);                  cdata->ft_template = xstrdup(template);
                   cdata->pane_id = ARRAY_ITEM(&find_list, i).pane_id;
   
                 format_add(cdata->ft, "line", "%u", i);                  format_add(cdata->ft, "line", "%u", i);
                 format_add(cdata->ft, "window_find_matches", "%s",                  format_add(cdata->ft, "window_find_matches", "%s",
                         ARRAY_ITEM(&list_ctx, i));                      ARRAY_ITEM(&find_list, i).list_ctx);
                 format_session(cdata->ft, s);                  format_session(cdata->ft, s);
                 format_winlink(cdata->ft, s, wm);                  format_winlink(cdata->ft, s, wm);
   
Line 185 
Line 201 
             0, cmd_find_window_callback, cmd_find_window_free);              0, cmd_find_window_callback, cmd_find_window_free);
   
 out:  out:
           ARRAY_FREE(&find_list);
         ARRAY_FREE(&list_idx);  
         ARRAY_FREE(&list_ctx);  
   
         return (CMD_RETURN_NORMAL);          return (CMD_RETURN_NORMAL);
 }  }
   
 void  void
 cmd_find_window_callback(struct window_choose_data *cdata)  cmd_find_window_callback(struct window_choose_data *cdata)
 {  {
         struct session  *s;          struct session          *s;
           struct window_pane      *wp;
   
         if (cdata == NULL)          if (cdata == NULL)
                 return;                  return;
Line 203 
Line 217 
         s = cdata->session;          s = cdata->session;
         if (!session_alive(s))          if (!session_alive(s))
                 return;                  return;
   
           wp = window_pane_at_index(cdata->wl->window, cdata->pane_id);
           if (wp != NULL && window_pane_visible(wp))
                   window_set_active_pane(cdata->wl->window, wp);
   
         if (session_select(s, cdata->idx) == 0) {          if (session_select(s, cdata->idx) == 0) {
                 server_redraw_session(s);                  server_redraw_session(s);

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.19