=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/input.c,v retrieving revision 1.51 retrieving revision 1.52 diff -c -r1.51 -r1.52 *** src/usr.bin/tmux/input.c 2012/03/20 11:01:00 1.51 --- src/usr.bin/tmux/input.c 2012/04/25 21:12:49 1.52 *************** *** 1,4 **** ! /* $OpenBSD: input.c,v 1.51 2012/03/20 11:01:00 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: input.c,v 1.52 2012/04/25 21:12:49 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 47,55 **** --- 47,57 ---- */ /* 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,705 **** ictx->state = &input_state_ground; ictx->flags = 0; } /* Destroy input parser. */ void ! input_free(unused struct window_pane *wp) { } /* Parse input. */ void input_parse(struct window_pane *wp) --- 694,729 ---- ictx->state = &input_state_ground; ictx->flags = 0; + + ictx->since_ground = evbuffer_new(); } /* Destroy input parser. */ void ! 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. */ void input_parse(struct window_pane *wp) *************** *** 755,767 **** 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); ! } } /* Close the screen. */ --- 779,790 ---- continue; /* And switch state, if necessary. */ ! 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. */