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

Diff for /src/usr.bin/tmux/cmd-display-menu.c between version 1.4 and 1.5

version 1.4, 2019/05/28 07:18:42 version 1.5, 2020/03/18 09:13:49
Line 44 
Line 44 
         .exec = cmd_display_menu_exec          .exec = cmd_display_menu_exec
 };  };
   
   static void
   cmd_display_menu_get_position(struct client *c, struct cmdq_item *item,
       struct args *args, u_int *px, u_int *py, u_int w, u_int h)
   {
           struct winlink          *wl = item->target.wl;
           struct window_pane      *wp = item->target.wp;
           struct style_range      *sr;
           const char              *xp, *yp;
           int                      at = status_at_line(c);
           u_int                    ox, oy, sx, sy;
   
           xp = args_get(args, 'x');
           if (xp == NULL)
                   *px = 0;
           else if (strcmp(xp, "R") == 0)
                   *px = c->tty.sx - 1;
           else if (strcmp(xp, "P") == 0) {
                   tty_window_offset(&c->tty, &ox, &oy, &sx, &sy);
                   if (wp->xoff >= ox)
                           *px = wp->xoff - ox;
                   else
                           *px = 0;
           } else if (strcmp(xp, "M") == 0 && item->shared->mouse.valid) {
                   if (item->shared->mouse.x > w / 2)
                           *px = item->shared->mouse.x - w / 2;
                   else
                           *px = 0;
           } else if (strcmp(xp, "W") == 0) {
                   if (at == -1)
                           *px = 0;
                   else {
                           TAILQ_FOREACH(sr, &c->status.entries[0].ranges, entry) {
                                   if (sr->type != STYLE_RANGE_WINDOW)
                                           continue;
                                   if (sr->argument == (u_int)wl->idx)
                                           break;
                           }
                           if (sr != NULL)
                                   *px = sr->start;
                           else
                                   *px = 0;
                   }
           } else
                   *px = strtoul(xp, NULL, 10);
           if ((*px) + w >= c->tty.sx)
                   *px = c->tty.sx - w;
   
           yp = args_get(args, 'y');
           if (yp == NULL)
                   *py = 0;
           else if (strcmp(yp, "P") == 0) {
                   tty_window_offset(&c->tty, &ox, &oy, &sx, &sy);
                   if (wp->yoff + wp->sy >= oy)
                           *py = wp->yoff + wp->sy - oy;
                   else
                           *py = 0;
           } else if (strcmp(yp, "M") == 0 && item->shared->mouse.valid)
                   *py = item->shared->mouse.y + h;
           else if (strcmp(yp, "S") == 0) {
                   if (at == -1)
                           *py = c->tty.sy;
                   else if (at == 0)
                           *py = status_line_size(c) + h;
                   else
                           *py = at;
           } else
                   *py = strtoul(yp, NULL, 10);
           if (*py < h)
                   *py = 0;
           else
                   *py -= h;
           if ((*py) + h >= c->tty.sy)
                   *py = c->tty.sy - h;
   }
   
 static enum cmd_retval  static enum cmd_retval
 cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item)  cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item)
 {  {
Line 54 
Line 129 
         struct window_pane      *wp = item->target.wp;          struct window_pane      *wp = item->target.wp;
         struct cmd_find_state   *fs = &item->target;          struct cmd_find_state   *fs = &item->target;
         struct menu             *menu = NULL;          struct menu             *menu = NULL;
         struct style_range      *sr;  
         struct menu_item         menu_item;          struct menu_item         menu_item;
         const char              *xp, *yp, *key;          const char              *key;
         char                    *title, *name;          char                    *title, *name;
         int                      at, flags, i;          int                      flags, i;
         u_int                    px, py, ox, oy, sx, sy;          u_int                    px, py;
   
         if ((c = cmd_find_client(item, args_get(args, 'c'), 0)) == NULL)          if ((c = cmd_find_client(item, args_get(args, 'c'), 0)) == NULL)
                 return (CMD_RETURN_ERROR);                  return (CMD_RETURN_ERROR);
         if (c->overlay_draw != NULL)          if (c->overlay_draw != NULL)
                 return (CMD_RETURN_NORMAL);                  return (CMD_RETURN_NORMAL);
         at = status_at_line(c);  
   
         if (args_has(args, 'T'))          if (args_has(args, 'T'))
                 title = format_single(NULL, args_get(args, 'T'), c, s, wl, wp);                  title = format_single(NULL, args_get(args, 'T'), c, s, wl, wp);
Line 104 
Line 177 
                 menu_free(menu);                  menu_free(menu);
                 return (CMD_RETURN_NORMAL);                  return (CMD_RETURN_NORMAL);
         }          }
           cmd_display_menu_get_position(c, item, args, &px, &py, menu->width + 4,
         xp = args_get(args, 'x');              menu->count + 2);
         if (xp == NULL)  
                 px = 0;  
         else if (strcmp(xp, "R") == 0)  
                 px = c->tty.sx - 1;  
         else if (strcmp(xp, "P") == 0) {  
                 tty_window_offset(&c->tty, &ox, &oy, &sx, &sy);  
                 if (wp->xoff >= ox)  
                         px = wp->xoff - ox;  
                 else  
                         px = 0;  
         } else if (strcmp(xp, "M") == 0 && item->shared->mouse.valid) {  
                 if (item->shared->mouse.x > (menu->width + 4) / 2)  
                         px = item->shared->mouse.x - (menu->width + 4) / 2;  
                 else  
                         px = 0;  
         }  
         else if (strcmp(xp, "W") == 0) {  
                 if (at == -1)  
                         px = 0;  
                 else {  
                         TAILQ_FOREACH(sr, &c->status.entries[0].ranges, entry) {  
                                 if (sr->type != STYLE_RANGE_WINDOW)  
                                         continue;  
                                 if (sr->argument == (u_int)wl->idx)  
                                         break;  
                         }  
                         if (sr != NULL)  
                                 px = sr->start;  
                         else  
                                 px = 0;  
                 }  
         } else  
                 px = strtoul(xp, NULL, 10);  
         if (px + menu->width + 4 >= c->tty.sx)  
                 px = c->tty.sx - menu->width - 4;  
   
         yp = args_get(args, 'y');  
         if (yp == NULL)  
                 py = 0;  
         else if (strcmp(yp, "P") == 0) {  
                 tty_window_offset(&c->tty, &ox, &oy, &sx, &sy);  
                 if (wp->yoff + wp->sy >= oy)  
                         py = wp->yoff + wp->sy - oy;  
                 else  
                         py = 0;  
         } else if (strcmp(yp, "M") == 0 && item->shared->mouse.valid)  
                 py = item->shared->mouse.y + menu->count + 2;  
         else if (strcmp(yp, "S") == 0) {  
                 if (at == -1)  
                         py = c->tty.sy;  
                 else if (at == 0)  
                         py = status_line_size(c) + menu->count + 2;  
                 else  
                         py = at;  
         } else  
                 py = strtoul(yp, NULL, 10);  
         if (py < menu->count + 2)  
                 py = 0;  
         else  
                 py -= menu->count + 2;  
         if (py + menu->count + 2 >= c->tty.sy)  
                 py = c->tty.sy - menu->count - 2;  
   
         flags = 0;          flags = 0;
         if (!item->shared->mouse.valid)          if (!item->shared->mouse.valid)

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5