mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +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:
		
							
								
								
									
										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;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user