1
0
mirror of https://github.com/tmux/tmux.git synced 2025-03-29 18:28:47 +00:00

Add a W position to display-menu -y to use the line above (or below) the

status line containing the window list. Leave S meaning above (or below)
all status lines. GitHub issue 2145.
This commit is contained in:
nicm 2020-04-02 05:35:15 +00:00
parent 05a15215c5
commit 90f4e149c1
3 changed files with 46 additions and 14 deletions

View File

@ -65,12 +65,26 @@ static void
cmd_display_menu_get_position(struct client *c, struct cmdq_item *item, 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 args *args, u_int *px, u_int *py, u_int w, u_int h)
{ {
struct session *s = c->session;
struct winlink *wl = item->target.wl; struct winlink *wl = item->target.wl;
struct window_pane *wp = item->target.wp; struct window_pane *wp = item->target.wp;
struct style_ranges *ranges;
struct style_range *sr; struct style_range *sr;
const char *xp, *yp; const char *xp, *yp;
int at = status_at_line(c); u_int line, ox, oy, sx, sy, lines;
u_int ox, oy, sx, sy;
lines = status_line_size(c);
for (line = 0; line < lines; line++) {
ranges = &c->status.entries[line].ranges;
TAILQ_FOREACH(sr, ranges, entry) {
if (sr->type == STYLE_RANGE_WINDOW)
break;
}
if (sr != NULL)
break;
}
if (line == lines)
ranges = &c->status.entries[0].ranges;
xp = args_get(args, 'x'); xp = args_get(args, 'x');
if (xp == NULL || strcmp(xp, "C") == 0) if (xp == NULL || strcmp(xp, "C") == 0)
@ -89,10 +103,10 @@ cmd_display_menu_get_position(struct client *c, struct cmdq_item *item,
else else
*px = 0; *px = 0;
} else if (strcmp(xp, "W") == 0) { } else if (strcmp(xp, "W") == 0) {
if (at == -1) if (status_at_line(c) == -1)
*px = 0; *px = 0;
else { else {
TAILQ_FOREACH(sr, &c->status.entries[0].ranges, entry) { TAILQ_FOREACH(sr, ranges, entry) {
if (sr->type != STYLE_RANGE_WINDOW) if (sr->type != STYLE_RANGE_WINDOW)
continue; continue;
if (sr->argument == (u_int)wl->idx) if (sr->argument == (u_int)wl->idx)
@ -120,12 +134,30 @@ cmd_display_menu_get_position(struct client *c, struct cmdq_item *item,
} else if (strcmp(yp, "M") == 0 && item->shared->mouse.valid) } else if (strcmp(yp, "M") == 0 && item->shared->mouse.valid)
*py = item->shared->mouse.y + h; *py = item->shared->mouse.y + h;
else if (strcmp(yp, "S") == 0) { else if (strcmp(yp, "S") == 0) {
if (at == -1) if (options_get_number(s->options, "status-position") == 0) {
*py = c->tty.sy; if (lines != 0)
else if (at == 0) *py = lines + h;
*py = status_line_size(c) + h; else
else *py = 0;
*py = at; } else {
if (lines != 0)
*py = c->tty.sy - lines;
else
*py = c->tty.sy;
}
}
else if (strcmp(yp, "W") == 0) {
if (options_get_number(s->options, "status-position") == 0) {
if (lines != 0)
*py = line + 1 + h;
else
*py = 0;
} else {
if (lines != 0)
*py = c->tty.sy - lines + line;
else
*py = c->tty.sy;
}
} else } else
*py = strtoul(yp, NULL, 10); *py = strtoul(yp, NULL, 10);
if (*py < h) if (*py < h)

View File

@ -317,7 +317,7 @@ key_bindings_init(void)
"bind -N 'Resize the pane right' -r C-Right resize-pane -R", "bind -N 'Resize the pane right' -r C-Right resize-pane -R",
/* Menu keys */ /* Menu keys */
"bind < display-menu -xW -yS -T '#[align=centre]#{window_index}:#{window_name}' " DEFAULT_WINDOW_MENU, "bind < display-menu -xW -yW -T '#[align=centre]#{window_index}:#{window_name}' " DEFAULT_WINDOW_MENU,
"bind > display-menu -xP -yP -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU, "bind > display-menu -xP -yP -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU,
/* Mouse button 1 down on pane. */ /* Mouse button 1 down on pane. */
@ -351,10 +351,10 @@ key_bindings_init(void)
"bind -n WheelUpStatus previous-window", "bind -n WheelUpStatus previous-window",
/* Mouse button 3 down on status left. */ /* Mouse button 3 down on status left. */
"bind -n MouseDown3StatusLeft display-menu -t= -xM -yS -T '#[align=centre]#{session_name}' " DEFAULT_SESSION_MENU, "bind -n MouseDown3StatusLeft display-menu -t= -xM -yW -T '#[align=centre]#{session_name}' " DEFAULT_SESSION_MENU,
/* Mouse button 3 down on status line. */ /* Mouse button 3 down on status line. */
"bind -n MouseDown3Status display-menu -t= -xW -yS -T '#[align=centre]#{window_index}:#{window_name}' " DEFAULT_WINDOW_MENU, "bind -n MouseDown3Status display-menu -t= -xW -yW -T '#[align=centre]#{window_index}:#{window_name}' " DEFAULT_WINDOW_MENU,
/* Mouse button 3 down on pane. */ /* Mouse button 3 down on pane. */
"bind -n MouseDown3Pane if -Ft= '#{||:#{mouse_any_flag},#{&&:#{pane_in_mode},#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}}}' { select-pane -t=; send -M } { display-menu -t= -xM -yM -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU " }", "bind -n MouseDown3Pane if -Ft= '#{||:#{mouse_any_flag},#{&&:#{pane_in_mode},#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}}}' { select-pane -t=; send -M } { display-menu -t= -xM -yM -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU " }",

2
tmux.1
View File

@ -4985,7 +4985,7 @@ Both may be a row or column number, or one of the following special values:
.It Li "R" Ta Fl x Ta "The right side of the terminal" .It Li "R" Ta Fl x Ta "The right side of the terminal"
.It Li "P" Ta "Both" Ta "The bottom left of the pane" .It Li "P" Ta "Both" Ta "The bottom left of the pane"
.It Li "M" Ta "Both" Ta "The mouse position" .It Li "M" Ta "Both" Ta "The mouse position"
.It Li "W" Ta Fl x Ta "The window position on the status line" .It Li "W" Ta "Both" Ta "The window position on the status line"
.It Li "S" Ta Fl y Ta "The line above or below the status line" .It Li "S" Ta Fl y Ta "The line above or below the status line"
.El .El
.Pp .Pp