mirror of
https://github.com/tmux/tmux.git
synced 2024-11-16 17:39:09 +00:00
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:
parent
714416074a
commit
d0907861f9
39
input.c
39
input.c
@ -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
6
tmux.h
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user