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

Diff for /src/usr.bin/tmux/window-copy.c between version 1.49 and 1.50

version 1.49, 2010/03/01 23:53:27 version 1.50, 2010/03/02 00:32:41
Line 28 
Line 28 
 void    window_copy_resize(struct window_pane *, u_int, u_int);  void    window_copy_resize(struct window_pane *, u_int, u_int);
 void    window_copy_key(struct window_pane *, struct client *, int);  void    window_copy_key(struct window_pane *, struct client *, int);
 int     window_copy_key_input(struct window_pane *, int);  int     window_copy_key_input(struct window_pane *, int);
   int     window_copy_key_numeric_prefix(struct window_pane *, int);
 void    window_copy_mouse(  void    window_copy_mouse(
             struct window_pane *, struct client *, struct mouse_event *);              struct window_pane *, struct client *, struct mouse_event *);
   
Line 82 
Line 83 
   
 enum window_copy_input_type {  enum window_copy_input_type {
         WINDOW_COPY_OFF,          WINDOW_COPY_OFF,
           WINDOW_COPY_NUMERICPREFIX,
         WINDOW_COPY_SEARCHUP,          WINDOW_COPY_SEARCHUP,
         WINDOW_COPY_SEARCHDOWN,          WINDOW_COPY_SEARCHDOWN,
         WINDOW_COPY_GOTOLINE,          WINDOW_COPY_GOTOLINE,
Line 109 
Line 111 
         const char     *inputprompt;          const char     *inputprompt;
         char           *inputstr;          char           *inputstr;
   
           u_int           numprefix;
   
         enum window_copy_input_type searchtype;          enum window_copy_input_type searchtype;
         char           *searchstr;          char           *searchstr;
 };  };
Line 135 
Line 139 
         data->inputtype = WINDOW_COPY_OFF;          data->inputtype = WINDOW_COPY_OFF;
         data->inputprompt = NULL;          data->inputprompt = NULL;
         data->inputstr = xstrdup("");          data->inputstr = xstrdup("");
           data->numprefix = 0;
   
         data->searchtype = WINDOW_COPY_OFF;          data->searchtype = WINDOW_COPY_OFF;
         data->searchstr = NULL;          data->searchstr = NULL;
