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. */ | ||||
| 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", | ||||
| 	  .type = OPTIONS_TABLE_NUMBER, | ||||
| 	  .minimum = 0, | ||||
|   | ||||
| @@ -34,6 +34,7 @@ void	server_client_check_exit(struct client *); | ||||
| void	server_client_check_redraw(struct client *); | ||||
| void	server_client_set_title(struct client *); | ||||
| void	server_client_reset_state(struct client *); | ||||
| int	server_client_assume_paste(struct session *); | ||||
|  | ||||
| int	server_client_msg_dispatch(struct client *); | ||||
| 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); | ||||
| } | ||||
|  | ||||
| /* 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. */ | ||||
| void | ||||
| 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 timeval		 tv; | ||||
| 	struct key_binding	*bd; | ||||
| 	int		      	 xtimeout, isprefix; | ||||
| 	int		      	 xtimeout, isprefix, ispaste; | ||||
|  | ||||
| 	/* Check the client is good to accept input. */ | ||||
| 	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. */ | ||||
| 	if (gettimeofday(&c->activity_time, NULL) != 0) | ||||
| 		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); | ||||
|  | ||||
| 	w = c->session->curw->window; | ||||
| @@ -382,25 +402,31 @@ server_client_handle_key(struct client *c, int 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; | ||||
| 	else if (key == options_get_number(&c->session->options, "prefix2")) | ||||
| 	else if (key == options_get_number(&s->options, "prefix2")) | ||||
| 		isprefix = 1; | ||||
| 	else | ||||
| 		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. */ | ||||
| 	if (!(c->flags & CLIENT_PREFIX)) { | ||||
| 		if (isprefix) | ||||
| 		if (isprefix) { | ||||
| 			c->flags |= CLIENT_PREFIX; | ||||
| 		else { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		/* Try as a non-prefix key binding. */ | ||||
| 			if ((bd = key_bindings_lookup(key)) == NULL) { | ||||
| 		if (ispaste || (bd = key_bindings_lookup(key)) == NULL) { | ||||
| 			if (!(c->flags & CLIENT_READONLY)) | ||||
| 					window_pane_key(wp, c->session, key); | ||||
| 				window_pane_key(wp, s, key); | ||||
| 		} else | ||||
| 			key_bindings_dispatch(bd, c); | ||||
| 		} | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| @@ -413,7 +439,7 @@ server_client_handle_key(struct client *c, int key) | ||||
| 			if (isprefix) | ||||
| 				c->flags |= CLIENT_PREFIX; | ||||
| 			else if (!(c->flags & CLIENT_READONLY)) | ||||
| 				window_pane_key(wp, c->session, key); | ||||
| 				window_pane_key(wp, s, key); | ||||
| 		} | ||||
| 		return; | ||||
| 	} | ||||
| @@ -424,12 +450,12 @@ server_client_handle_key(struct client *c, int key) | ||||
| 		if (isprefix) | ||||
| 			c->flags |= CLIENT_PREFIX; | ||||
| 		else if (!(c->flags & CLIENT_READONLY)) | ||||
| 			window_pane_key(wp, c->session, key); | ||||
| 			window_pane_key(wp, s, key); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	/* 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) { | ||||
| 		c->flags |= CLIENT_PREFIX|CLIENT_REPEAT; | ||||
|  | ||||
|   | ||||
							
								
								
									
										7
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -2044,6 +2044,13 @@ interactive menu when required. | ||||
| .Pp | ||||
| Available session options are: | ||||
| .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 | ||||
| Set the base index from which an unused index should be searched when a new | ||||
| window is created. | ||||
|   | ||||
							
								
								
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1095,6 +1095,7 @@ struct session { | ||||
|  | ||||
| 	struct timeval	 creation_time; | ||||
| 	struct timeval	 activity_time; | ||||
| 	struct timeval	 last_activity_time; | ||||
|  | ||||
| 	u_int		 sx; | ||||
| 	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 *, | ||||
| 		     const char *, int); | ||||
|  | ||||
|  | ||||
| /* clock.c */ | ||||
| extern const char clock_table[14][5][5]; | ||||
| void		 clock_draw(struct screen_write_ctx *, int, int); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Nicholas Marriott
					Nicholas Marriott