summaryrefslogtreecommitdiffstats
path: root/input.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2012-05-03 16:55:48 +0000
committerTiago Cunha <tcunha@gmx.com>2012-05-03 16:55:48 +0000
commitd0907861f933c8ff7547a0f4994a620e796a995b (patch)
tree5017a19039a053fe18b9587a809742eeab9f56fc /input.c
parent714416074ac16bfdc97d875ea2bce926c7b9637f (diff)
Sync OpenBSD patchset 1102:
Add a buffer with all input from last ground state, will be used for control mode. From George Nachman.
Diffstat (limited to 'input.c')
-rw-r--r--input.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/input.c b/input.c
index 9267cfbf..3c11da1d 100644
--- a/input.c
+++ b/input.c
@@ -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. */