aboutsummaryrefslogtreecommitdiff
path: root/popup.c
diff options
context:
space:
mode:
Diffstat (limited to 'popup.c')
-rw-r--r--popup.c81
1 files changed, 69 insertions, 12 deletions
diff --git a/popup.c b/popup.c
index 5d39e599..4b47df2b 100644
--- a/popup.c
+++ b/popup.c
@@ -40,6 +40,8 @@ struct popup_data {
struct job *job;
struct input_ctx *ictx;
int status;
+ popup_close_cb cb;
+ void *arg;
u_int px;
u_int py;
@@ -56,6 +58,46 @@ struct popup_data {
};
static void
+popup_redraw_cb(const struct tty_ctx *ttyctx)
+{
+ struct popup_data *pd = ttyctx->arg;
+
+ pd->c->flags |= CLIENT_REDRAWOVERLAY;
+}
+
+static int
+popup_set_client_cb(struct tty_ctx *ttyctx, struct client *c)
+{
+ struct popup_data *pd = ttyctx->arg;
+
+ if (c != pd->c)
+ return (0);
+ if (pd->c->flags & CLIENT_REDRAWOVERLAY)
+ return (0);
+
+ ttyctx->bigger = 0;
+ ttyctx->wox = 0;
+ ttyctx->woy = 0;
+ ttyctx->wsx = c->tty.sx;
+ ttyctx->wsy = c->tty.sy;
+
+ ttyctx->xoff = ttyctx->rxoff = pd->px + 1;
+ ttyctx->yoff = ttyctx->ryoff = pd->py + 1;
+
+ return (1);
+}
+
+static void
+popup_init_ctx_cb(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx)
+{
+ struct popup_data *pd = ctx->arg;
+
+ ttyctx->redraw_cb = popup_redraw_cb;
+ ttyctx->set_client_cb = popup_set_client_cb;
+ ttyctx->arg = pd;
+}
+
+static void
popup_write_screen(struct client *c, struct popup_data *pd)
{
struct cmdq_item *item = pd->item;
@@ -70,7 +112,7 @@ popup_write_screen(struct client *c, struct popup_data *pd)
else
format_defaults(ft, c, NULL, NULL, NULL);
- screen_write_start(&ctx, NULL, &pd->s);
+ screen_write_start(&ctx, &pd->s);
screen_write_clearscreen(&ctx, 8);
y = 0;
@@ -96,7 +138,7 @@ popup_write_screen(struct client *c, struct popup_data *pd)
screen_write_stop(&ctx);
}
-static int
+static struct screen *
popup_mode_cb(struct client *c, u_int *cx, u_int *cy)
{
struct popup_data *pd = c->overlay_data;
@@ -105,7 +147,7 @@ popup_mode_cb(struct client *c, u_int *cx, u_int *cy)
return (0);
*cx = pd->px + 1 + pd->s.cx;
*cy = pd->py + 1 + pd->s.cy;
- return (pd->s.mode);
+ return (&pd->s);
}
static int
@@ -130,7 +172,7 @@ popup_draw_cb(struct client *c, __unused struct screen_redraw_ctx *ctx0)
u_int i, px = pd->px, py = pd->py;
screen_init(&s, pd->sx, pd->sy, 0);
- screen_write_start(&ctx, NULL, &s);
+ screen_write_start(&ctx, &s);
screen_write_clearscreen(&ctx, 8);
screen_write_box(&ctx, pd->sx, pd->sy);
screen_write_cursormove(&ctx, 1, 1, 0);
@@ -138,8 +180,10 @@ popup_draw_cb(struct client *c, __unused struct screen_redraw_ctx *ctx0)
screen_write_stop(&ctx);
c->overlay_check = NULL;
- for (i = 0; i < pd->sy; i++)
- tty_draw_line(tty, NULL, &s, 0, i, pd->sx, px, py + i);
+ for (i = 0; i < pd->sy; i++){
+ tty_draw_line(tty, &s, 0, i, pd->sx, px, py + i,
+ &grid_default_cell, NULL);
+ }
c->overlay_check = popup_check_cb;
}
@@ -150,6 +194,9 @@ popup_free_cb(struct client *c)
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 &&
@@ -322,15 +369,23 @@ popup_job_update_cb(struct job *job)
{
struct popup_data *pd = job_get_data(job);
struct evbuffer *evb = job_get_event(job)->input;
+ struct client *c = pd->c;
struct screen *s = &pd->s;
void *data = EVBUFFER_DATA(evb);
size_t size = EVBUFFER_LENGTH(evb);
- if (size != 0) {
- input_parse_screen(pd->ictx, s, data, size);
- evbuffer_drain(evb, size);
- pd->c->flags |= CLIENT_REDRAWOVERLAY;
- }
+ if (size == 0)
+ return;
+
+ c->overlay_check = NULL;
+ c->tty.flags &= ~TTY_FREEZE;
+
+ input_parse_screen(pd->ictx, s, popup_init_ctx_cb, pd, data, size);
+
+ c->tty.flags |= TTY_FREEZE;
+ c->overlay_check = popup_check_cb;
+
+ evbuffer_drain(evb, size);
}
static void
@@ -403,7 +458,7 @@ 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)
+ struct cmd_find_state *fs, popup_close_cb cb, void *arg)
{
struct popup_data *pd;
u_int i;
@@ -422,6 +477,8 @@ popup_display(int flags, struct cmdq_item *item, u_int px, u_int py, u_int sx,
pd->c = c;
pd->c->references++;
+ pd->cb = cb;
+ pd->arg = arg;
pd->status = 128 + SIGHUP;
if (fs != NULL)