Add a buffer with all input from last ground state, will be used for

control mode. From George Nachman.
pull/1/head
Nicholas Marriott 2012-04-25 21:12:49 +00:00
parent 94795eb48e
commit ff5155f719
2 changed files with 37 additions and 8 deletions

39
input.c
View File

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

6
tmux.h
View File

@ -777,6 +777,12 @@ struct input_ctx {
#define INPUT_DISCARD 0x1
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;
};
/*