Sync OpenBSD patchset 1102:

Add a buffer with all input from last ground state, will be used for
control mode. From George Nachman.
This commit is contained in:
Tiago Cunha 2012-05-03 16:55:48 +00:00
parent 714416074a
commit d0907861f9
2 changed files with 37 additions and 8 deletions

39
input.c
View File

@ -47,9 +47,11 @@
*/ */
/* Helper functions. */ /* Helper functions. */
struct input_transition;
int input_split(struct input_ctx *); int input_split(struct input_ctx *);
int input_get(struct input_ctx *, u_int, int, int); int input_get(struct input_ctx *, u_int, int, int);
void input_reply(struct input_ctx *, const char *, ...); void input_reply(struct input_ctx *, const char *, ...);
void input_set_state(struct window_pane *, const struct input_transition *);
/* Transition entry/exit handlers. */ /* Transition entry/exit handlers. */
void input_clear(struct input_ctx *); void input_clear(struct input_ctx *);
@ -692,12 +694,34 @@ input_init(struct window_pane *wp)
ictx->state = &input_state_ground; ictx->state = &input_state_ground;
ictx->flags = 0; ictx->flags = 0;
ictx->since_ground = evbuffer_new();
} }
/* Destroy input parser. */ /* Destroy input parser. */
void void
input_free(unused struct window_pane *wp) input_free(struct window_pane *wp)
{ {
if (wp != NULL)
evbuffer_free(wp->ictx.since_ground);
}
/* Change input state. */
void
input_set_state(struct window_pane *wp, const struct input_transition *itr)
{
struct input_ctx *ictx = &wp->ictx;
struct evbuffer *ground_evb = ictx->since_ground;
if (ictx->state->exit != NULL)
ictx->state->exit(ictx);
if (itr->state == &input_state_ground)
evbuffer_drain(ground_evb, EVBUFFER_LENGTH(ground_evb));
ictx->state = itr->state;
if (ictx->state->enter != NULL)
ictx->state->enter(ictx);
} }
/* Parse input. */ /* Parse input. */
@ -755,13 +779,12 @@ input_parse(struct window_pane *wp)
continue; continue;
/* And switch state, if necessary. */ /* And switch state, if necessary. */
if (itr->state != NULL) { if (itr->state != NULL)
if (ictx->state->exit != NULL) input_set_state(wp, itr);
ictx->state->exit(ictx);
ictx->state = itr->state; /* If not in ground state, save input. */
if (ictx->state->enter != NULL) if (ictx->state != &input_state_ground)
ictx->state->enter(ictx); evbuffer_add(ictx->since_ground, &ictx->ch, 1);
}
} }
/* Close the screen. */ /* Close the screen. */

6
tmux.h
View File

@ -773,6 +773,12 @@ struct input_ctx {
#define INPUT_DISCARD 0x1 #define INPUT_DISCARD 0x1
const struct input_state *state; const struct input_state *state;
/*
* All input received since we were last in the ground state. Sent to
* control clients on connection.
*/
struct evbuffer *since_ground;
}; };
/* /*