mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 16:46:18 +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 {
 | 
			
		||||
			/* 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);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* 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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -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