mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	If timing between keys is less than (by default) 1 millisecond, assume
the text is being pasted. assume-paste-time option changes the value (0 disables). Based on a diff from Marcin Kulik.
This commit is contained in:
		| @@ -91,6 +91,13 @@ const struct options_table_entry server_options_table[] = { | |||||||
|  |  | ||||||
| /* Session options. */ | /* Session options. */ | ||||||
| const struct options_table_entry session_options_table[] = { | const struct options_table_entry session_options_table[] = { | ||||||
|  | 	{ .name = "assume-paste-time", | ||||||
|  | 	  .type = OPTIONS_TABLE_NUMBER, | ||||||
|  | 	  .minimum = 0, | ||||||
|  | 	  .maximum = INT_MAX, | ||||||
|  | 	  .default_num = 1, | ||||||
|  | 	}, | ||||||
|  |  | ||||||
| 	{ .name = "base-index", | 	{ .name = "base-index", | ||||||
| 	  .type = OPTIONS_TABLE_NUMBER, | 	  .type = OPTIONS_TABLE_NUMBER, | ||||||
| 	  .minimum = 0, | 	  .minimum = 0, | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ void	server_client_check_exit(struct client *); | |||||||
| void	server_client_check_redraw(struct client *); | void	server_client_check_redraw(struct client *); | ||||||
| void	server_client_set_title(struct client *); | void	server_client_set_title(struct client *); | ||||||
| void	server_client_reset_state(struct client *); | void	server_client_reset_state(struct client *); | ||||||
|  | int	server_client_assume_paste(struct session *); | ||||||
|  |  | ||||||
| int	server_client_msg_dispatch(struct client *); | int	server_client_msg_dispatch(struct client *); | ||||||
| void	server_client_msg_command(struct client *, struct msg_command_data *); | void	server_client_msg_command(struct client *, struct msg_command_data *); | ||||||
| @@ -325,6 +326,22 @@ server_client_check_mouse(struct client *c, struct window_pane *wp) | |||||||
| 	window_pane_mouse(wp, c->session, m); | 	window_pane_mouse(wp, c->session, m); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* Is this fast enough to probably be a paste? */ | ||||||
|  | int | ||||||
|  | server_client_assume_paste(struct session *s) | ||||||
|  | { | ||||||
|  | 	struct timeval	tv; | ||||||
|  | 	u_int		t; | ||||||
|  |  | ||||||
|  | 	if ((t = options_get_number(&s->options, "assume-paste-time")) == 0) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	timersub(&s->activity_time, &s->last_activity_time, &tv); | ||||||
|  | 	if (tv.tv_sec == 0 && tv.tv_usec < t * 1000) | ||||||
|  | 		return 1; | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Handle data key input from client. */ | /* Handle data key input from client. */ | ||||||
| void | void | ||||||
| server_client_handle_key(struct client *c, int key) | server_client_handle_key(struct client *c, int key) | ||||||
| @@ -334,7 +351,7 @@ server_client_handle_key(struct client *c, int key) | |||||||
| 	struct window_pane	*wp; | 	struct window_pane	*wp; | ||||||
| 	struct timeval		 tv; | 	struct timeval		 tv; | ||||||
| 	struct key_binding	*bd; | 	struct key_binding	*bd; | ||||||
| 	int		      	 xtimeout, isprefix; | 	int		      	 xtimeout, isprefix, ispaste; | ||||||
|  |  | ||||||
| 	/* Check the client is good to accept input. */ | 	/* Check the client is good to accept input. */ | ||||||
| 	if ((c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0) | 	if ((c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0) | ||||||
| @@ -346,6 +363,9 @@ server_client_handle_key(struct client *c, int key) | |||||||
| 	/* Update the activity timer. */ | 	/* Update the activity timer. */ | ||||||
| 	if (gettimeofday(&c->activity_time, NULL) != 0) | 	if (gettimeofday(&c->activity_time, NULL) != 0) | ||||||
| 		fatal("gettimeofday failed"); | 		fatal("gettimeofday failed"); | ||||||
|  |  | ||||||
|  | 	memcpy(&s->last_activity_time, &s->activity_time, | ||||||
|  | 	    sizeof s->last_activity_time); | ||||||
| 	memcpy(&s->activity_time, &c->activity_time, sizeof s->activity_time); | 	memcpy(&s->activity_time, &c->activity_time, sizeof s->activity_time); | ||||||
|  |  | ||||||
| 	w = c->session->curw->window; | 	w = c->session->curw->window; | ||||||
| @@ -382,25 +402,31 @@ server_client_handle_key(struct client *c, int key) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Is this a prefix key? */ | 	/* Is this a prefix key? */ | ||||||
| 	if (key == options_get_number(&c->session->options, "prefix")) | 	if (key == options_get_number(&s->options, "prefix")) | ||||||
| 		isprefix = 1; | 		isprefix = 1; | ||||||
| 	else if (key == options_get_number(&c->session->options, "prefix2")) | 	else if (key == options_get_number(&s->options, "prefix2")) | ||||||
| 		isprefix = 1; | 		isprefix = 1; | ||||||
| 	else | 	else | ||||||
| 		isprefix = 0; | 		isprefix = 0; | ||||||
|  |  | ||||||
|  | 	/* Treat prefix as a regular key when pasting is detected. */ | ||||||
|  | 	ispaste = server_client_assume_paste(s); | ||||||
|  | 	if (ispaste) | ||||||
|  | 		isprefix = 0; | ||||||
|  |  | ||||||
| 	/* No previous prefix key. */ | 	/* No previous prefix key. */ | ||||||
| 	if (!(c->flags & CLIENT_PREFIX)) { | 	if (!(c->flags & CLIENT_PREFIX)) { | ||||||
| 		if (isprefix) | 		if (isprefix) { | ||||||
| 			c->flags |= CLIENT_PREFIX; | 			c->flags |= CLIENT_PREFIX; | ||||||
| 		else { | 			return; | ||||||
| 			/* Try as a non-prefix key binding. */ |  | ||||||
| 			if ((bd = key_bindings_lookup(key)) == NULL) { |  | ||||||
| 				if (!(c->flags & CLIENT_READONLY)) |  | ||||||
| 					window_pane_key(wp, c->session, key); |  | ||||||
| 			} else |  | ||||||
| 				key_bindings_dispatch(bd, c); |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		/* Try as a non-prefix key binding. */ | ||||||
|  | 		if (ispaste || (bd = key_bindings_lookup(key)) == NULL) { | ||||||
|  | 			if (!(c->flags & CLIENT_READONLY)) | ||||||
|  | 				window_pane_key(wp, s, key); | ||||||
|  | 		} else | ||||||
|  | 			key_bindings_dispatch(bd, c); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -413,7 +439,7 @@ server_client_handle_key(struct client *c, int key) | |||||||
| 			if (isprefix) | 			if (isprefix) | ||||||
| 				c->flags |= CLIENT_PREFIX; | 				c->flags |= CLIENT_PREFIX; | ||||||
| 			else if (!(c->flags & CLIENT_READONLY)) | 			else if (!(c->flags & CLIENT_READONLY)) | ||||||
| 				window_pane_key(wp, c->session, key); | 				window_pane_key(wp, s, key); | ||||||
| 		} | 		} | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| @@ -424,12 +450,12 @@ server_client_handle_key(struct client *c, int key) | |||||||
| 		if (isprefix) | 		if (isprefix) | ||||||
| 			c->flags |= CLIENT_PREFIX; | 			c->flags |= CLIENT_PREFIX; | ||||||
| 		else if (!(c->flags & CLIENT_READONLY)) | 		else if (!(c->flags & CLIENT_READONLY)) | ||||||
| 			window_pane_key(wp, c->session, key); | 			window_pane_key(wp, s, key); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* If this key can repeat, reset the repeat flags and timer. */ | 	/* If this key can repeat, reset the repeat flags and timer. */ | ||||||
| 	xtimeout = options_get_number(&c->session->options, "repeat-time"); | 	xtimeout = options_get_number(&s->options, "repeat-time"); | ||||||
| 	if (xtimeout != 0 && bd->can_repeat) { | 	if (xtimeout != 0 && bd->can_repeat) { | ||||||
| 		c->flags |= CLIENT_PREFIX|CLIENT_REPEAT; | 		c->flags |= CLIENT_PREFIX|CLIENT_REPEAT; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -2044,6 +2044,13 @@ interactive menu when required. | |||||||
| .Pp | .Pp | ||||||
| Available session options are: | Available session options are: | ||||||
| .Bl -tag -width Ds | .Bl -tag -width Ds | ||||||
|  | .It Ic assume-paste-time Ar milliseconds | ||||||
|  | If keys are entered faster than one in | ||||||
|  | .Ar milliseconds , | ||||||
|  | they are assumed to have been pasted rather than typed and | ||||||
|  | .Nm | ||||||
|  | key bindings are not processed. | ||||||
|  | The default is one millisecond and zero disables. | ||||||
| .It Ic base-index Ar index | .It Ic base-index Ar index | ||||||
| Set the base index from which an unused index should be searched when a new | Set the base index from which an unused index should be searched when a new | ||||||
| window is created. | window is created. | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1095,6 +1095,7 @@ struct session { | |||||||
|  |  | ||||||
| 	struct timeval	 creation_time; | 	struct timeval	 creation_time; | ||||||
| 	struct timeval	 activity_time; | 	struct timeval	 activity_time; | ||||||
|  | 	struct timeval	 last_activity_time; | ||||||
|  |  | ||||||
| 	u_int		 sx; | 	u_int		 sx; | ||||||
| 	u_int		 sy; | 	u_int		 sy; | ||||||
| @@ -1707,7 +1708,6 @@ char		*paste_print(struct paste_buffer *, size_t); | |||||||
| void		 paste_send_pane(struct paste_buffer *, struct window_pane *, | void		 paste_send_pane(struct paste_buffer *, struct window_pane *, | ||||||
| 		     const char *, int); | 		     const char *, int); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* clock.c */ | /* clock.c */ | ||||||
| extern const char clock_table[14][5][5]; | extern const char clock_table[14][5][5]; | ||||||
| void		 clock_draw(struct screen_write_ctx *, int, int); | void		 clock_draw(struct screen_write_ctx *, int, int); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nicholas Marriott
					Nicholas Marriott