mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	The line number needs to be updated only after the \n is processed by
the parser, so store a flag and update it next time around. Also each new line needs its own shared data.
This commit is contained in:
		@@ -58,6 +58,7 @@ struct cmd_parse_state {
 | 
				
			|||||||
	size_t				 len;
 | 
						size_t				 len;
 | 
				
			||||||
	size_t				 off;
 | 
						size_t				 off;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int				 eol;
 | 
				
			||||||
	int				 eof;
 | 
						int				 eof;
 | 
				
			||||||
	struct cmd_parse_input		*input;
 | 
						struct cmd_parse_input		*input;
 | 
				
			||||||
	u_int				 escapes;
 | 
						u_int				 escapes;
 | 
				
			||||||
@@ -933,6 +934,10 @@ yylex(void)
 | 
				
			|||||||
	char			*token, *cp;
 | 
						char			*token, *cp;
 | 
				
			||||||
	int			 ch, next;
 | 
						int			 ch, next;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ps->eol)
 | 
				
			||||||
 | 
							ps->input->line++;
 | 
				
			||||||
 | 
						ps->eol = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (;;) {
 | 
						for (;;) {
 | 
				
			||||||
		ch = yylex_getc();
 | 
							ch = yylex_getc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -959,7 +964,7 @@ yylex(void)
 | 
				
			|||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * End of line. Update the line number.
 | 
								 * End of line. Update the line number.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			ps->input->line++;
 | 
								ps->eol = 1;
 | 
				
			||||||
			return ('\n');
 | 
								return ('\n');
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								cmd-queue.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								cmd-queue.c
									
									
									
									
									
								
							@@ -203,16 +203,20 @@ cmdq_get_command(struct cmd_list *cmdlist, struct cmd_find_state *current,
 | 
				
			|||||||
	struct cmdq_item	*item, *first = NULL, *last = NULL;
 | 
						struct cmdq_item	*item, *first = NULL, *last = NULL;
 | 
				
			||||||
	struct cmd		*cmd;
 | 
						struct cmd		*cmd;
 | 
				
			||||||
	struct cmdq_shared	*shared;
 | 
						struct cmdq_shared	*shared;
 | 
				
			||||||
 | 
						u_int			 group = 0;
 | 
				
			||||||
	shared = xcalloc(1, sizeof *shared);
 | 
					 | 
				
			||||||
	if (current != NULL)
 | 
					 | 
				
			||||||
		cmd_find_copy_state(&shared->current, current);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		cmd_find_clear_state(&shared->current, 0);
 | 
					 | 
				
			||||||
	if (m != NULL)
 | 
					 | 
				
			||||||
		memcpy(&shared->mouse, m, sizeof shared->mouse);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
 | 
						TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
 | 
				
			||||||
 | 
							if (cmd->group != group) {
 | 
				
			||||||
 | 
								shared = xcalloc(1, sizeof *shared);
 | 
				
			||||||
 | 
								if (current != NULL)
 | 
				
			||||||
 | 
									cmd_find_copy_state(&shared->current, current);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									cmd_find_clear_state(&shared->current, 0);
 | 
				
			||||||
 | 
								if (m != NULL)
 | 
				
			||||||
 | 
									memcpy(&shared->mouse, m, sizeof shared->mouse);
 | 
				
			||||||
 | 
								group = cmd->group;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		item = xcalloc(1, sizeof *item);
 | 
							item = xcalloc(1, sizeof *item);
 | 
				
			||||||
		xasprintf(&item->name, "[%s/%p]", cmd->entry->name, item);
 | 
							xasprintf(&item->name, "[%s/%p]", cmd->entry->name, item);
 | 
				
			||||||
		item->type = CMDQ_COMMAND;
 | 
							item->type = CMDQ_COMMAND;
 | 
				
			||||||
@@ -263,12 +267,20 @@ static enum cmd_retval
 | 
				
			|||||||
cmdq_fire_command(struct cmdq_item *item)
 | 
					cmdq_fire_command(struct cmdq_item *item)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct client		*c = item->client;
 | 
						struct client		*c = item->client;
 | 
				
			||||||
 | 
						const char		*name = cmdq_name(c);
 | 
				
			||||||
	struct cmdq_shared	*shared = item->shared;
 | 
						struct cmdq_shared	*shared = item->shared;
 | 
				
			||||||
	struct cmd		*cmd = item->cmd;
 | 
						struct cmd		*cmd = item->cmd;
 | 
				
			||||||
	const struct cmd_entry	*entry = cmd->entry;
 | 
						const struct cmd_entry	*entry = cmd->entry;
 | 
				
			||||||
	enum cmd_retval		 retval;
 | 
						enum cmd_retval		 retval;
 | 
				
			||||||
	struct cmd_find_state	*fsp, fs;
 | 
						struct cmd_find_state	*fsp, fs;
 | 
				
			||||||
	int			 flags;
 | 
						int			 flags;
 | 
				
			||||||
 | 
						char			*tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (log_get_level() > 1) {
 | 
				
			||||||
 | 
							tmp = cmd_print(cmd);
 | 
				
			||||||
 | 
							log_debug("%s %s: (%u) %s", __func__, name, item->group, tmp);
 | 
				
			||||||
 | 
							free(tmp);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	flags = !!(shared->flags & CMDQ_SHARED_CONTROL);
 | 
						flags = !!(shared->flags & CMDQ_SHARED_CONTROL);
 | 
				
			||||||
	cmdq_guard(item, "begin", flags);
 | 
						cmdq_guard(item, "begin", flags);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user