=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-display-menu.c,v retrieving revision 1.17 retrieving revision 1.18 diff -c -r1.17 -r1.18 *** src/usr.bin/tmux/cmd-display-menu.c 2020/04/13 14:46:04 1.17 --- src/usr.bin/tmux/cmd-display-menu.c 2020/04/13 20:51:57 1.18 *************** *** 1,4 **** ! /* $OpenBSD: cmd-display-menu.c,v 1.17 2020/04/13 14:46:04 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-display-menu.c,v 1.18 2020/04/13 20:51:57 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott *************** *** 42,48 **** .target = { 't', CMD_FIND_PANE, 0 }, ! .flags = CMD_AFTERHOOK, .exec = cmd_display_menu_exec }; --- 42,48 ---- .target = { 't', CMD_FIND_PANE, 0 }, ! .flags = CMD_AFTERHOOK|CMD_CLIENT_CFLAG, .exec = cmd_display_menu_exec }; *************** *** 57,73 **** .target = { 't', CMD_FIND_PANE, 0 }, ! .flags = CMD_AFTERHOOK, .exec = cmd_display_popup_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 cmd_find_state *target = cmdq_get_target(item); struct key_event *event = cmdq_get_event(item); ! struct session *s = c->session; struct winlink *wl = target->wl; struct window_pane *wp = target->wp; struct style_ranges *ranges; --- 57,74 ---- .target = { 't', CMD_FIND_PANE, 0 }, ! .flags = CMD_AFTERHOOK|CMD_CLIENT_CFLAG, .exec = cmd_display_popup_exec }; static void ! cmd_display_menu_get_position(struct client *tc, struct cmdq_item *item, struct args *args, u_int *px, u_int *py, u_int w, u_int h) { + struct tty *tty = &tc->tty; struct cmd_find_state *target = cmdq_get_target(item); struct key_event *event = cmdq_get_event(item); ! struct session *s = tc->session; struct winlink *wl = target->wl; struct window_pane *wp = target->wp; struct style_ranges *ranges; *************** *** 75,83 **** const char *xp, *yp; u_int line, ox, oy, sx, sy, lines; ! 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; --- 76,84 ---- const char *xp, *yp; u_int line, ox, oy, sx, sy, lines; ! lines = status_line_size(tc); for (line = 0; line < lines; line++) { ! ranges = &tc->status.entries[line].ranges; TAILQ_FOREACH(sr, ranges, entry) { if (sr->type == STYLE_RANGE_WINDOW) break; *************** *** 86,100 **** break; } if (line == lines) ! ranges = &c->status.entries[0].ranges; xp = args_get(args, 'x'); if (xp == NULL || strcmp(xp, "C") == 0) ! *px = (c->tty.sx - 1) / 2 - w / 2; 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 --- 87,101 ---- break; } if (line == lines) ! ranges = &tc->status.entries[0].ranges; xp = args_get(args, 'x'); if (xp == NULL || strcmp(xp, "C") == 0) ! *px = (tty->sx - 1) / 2 - w / 2; else if (strcmp(xp, "R") == 0) ! *px = tty->sx - 1; else if (strcmp(xp, "P") == 0) { ! tty_window_offset(&tc->tty, &ox, &oy, &sx, &sy); if (wp->xoff >= ox) *px = wp->xoff - ox; else *************** *** 105,111 **** else *px = 0; } else if (strcmp(xp, "W") == 0) { ! if (status_at_line(c) == -1) *px = 0; else { TAILQ_FOREACH(sr, ranges, entry) { --- 106,112 ---- else *px = 0; } else if (strcmp(xp, "W") == 0) { ! if (status_at_line(tc) == -1) *px = 0; else { TAILQ_FOREACH(sr, ranges, entry) { *************** *** 121,134 **** } } 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 || strcmp(yp, "C") == 0) ! *py = (c->tty.sy - 1) / 2 + h / 2; 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 --- 122,135 ---- } } else *px = strtoul(xp, NULL, 10); ! if ((*px) + w >= tty->sx) ! *px = tty->sx - w; yp = args_get(args, 'y'); if (yp == NULL || strcmp(yp, "C") == 0) ! *py = (tty->sy - 1) / 2 + h / 2; else if (strcmp(yp, "P") == 0) { ! tty_window_offset(&tc->tty, &ox, &oy, &sx, &sy); if (wp->yoff + wp->sy >= oy) *py = wp->yoff + wp->sy - oy; else *************** *** 146,154 **** *py = 0; } 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) { --- 147,155 ---- *py = 0; } else { if (lines != 0) ! *py = tty->sy - lines; else ! *py = tty->sy; } } else if (strcmp(yp, "W") == 0) { if (options_get_number(s->options, "status-position") == 0) { *************** *** 158,166 **** *py = 0; } else { if (lines != 0) ! *py = c->tty.sy - lines + line; else ! *py = c->tty.sy; } } else *py = strtoul(yp, NULL, 10); --- 159,167 ---- *py = 0; } else { if (lines != 0) ! *py = tty->sy - lines + line; else ! *py = tty->sy; } } else *py = strtoul(yp, NULL, 10); *************** *** 168,175 **** *py = 0; else *py -= h; ! if ((*py) + h >= c->tty.sy) ! *py = c->tty.sy - h; } static enum cmd_retval --- 169,176 ---- *py = 0; else *py -= h; ! if ((*py) + h >= tty->sy) ! *py = tty->sy - h; } static enum cmd_retval *************** *** 178,184 **** struct args *args = cmd_get_args(self); struct cmd_find_state *target = cmdq_get_target(item); struct key_event *event = cmdq_get_event(item); ! struct client *c; struct menu *menu = NULL; struct menu_item menu_item; const char *key; --- 179,185 ---- struct args *args = cmd_get_args(self); struct cmd_find_state *target = cmdq_get_target(item); struct key_event *event = cmdq_get_event(item); ! struct client *tc = cmdq_get_target_client(item); struct menu *menu = NULL; struct menu_item menu_item; const char *key; *************** *** 186,198 **** int flags = 0, i; u_int px, py; ! if ((c = cmd_find_client(item, args_get(args, 'c'), 0)) == NULL) ! return (CMD_RETURN_ERROR); ! if (c->overlay_draw != NULL) return (CMD_RETURN_NORMAL); if (args_has(args, 'T')) ! title = format_single_from_target(item, args_get(args, 'T'), c); else title = xstrdup(""); menu = menu_create(title); --- 187,197 ---- int flags = 0, i; u_int px, py; ! if (tc->overlay_draw != NULL) return (CMD_RETURN_NORMAL); if (args_has(args, 'T')) ! title = format_single_from_target(item, args_get(args, 'T')); else title = xstrdup(""); menu = menu_create(title); *************** *** 200,206 **** for (i = 0; i != args->argc; /* nothing */) { name = args->argv[i++]; if (*name == '\0') { ! menu_add_item(menu, NULL, item, c, target); continue; } --- 199,205 ---- for (i = 0; i != args->argc; /* nothing */) { name = args->argv[i++]; if (*name == '\0') { ! menu_add_item(menu, NULL, item, tc, target); continue; } *************** *** 216,222 **** menu_item.key = key_string_lookup_string(key); menu_item.command = args->argv[i++]; ! menu_add_item(menu, &menu_item, item, c, target); } free(title); if (menu == NULL) { --- 215,221 ---- menu_item.key = key_string_lookup_string(key); menu_item.command = args->argv[i++]; ! menu_add_item(menu, &menu_item, item, tc, target); } free(title); if (menu == NULL) { *************** *** 227,238 **** menu_free(menu); return (CMD_RETURN_NORMAL); } ! cmd_display_menu_get_position(c, item, args, &px, &py, menu->width + 4, menu->count + 2); if (!event->m.valid) flags |= MENU_NOMOUSE; ! if (menu_display(menu, flags, item, px, py, c, target, NULL, NULL) != 0) return (CMD_RETURN_NORMAL); return (CMD_RETURN_WAIT); } --- 226,238 ---- menu_free(menu); return (CMD_RETURN_NORMAL); } ! cmd_display_menu_get_position(tc, item, args, &px, &py, menu->width + 4, menu->count + 2); if (!event->m.valid) flags |= MENU_NOMOUSE; ! if (menu_display(menu, flags, item, px, py, tc, target, NULL, ! NULL) != 0) return (CMD_RETURN_NORMAL); return (CMD_RETURN_WAIT); } *************** *** 242,261 **** { struct args *args = cmd_get_args(self); struct cmd_find_state *target = cmdq_get_target(item); ! struct client *c; const char *value, *cmd = NULL, **lines = NULL; const char *shellcmd = NULL; char *cwd, *cause; int flags = 0; u_int px, py, w, h, nlines = 0; - if ((c = cmd_find_client(item, args_get(args, 'c'), 0)) == NULL) - return (CMD_RETURN_ERROR); if (args_has(args, 'C')) { ! server_client_clear_overlay(c); return (CMD_RETURN_NORMAL); } ! if (c->overlay_draw != NULL) return (CMD_RETURN_NORMAL); if (args->argc >= 1) --- 242,260 ---- { struct args *args = cmd_get_args(self); struct cmd_find_state *target = cmdq_get_target(item); ! struct client *tc = cmdq_get_target_client(item); ! struct tty *tty = &tc->tty; const char *value, *cmd = NULL, **lines = NULL; const char *shellcmd = NULL; char *cwd, *cause; int flags = 0; u_int px, py, w, h, nlines = 0; if (args_has(args, 'C')) { ! server_client_clear_overlay(tc); return (CMD_RETURN_NORMAL); } ! if (tc->overlay_draw != NULL) return (CMD_RETURN_NORMAL); if (args->argc >= 1) *************** *** 268,276 **** if (nlines != 0) h = popup_height(nlines, lines) + 2; else ! h = c->tty.sy / 2; if (args_has(args, 'h')) { ! h = args_percentage(args, 'h', 1, c->tty.sy, c->tty.sy, &cause); if (cause != NULL) { cmdq_error(item, "height %s", cause); free(cause); --- 267,275 ---- if (nlines != 0) h = popup_height(nlines, lines) + 2; else ! h = tty->sy / 2; if (args_has(args, 'h')) { ! h = args_percentage(args, 'h', 1, tty->sy, tty->sy, &cause); if (cause != NULL) { cmdq_error(item, "height %s", cause); free(cause); *************** *** 279,289 **** } if (nlines != 0) ! w = popup_width(item, nlines, lines, c, target) + 2; else ! w = c->tty.sx / 2; if (args_has(args, 'w')) { ! w = args_percentage(args, 'w', 1, c->tty.sx, c->tty.sx, &cause); if (cause != NULL) { cmdq_error(item, "width %s", cause); free(cause); --- 278,288 ---- } if (nlines != 0) ! w = popup_width(item, nlines, lines, tc, target) + 2; else ! w = tty->sx / 2; if (args_has(args, 'w')) { ! w = args_percentage(args, 'w', 1, tty->sx, tty->sx, &cause); if (cause != NULL) { cmdq_error(item, "width %s", cause); free(cause); *************** *** 291,311 **** } } ! if (w > c->tty.sx - 1) ! w = c->tty.sx - 1; ! if (h > c->tty.sy - 1) ! h = c->tty.sy - 1; ! cmd_display_menu_get_position(c, item, args, &px, &py, w, h); value = args_get(args, 'd'); if (value != NULL) ! cwd = format_single_from_target(item, value, c); else ! cwd = xstrdup(server_client_get_cwd(c, target->s)); value = args_get(args, 'R'); if (value != NULL) ! shellcmd = format_single_from_target(item, value, c); if (args_has(args, 'K')) flags |= POPUP_WRITEKEYS; --- 290,310 ---- } } ! if (w > tty->sx - 1) ! w = tty->sx - 1; ! if (h > tty->sy - 1) ! h = tty->sy - 1; ! cmd_display_menu_get_position(tc, item, args, &px, &py, w, h); value = args_get(args, 'd'); if (value != NULL) ! cwd = format_single_from_target(item, value); else ! cwd = xstrdup(server_client_get_cwd(tc, target->s)); value = args_get(args, 'R'); if (value != NULL) ! shellcmd = format_single_from_target(item, value); if (args_has(args, 'K')) flags |= POPUP_WRITEKEYS; *************** *** 314,320 **** else if (args_has(args, 'E')) flags |= POPUP_CLOSEEXIT; if (popup_display(flags, item, px, py, w, h, nlines, lines, shellcmd, ! cmd, cwd, c, target) != 0) return (CMD_RETURN_NORMAL); return (CMD_RETURN_WAIT); } --- 313,319 ---- else if (args_has(args, 'E')) flags |= POPUP_CLOSEEXIT; if (popup_display(flags, item, px, py, w, h, nlines, lines, shellcmd, ! cmd, cwd, tc, target) != 0) return (CMD_RETURN_NORMAL); return (CMD_RETURN_WAIT); }