=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/popup.c,v retrieving revision 1.28 retrieving revision 1.29 diff -c -r1.28 -r1.29 *** src/usr.bin/tmux/popup.c 2021/08/13 19:25:24 1.28 --- src/usr.bin/tmux/popup.c 2021/08/13 19:27:25 1.29 *************** *** 1,4 **** ! /* $OpenBSD: popup.c,v 1.28 2021/08/13 19:25:24 nicm Exp $ */ /* * Copyright (c) 2020 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: popup.c,v 1.29 2021/08/13 19:27:25 nicm Exp $ */ /* * Copyright (c) 2020 Nicholas Marriott *************** *** 77,86 **** --- 77,98 ---- { "", KEYC_NONE, NULL }, { "Fill Space", 'F', NULL }, { "Centre", 'C', NULL }, + { "", KEYC_NONE, NULL }, + { "Make Pane (H)", 'h', NULL }, + { "Make Pane (V)", 'v', NULL }, { NULL, KEYC_NONE, NULL } }; + static const struct menu_item popup_internal_menu_items[] = { + { "Close", 'q', NULL }, + { "", KEYC_NONE, NULL }, + { "Fill Space", 'F', NULL }, + { "Centre", 'C', NULL }, + + { NULL, KEYC_NONE, NULL } + }; + static void popup_redraw_cb(const struct tty_ctx *ttyctx) { *************** *** 279,284 **** --- 291,327 ---- } static void + popup_make_pane(struct popup_data *pd, enum layout_type type) + { + struct client *c = pd->c; + struct session *s = c->session; + struct window *w = s->curw->window; + struct layout_cell *lc; + struct window_pane *wp = w->active, *new_wp; + u_int hlimit; + + window_unzoom(w); + + lc = layout_split_pane(wp, type, -1, 0); + hlimit = options_get_number(s->options, "history-limit"); + new_wp = window_add_pane(wp->window, NULL, hlimit, 0); + layout_assign_pane(lc, new_wp, 0); + + new_wp->fd = job_transfer(pd->job); + pd->job = NULL; + + screen_free(&new_wp->base); + memcpy(&new_wp->base, &pd->s, sizeof wp->base); + screen_resize(&new_wp->base, new_wp->sx, new_wp->sy, 1); + screen_init(&pd->s, 1, 1, 0); + + window_pane_set_event(new_wp); + window_set_active_pane(w, new_wp, 1); + + pd->close = 1; + } + + static void popup_menu_done(__unused struct menu *menu, __unused u_int choice, key_code key, void *data) { *************** *** 312,317 **** --- 355,366 ---- pd->py = c->tty.sy / 2 - pd->sy / 2; server_redraw_client(c); break; + case 'h': + popup_make_pane(pd, LAYOUT_LEFTRIGHT); + break; + case 'v': + popup_make_pane(pd, LAYOUT_TOPBOTTOM); + break; case 'q': pd->close = 1; break; *************** *** 460,466 **** menu: pd->menu = menu_create(""); ! menu_add_items(pd->menu, popup_menu_items, NULL, NULL, NULL); if (m->x >= (pd->menu->width + 4) / 2) x = m->x - (pd->menu->width + 4) / 2; else --- 509,519 ---- menu: pd->menu = menu_create(""); ! if (pd->flags & POPUP_INTERNAL) { ! menu_add_items(pd->menu, popup_internal_menu_items, NULL, NULL, ! NULL); ! } else ! menu_add_items(pd->menu, popup_menu_items, NULL, NULL, NULL); if (m->x >= (pd->menu->width + 4) / 2) x = m->x - (pd->menu->width + 4) / 2; else *************** *** 659,666 **** py = (c->tty.sy / 2) - (sy / 2); xasprintf(&cmd, "%s %s", editor, path); ! if (popup_display(POPUP_CLOSEEXIT, NULL, px, py, sx, sy, cmd, 0, NULL, ! _PATH_TMP, c, NULL, popup_editor_close_cb, pe) != 0) { popup_editor_free(pe); free(cmd); return (-1); --- 712,719 ---- py = (c->tty.sy / 2) - (sy / 2); xasprintf(&cmd, "%s %s", editor, path); ! if (popup_display(POPUP_INTERNAL|POPUP_CLOSEEXIT, NULL, px, py, sx, sy, ! cmd, 0, NULL, _PATH_TMP, c, NULL, popup_editor_close_cb, pe) != 0) { popup_editor_free(pe); free(cmd); return (-1);