Line 229 
Line 234 
         const char                      *word_separators;          const char                      *word_separators;
         struct window_copy_mode_data    *data = wp->modedata;          struct window_copy_mode_data    *data = wp->modedata;
         struct screen                   *s = &data->screen;          struct screen                   *s = &data->screen;
         u_int                            n;          u_int                            n, np;
         int                              keys;          int                              keys;
         enum mode_key_cmd                cmd;          enum mode_key_cmd                cmd;
   
         if (data->inputtype != WINDOW_COPY_OFF) {          np = data->numprefix;
           if (np == 0)
                   np = 1;
   
           if (data->inputtype == WINDOW_COPY_NUMERICPREFIX) {
                   if (window_copy_key_numeric_prefix(wp, key) == 0)
                           return;
                   data->inputtype = WINDOW_COPY_OFF;
                   window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
           } else if (data->inputtype != WINDOW_COPY_OFF) {
                 if (window_copy_key_input(wp, key) != 0)                  if (window_copy_key_input(wp, key) != 0)
                         goto input_off;                          goto input_off;
                 return;                  return;
Line 242 
Line 256 
         cmd = mode_key_lookup(&data->mdata, key);          cmd = mode_key_lookup(&data->mdata, key);
         switch (cmd) {          switch (cmd) {
         case MODEKEYCOPY_CANCEL:          case MODEKEYCOPY_CANCEL:
                 window_pane_reset_mode(wp);                  for (; np != 0; np--)
                           window_pane_reset_mode(wp);
                 break;                  break;
         case MODEKEYCOPY_LEFT:          case MODEKEYCOPY_LEFT:
                 window_copy_cursor_left(wp);                  for (; np != 0; np--)
                 return;                          window_copy_cursor_left(wp);
                   break;
         case MODEKEYCOPY_RIGHT:          case MODEKEYCOPY_RIGHT:
                 window_copy_cursor_right(wp);                  for (; np != 0; np--)
                 return;                          window_copy_cursor_right(wp);
                   break;
         case MODEKEYCOPY_UP:          case MODEKEYCOPY_UP:
                 window_copy_cursor_up(wp, 0);                  for (; np != 0; np--)
                 return;                          window_copy_cursor_up(wp, 0);
                   break;
         case MODEKEYCOPY_DOWN:          case MODEKEYCOPY_DOWN:
                 window_copy_cursor_down(wp, 0);                  for (; np != 0; np--)
                 return;                          window_copy_cursor_down(wp, 0);
                   break;
         case MODEKEYCOPY_SCROLLUP:          case MODEKEYCOPY_SCROLLUP:
                 window_copy_cursor_up(wp, 1);                  for (; np != 0; np--)
                           window_copy_cursor_up(wp, 1);
                 break;                  break;
         case MODEKEYCOPY_SCROLLDOWN:          case MODEKEYCOPY_SCROLLDOWN:
                 window_copy_cursor_down(wp, 1);                  for (; np != 0; np--)
                           window_copy_cursor_down(wp, 1);
                 break;                  break;
         case MODEKEYCOPY_PREVIOUSPAGE:          case MODEKEYCOPY_PREVIOUSPAGE:
                 window_copy_pageup(wp);                  for (; np != 0; np--)
                           window_copy_pageup(wp);
                 break;                  break;
         case MODEKEYCOPY_NEXTPAGE:          case MODEKEYCOPY_NEXTPAGE:
                 n = 1;                  n = 1;
                 if (screen_size_y(s) > 2)                  if (screen_size_y(s) > 2)
                         n = screen_size_y(s) - 2;                          n = screen_size_y(s) - 2;
                 if (data->oy < n)                  for (; np != 0; np--) {
                         data->oy = 0;                          if (data->oy < n)
                 else                                  data->oy = 0;
                         data->oy -= n;                          else
                                   data->oy -= n;
                   }
                 window_copy_update_selection(wp);                  window_copy_update_selection(wp);
                 window_copy_redraw_screen(wp);                  window_copy_redraw_screen(wp);
                 break;                  break;
         case MODEKEYCOPY_HALFPAGEUP:          case MODEKEYCOPY_HALFPAGEUP:
                 n = screen_size_y(s) / 2;                  n = screen_size_y(s) / 2;
                 if (data->oy + n > screen_hsize(&wp->base))                  for (; np != 0; np--) {
                         data->oy = screen_hsize(&wp->base);                          if (data->oy + n > screen_hsize(&wp->base))
                 else                                  data->oy = screen_hsize(&wp->base);
                         data->oy += n;                          else
                                   data->oy += n;
                   }
                 window_copy_update_selection(wp);                  window_copy_update_selection(wp);
                 window_copy_redraw_screen(wp);                  window_copy_redraw_screen(wp);
                 break;                  break;
         case MODEKEYCOPY_HALFPAGEDOWN:          case MODEKEYCOPY_HALFPAGEDOWN:
                 n = screen_size_y(s) / 2;                  n = screen_size_y(s) / 2;
                 if (data->oy < n)                  for (; np != 0; np--) {
                         data->oy = 0;                          if (data->oy < n)
                 else                                  data->oy = 0;
                         data->oy -= n;                          else
                                   data->oy -= n;
                   }
                 window_copy_update_selection(wp);                  window_copy_update_selection(wp);
                 window_copy_redraw_screen(wp);                  window_copy_redraw_screen(wp);
                 break;                  break;
Line 350 
Line 378 
                 window_copy_cursor_end_of_line(wp);                  window_copy_cursor_end_of_line(wp);
                 break;                  break;
         case MODEKEYCOPY_NEXTSPACE:          case MODEKEYCOPY_NEXTSPACE:
                 window_copy_cursor_next_word(wp, " ");                  for (; np != 0; np--)
                           window_copy_cursor_next_word(wp, " ");
                 break;                  break;
         case MODEKEYCOPY_NEXTSPACEEND:          case MODEKEYCOPY_NEXTSPACEEND:
                 window_copy_cursor_next_word_end(wp, " ");                  for (; np != 0; np--)
                           window_copy_cursor_next_word_end(wp, " ");
                 break;                  break;
         case MODEKEYCOPY_NEXTWORD:          case MODEKEYCOPY_NEXTWORD:
                 word_separators =                  word_separators =
                     options_get_string(&wp->window->options, "word-separators");                      options_get_string(&wp->window->options, "word-separators");
                 window_copy_cursor_next_word(wp, word_separators);                  for (; np != 0; np--)
                           window_copy_cursor_next_word(wp, word_separators);
                 break;                  break;
         case MODEKEYCOPY_NEXTWORDEND:          case MODEKEYCOPY_NEXTWORDEND:
                 word_separators =                  word_separators =
                     options_get_string(&wp->window->options, "word-separators");                      options_get_string(&wp->window->options, "word-separators");
                 window_copy_cursor_next_word_end(wp, word_separators);                  for (; np != 0; np--)
                           window_copy_cursor_next_word_end(wp, word_separators);
                 break;                  break;
         case MODEKEYCOPY_PREVIOUSSPACE:          case MODEKEYCOPY_PREVIOUSSPACE:
                 window_copy_cursor_previous_word(wp, " ");                  for (; np != 0; np--)
                           window_copy_cursor_previous_word(wp, " ");
                 break;                  break;
         case MODEKEYCOPY_PREVIOUSWORD:          case MODEKEYCOPY_PREVIOUSWORD:
                 word_separators =                  word_separators =
                     options_get_string(&wp->window->options, "word-separators");                      options_get_string(&wp->window->options, "word-separators");
                 window_copy_cursor_previous_word(wp, word_separators);                  for (; np != 0; np--)
                           window_copy_cursor_previous_word(wp, word_separators);
                 break;                  break;
         case MODEKEYCOPY_SEARCHUP:          case MODEKEYCOPY_SEARCHUP:
                 data->inputtype = WINDOW_COPY_SEARCHUP;                  data->inputtype = WINDOW_COPY_SEARCHUP;
Line 386 
Line 420 
                 switch (data->searchtype) {                  switch (data->searchtype) {
                 case WINDOW_COPY_OFF:                  case WINDOW_COPY_OFF:
                 case WINDOW_COPY_GOTOLINE:                  case WINDOW_COPY_GOTOLINE:
                   case WINDOW_COPY_NUMERICPREFIX:
                         break;                          break;
                 case WINDOW_COPY_SEARCHUP:                  case WINDOW_COPY_SEARCHUP:
                         if (cmd == MODEKEYCOPY_SEARCHAGAIN)                          if (cmd == MODEKEYCOPY_SEARCHAGAIN) {
                                 window_copy_search_up(wp, data->searchstr);                                  for (; np != 0; np--) {
                         else                                          window_copy_search_up(
                                 window_copy_search_down(wp, data->searchstr);                                              wp, data->searchstr);
                                   }
                           } else {
                                   for (; np != 0; np--) {
                                           window_copy_search_down(
                                               wp, data->searchstr);
                                   }
                           }
                         break;                          break;
                 case WINDOW_COPY_SEARCHDOWN:                  case WINDOW_COPY_SEARCHDOWN:
                         if (cmd == MODEKEYCOPY_SEARCHAGAIN)                          if (cmd == MODEKEYCOPY_SEARCHAGAIN) {
                                 window_copy_search_down(wp, data->searchstr);                                  for (; np != 0; np--) {
                         else                                          window_copy_search_down(
                                 window_copy_search_up(wp, data->searchstr);                                              wp, data->searchstr);
                                   }
                           } else {
                                   for (; np != 0; np--) {
                                           window_copy_search_up(
                                               wp, data->searchstr);
                                   }
                           }
                         break;                          break;
                 }                  }
                 break;                  break;
Line 406 
Line 455 
                 data->inputprompt = "Goto Line";                  data->inputprompt = "Goto Line";
                 *data->inputstr = '\0';                  *data->inputstr = '\0';
                 goto input_on;                  goto input_on;
           case MODEKEYCOPY_STARTNUMBERPREFIX:
                   key &= 0xff;
                   if (key >= '0' && key <= '9') {
                           data->inputtype = WINDOW_COPY_NUMERICPREFIX;
                           data->numprefix = 0;
                           window_copy_key_numeric_prefix(wp, key);
                           return;
                   }
                   break;
         case MODEKEYCOPY_RECTANGLETOGGLE:          case MODEKEYCOPY_RECTANGLETOGGLE:
                 window_copy_rectangle_toggle(wp);                  window_copy_rectangle_toggle(wp);
                 return;                  break;
         default:          default:
                 break;                  break;
         }          }
   
           data->numprefix = 0;
         return;          return;
   
 input_on:  input_on:
Line 444 
Line 503 
         struct window_copy_mode_data    *data = wp->modedata;          struct window_copy_mode_data    *data = wp->modedata;
         struct screen                   *s = &data->screen;          struct screen                   *s = &data->screen;
         size_t                           inputlen;          size_t                           inputlen;
           u_int                            np;
   
         switch (mode_key_lookup(&data->mdata, key)) {          switch (mode_key_lookup(&data->mdata, key)) {
         case MODEKEYEDIT_CANCEL:          case MODEKEYEDIT_CANCEL:
                   data->numprefix = 0;
                 return (-1);                  return (-1);
         case MODEKEYEDIT_BACKSPACE:          case MODEKEYEDIT_BACKSPACE:
                 inputlen = strlen(data->inputstr);                  inputlen = strlen(data->inputstr);
Line 457 
Line 518 
                 *data->inputstr = '\0';                  *data->inputstr = '\0';
                 break;                  break;
         case MODEKEYEDIT_ENTER:          case MODEKEYEDIT_ENTER:
                   np = data->numprefix;
                   if (np == 0)
                           np = 1;
   
                 switch (data->inputtype) {                  switch (data->inputtype) {
                 case WINDOW_COPY_OFF:                  case WINDOW_COPY_OFF:
                   case WINDOW_COPY_NUMERICPREFIX:
                         break;                          break;
                 case WINDOW_COPY_SEARCHUP:                  case WINDOW_COPY_SEARCHUP:
                         window_copy_search_up(wp, data->inputstr);                          for (; np != 0; np--)
                                   window_copy_search_up(wp, data->inputstr);
                         data->searchtype = data->inputtype;                          data->searchtype = data->inputtype;
                         data->searchstr = xstrdup(data->inputstr);                          data->searchstr = xstrdup(data->inputstr);
                         break;                          break;
                 case WINDOW_COPY_SEARCHDOWN:                  case WINDOW_COPY_SEARCHDOWN:
                         window_copy_search_down(wp, data->inputstr);                          for (; np != 0; np--)
                                   window_copy_search_down(wp, data->inputstr);
                         data->searchtype = data->inputtype;                          data->searchtype = data->inputtype;
                         data->searchstr = xstrdup(data->inputstr);                          data->searchstr = xstrdup(data->inputstr);
                         break;                          break;
Line 475 
Line 543 
                         *data->inputstr = '\0';                          *data->inputstr = '\0';
                         break;                          break;
                 }                  }
                   data->numprefix = 0;
                 return (1);                  return (1);
         case MODEKEY_OTHER:          case MODEKEY_OTHER:
                 if (key < 32 || key > 126)                  if (key < 32 || key > 126)
Line 493 
Line 562 
         return (0);          return (0);
 }  }
   
   int
   window_copy_key_numeric_prefix(struct window_pane *wp, int key)
   {
           struct window_copy_mode_data    *data = wp->modedata;
           struct screen                   *s = &data->screen;
   
           key &= 0xff;
           if (key < '0' || key > '9')
                   return 1;
   
           if (data->numprefix >= 100)     /* no more than three digits */
                   return 0;
           data->numprefix = data->numprefix * 10 + key - '0';
   
           window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1);
           return 0;
   }
   
 /* ARGSUSED */  /* ARGSUSED */
 void  void
 window_copy_mouse(  window_copy_mouse(
Line 762 
Line 849 
                 screen_write_cursormove(ctx, screen_size_x(s) - size, 0);                  screen_write_cursormove(ctx, screen_size_x(s) - size, 0);
                 screen_write_puts(ctx, &gc, "%s", hdr);                  screen_write_puts(ctx, &gc, "%s", hdr);
         } else if (py == last && data->inputtype != WINDOW_COPY_OFF) {          } else if (py == last && data->inputtype != WINDOW_COPY_OFF) {
                 xoff = size = xsnprintf(hdr, sizeof hdr,                  if (data->inputtype == WINDOW_COPY_NUMERICPREFIX) {
                     "%s: %s", data->inputprompt, data->inputstr);                          xoff = size = xsnprintf(hdr, sizeof hdr,
                               "Repeat: %u", data->numprefix);
                   } else {
                           xoff = size = xsnprintf(hdr, sizeof hdr,
                               "%s: %s", data->inputprompt, data->inputstr);
                   }
                 screen_write_cursormove(ctx, 0, last);                  screen_write_cursormove(ctx, 0, last);
                 screen_write_puts(ctx, &gc, "%s", hdr);                  screen_write_puts(ctx, &gc, "%s", hdr);
         } else          } else

Legend:
Removed from v.1.49  
changed lines
  Added in v.1.50