mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		@@ -136,11 +136,11 @@ server_client_get_key_table(struct client *c)
 | 
			
		||||
	return (name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Is this client using the default key table? */
 | 
			
		||||
int
 | 
			
		||||
server_client_is_default_key_table(struct client *c)
 | 
			
		||||
/* Is this table the default key table? */
 | 
			
		||||
static int
 | 
			
		||||
server_client_is_default_key_table(struct client *c, struct key_table *table)
 | 
			
		||||
{
 | 
			
		||||
	return (strcmp(c->keytable->name, server_client_get_key_table(c)) == 0);
 | 
			
		||||
	return (strcmp(table->name, server_client_get_key_table(c)) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Create a new client. */
 | 
			
		||||
@@ -791,8 +791,7 @@ server_client_handle_key(struct client *c, key_code key)
 | 
			
		||||
	struct window		*w;
 | 
			
		||||
	struct window_pane	*wp;
 | 
			
		||||
	struct timeval		 tv;
 | 
			
		||||
	const char		*name;
 | 
			
		||||
	struct key_table	*table;
 | 
			
		||||
	struct key_table	*table, *first;
 | 
			
		||||
	struct key_binding	 bd_find, *bd;
 | 
			
		||||
	int			 xtimeout;
 | 
			
		||||
	struct cmd_find_state	 fs;
 | 
			
		||||
@@ -868,22 +867,18 @@ server_client_handle_key(struct client *c, key_code key)
 | 
			
		||||
	if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s))
 | 
			
		||||
		goto forward;
 | 
			
		||||
 | 
			
		||||
retry:
 | 
			
		||||
	/*
 | 
			
		||||
	 * Work out the current key table. If the pane is in a mode, use
 | 
			
		||||
	 * the mode table instead of the default key table.
 | 
			
		||||
	 */
 | 
			
		||||
	name = NULL;
 | 
			
		||||
	if (wp != NULL && wp->mode != NULL && wp->mode->key_table != NULL)
 | 
			
		||||
		name = wp->mode->key_table(wp);
 | 
			
		||||
	if (name == NULL || !server_client_is_default_key_table(c))
 | 
			
		||||
	if (server_client_is_default_key_table(c, c->keytable) &&
 | 
			
		||||
	    wp != NULL &&
 | 
			
		||||
	    wp->mode != NULL &&
 | 
			
		||||
	    wp->mode->key_table != NULL)
 | 
			
		||||
		table = key_bindings_get_table(wp->mode->key_table(wp), 1);
 | 
			
		||||
	else
 | 
			
		||||
		table = c->keytable;
 | 
			
		||||
	else
 | 
			
		||||
		table = key_bindings_get_table(name, 1);
 | 
			
		||||
	if (wp == NULL)
 | 
			
		||||
		log_debug("key table %s (no pane)", table->name);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("key table %s (pane %%%u)", table->name, wp->id);
 | 
			
		||||
	first = table;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * The prefix always takes precedence and forces a switch to the prefix
 | 
			
		||||
@@ -897,6 +892,13 @@ retry:
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
retry:
 | 
			
		||||
	/* Log key table. */
 | 
			
		||||
	if (wp == NULL)
 | 
			
		||||
		log_debug("key table %s (no pane)", table->name);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("key table %s (pane %%%u)", table->name, wp->id);
 | 
			
		||||
 | 
			
		||||
	/* Try to see if there is a key binding in the current table. */
 | 
			
		||||
	bd_find.key = key;
 | 
			
		||||
	bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
 | 
			
		||||
@@ -911,8 +913,10 @@ retry:
 | 
			
		||||
			server_client_set_key_table(c, NULL);
 | 
			
		||||
			c->flags &= ~CLIENT_REPEAT;
 | 
			
		||||
			server_status_client(c);
 | 
			
		||||
			table = c->keytable;
 | 
			
		||||
			goto retry;
 | 
			
		||||
		}
 | 
			
		||||
		log_debug("found in key table %s", table->name);
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Take a reference to this table to make sure the key binding
 | 
			
		||||
@@ -957,19 +961,24 @@ retry:
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * No match in this table. If repeating, switch the client back to the
 | 
			
		||||
	 * root table and try again.
 | 
			
		||||
	 * No match in this table. If not in the root table or if repeating,
 | 
			
		||||
	 * switch the client back to the root table and try again.
 | 
			
		||||
	 */
 | 
			
		||||
	if (c->flags & CLIENT_REPEAT) {
 | 
			
		||||
	log_debug("not found in key table %s", table->name);
 | 
			
		||||
	if (!server_client_is_default_key_table(c, table) ||
 | 
			
		||||
	    (c->flags & CLIENT_REPEAT)) {
 | 
			
		||||
		server_client_set_key_table(c, NULL);
 | 
			
		||||
		c->flags &= ~CLIENT_REPEAT;
 | 
			
		||||
		server_status_client(c);
 | 
			
		||||
		table = c->keytable;
 | 
			
		||||
		goto retry;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If no match and we're not in the root table, that's it. */
 | 
			
		||||
	if (name == NULL && !server_client_is_default_key_table(c)) {
 | 
			
		||||
		log_debug("no key in key table %s", table->name);
 | 
			
		||||
	/*
 | 
			
		||||
	 * No match in the root table either. If this wasn't the first table
 | 
			
		||||
	 * tried, don't pass the key to the pane.
 | 
			
		||||
	 */
 | 
			
		||||
	if (first != table) {
 | 
			
		||||
		server_client_set_key_table(c, NULL);
 | 
			
		||||
		server_status_client(c);
 | 
			
		||||
		return;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user