=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/popup.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- src/usr.bin/tmux/popup.c 2021/02/02 13:03:03 1.21 +++ src/usr.bin/tmux/popup.c 2021/03/02 10:56:45 1.22 @@ -1,4 +1,4 @@ -/* $OpenBSD: popup.c,v 1.21 2021/02/02 13:03:03 nicm Exp $ */ +/* $OpenBSD: popup.c,v 1.22 2021/03/02 10:56:45 nicm Exp $ */ /* * Copyright (c) 2020 Nicholas Marriott @@ -32,13 +32,7 @@ struct cmdq_item *item; int flags; - char **lines; - u_int nlines; - - char *cmd; - struct cmd_find_state fs; struct screen s; - struct job *job; struct input_ctx *ictx; int status; @@ -105,54 +99,11 @@ ttyctx->arg = pd; } -static void -popup_write_screen(struct client *c, struct popup_data *pd) -{ - struct cmdq_item *item = pd->item; - struct screen_write_ctx ctx; - char *copy, *next, *loop, *tmp; - struct format_tree *ft; - u_int i, y; - - ft = format_create(c, item, FORMAT_NONE, 0); - if (cmd_find_valid_state(&pd->fs)) - format_defaults(ft, c, pd->fs.s, pd->fs.wl, pd->fs.wp); - else - format_defaults(ft, c, NULL, NULL, NULL); - - screen_write_start(&ctx, &pd->s); - screen_write_clearscreen(&ctx, 8); - - y = 0; - for (i = 0; i < pd->nlines; i++) { - if (y == pd->sy - 2) - break; - copy = next = xstrdup(pd->lines[i]); - while ((loop = strsep(&next, "\n")) != NULL) { - if (y == pd->sy - 2) - break; - tmp = format_expand(ft, loop); - screen_write_cursormove(&ctx, 0, y, 0); - format_draw(&ctx, &grid_default_cell, pd->sx - 2, tmp, - NULL); - free(tmp); - y++; - } - free(copy); - } - - format_free(ft); - screen_write_cursormove(&ctx, 0, y, 0); - screen_write_stop(&ctx); -} - static struct screen * popup_mode_cb(struct client *c, u_int *cx, u_int *cy) { struct popup_data *pd = c->overlay_data; - if (pd->ictx == NULL) - return (0); *cx = pd->px + 1 + pd->s.cx; *cy = pd->py + 1 + pd->s.cy; return (&pd->s); @@ -200,14 +151,12 @@ { struct popup_data *pd = c->overlay_data; struct cmdq_item *item = pd->item; - u_int i; if (pd->cb != NULL) pd->cb(pd->status, pd->arg); if (item != NULL) { - if (pd->ictx != NULL && - cmdq_get_client(item) != NULL && + if (cmdq_get_client(item) != NULL && cmdq_get_client(item)->session == NULL) cmdq_get_client(item)->retval = pd->status; cmdq_continue(item); @@ -216,15 +165,9 @@ if (pd->job != NULL) job_free(pd->job); - if (pd->ictx != NULL) - input_free(pd->ictx); + input_free(pd->ictx); - for (i = 0; i < pd->nlines; i++) - free(pd->lines[i]); - free(pd->lines); - screen_free(&pd->s); - free(pd->cmd); free(pd); } @@ -263,9 +206,7 @@ pd->sy = m->y - pd->py; screen_resize(&pd->s, pd->sx - 2, pd->sy - 2, 0); - if (pd->ictx == NULL) - popup_write_screen(c, pd); - else if (pd->job != NULL) + if (pd->job != NULL) job_resize(pd->job, pd->sx - 2, pd->sy - 2); server_redraw_client(c); } @@ -276,13 +217,8 @@ { struct popup_data *pd = c->overlay_data; struct mouse_event *m = &event->m; - struct cmd_find_state *fs = &pd->fs; - struct format_tree *ft; - const char *cmd, *buf; + const char *buf; size_t len; - struct cmdq_state *state; - enum cmd_parse_status status; - char *error; if (KEYC_IS_MOUSE(event->key)) { if (pd->dragging != OFF) { @@ -314,13 +250,11 @@ } } - if (pd->ictx != NULL && (pd->flags & POPUP_WRITEKEYS)) { - if (((pd->flags & (POPUP_CLOSEEXIT|POPUP_CLOSEEXITZERO)) == 0 || - pd->job == NULL) && - (event->key == '\033' || event->key == '\003')) - return (1); - if (pd->job == NULL) - return (0); + if ((((pd->flags & (POPUP_CLOSEEXIT|POPUP_CLOSEEXITZERO)) == 0) || + pd->job == NULL) && + (event->key == '\033' || event->key == '\003')) + return (1); + if (pd->job != NULL) { if (KEYC_IS_MOUSE(event->key)) { /* Must be inside, checked already. */ if (!input_key_get_mouse(&pd->s, m, m->x - pd->px - 1, @@ -330,41 +264,9 @@ return (0); } input_key(&pd->s, job_get_event(pd->job), event->key); - return (0); } + return (0); - if (pd->cmd == NULL) - return (1); - - ft = format_create(NULL, pd->item, FORMAT_NONE, 0); - if (cmd_find_valid_state(fs)) - format_defaults(ft, c, fs->s, fs->wl, fs->wp); - else - format_defaults(ft, c, NULL, NULL, NULL); - format_add(ft, "popup_key", "%s", key_string_lookup_key(event->key, 0)); - if (KEYC_IS_MOUSE(event->key)) { - format_add(ft, "popup_mouse", "1"); - format_add(ft, "popup_mouse_x", "%u", m->x - pd->px); - format_add(ft, "popup_mouse_y", "%u", m->y - pd->py); - } - cmd = format_expand(ft, pd->cmd); - format_free(ft); - - if (pd->item != NULL) - event = cmdq_get_event(pd->item); - else - event = NULL; - state = cmdq_new_state(&pd->fs, event, 0); - - status = cmd_parse_and_append(cmd, NULL, c, state, &error); - if (status == CMD_PARSE_ERROR) { - cmdq_append(c, cmdq_get_error(error)); - free(error); - } - cmdq_free_state(state); - - return (1); - out: pd->lx = m->x; pd->ly = m->y; @@ -416,62 +318,12 @@ server_client_clear_overlay(pd->c); } -u_int -popup_height(u_int nlines, const char **lines) -{ - char *copy, *next, *loop; - u_int i, height = 0; - - for (i = 0; i < nlines; i++) { - copy = next = xstrdup(lines[i]); - while ((loop = strsep(&next, "\n")) != NULL) - height++; - free(copy); - } - - return (height); -} - -u_int -popup_width(struct cmdq_item *item, u_int nlines, const char **lines, - struct client *c, struct cmd_find_state *fs) -{ - char *copy, *next, *loop, *tmp; - struct format_tree *ft; - u_int i, width = 0, tmpwidth; - - ft = format_create(cmdq_get_client(item), item, FORMAT_NONE, 0); - if (fs != NULL && cmd_find_valid_state(fs)) - format_defaults(ft, c, fs->s, fs->wl, fs->wp); - else - format_defaults(ft, c, NULL, NULL, NULL); - - for (i = 0; i < nlines; i++) { - copy = next = xstrdup(lines[i]); - while ((loop = strsep(&next, "\n")) != NULL) { - tmp = format_expand(ft, loop); - tmpwidth = format_width(tmp); - if (tmpwidth > width) - width = tmpwidth; - free(tmp); - } - free(copy); - } - - format_free(ft); - return (width); -} - int popup_display(int flags, struct cmdq_item *item, u_int px, u_int py, u_int sx, - u_int sy, u_int nlines, const char **lines, const char *shellcmd, - const char *cmd, const char *cwd, struct client *c, - struct cmd_find_state *fs, popup_close_cb cb, void *arg) + u_int sy, const char *shellcmd, int argc, char **argv, const char *cwd, + struct client *c, struct session *s, popup_close_cb cb, void *arg) { struct popup_data *pd; - u_int i; - struct session *s; - int jobflags; if (sx < 3 || sy < 3) return (-1); @@ -489,40 +341,18 @@ pd->arg = arg; pd->status = 128 + SIGHUP; - if (fs != NULL) - cmd_find_copy_state(&pd->fs, fs); screen_init(&pd->s, sx - 2, sy - 2, 0); - if (cmd != NULL) - pd->cmd = xstrdup(cmd); - pd->px = px; pd->py = py; pd->sx = sx; pd->sy = sy; - pd->nlines = nlines; - if (pd->nlines != 0) - pd->lines = xreallocarray(NULL, pd->nlines, sizeof *pd->lines); + pd->job = job_run(shellcmd, argc, argv, s, cwd, + popup_job_update_cb, popup_job_complete_cb, NULL, pd, + JOB_NOWAIT|JOB_PTY|JOB_KEEPWRITE, pd->sx - 2, pd->sy - 2); + pd->ictx = input_init(NULL, job_get_event(pd->job)); - for (i = 0; i < pd->nlines; i++) - pd->lines[i] = xstrdup(lines[i]); - popup_write_screen(c, pd); - - if (shellcmd != NULL) { - if (fs != NULL) - s = fs->s; - else - s = NULL; - jobflags = JOB_NOWAIT|JOB_PTY; - if (flags & POPUP_WRITEKEYS) - jobflags |= JOB_KEEPWRITE; - pd->job = job_run(shellcmd, s, cwd, popup_job_update_cb, - popup_job_complete_cb, NULL, pd, jobflags, pd->sx - 2, - pd->sy - 2); - pd->ictx = input_init(NULL, job_get_event(pd->job)); - } - server_client_set_overlay(c, 0, popup_check_cb, popup_mode_cb, popup_draw_cb, popup_key_cb, popup_free_cb, pd); return (0); @@ -607,9 +437,8 @@ py = (c->tty.sy / 2) - (sy / 2); xasprintf(&cmd, "%s %s", editor, path); - if (popup_display(POPUP_WRITEKEYS|POPUP_CLOSEEXIT, NULL, px, py, sx, sy, - 0, NULL, cmd, NULL, _PATH_TMP, c, NULL, popup_editor_close_cb, - pe) != 0) { + 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);