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:
		
							
								
								
									
										2
									
								
								cfg.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								cfg.c
									
									
									
									
									
								
							@@ -52,7 +52,7 @@ cfg_done(__unused struct cmdq_item *item, __unused void *data)
 | 
			
		||||
		cfg_show_causes(RB_MIN(sessions, &sessions));
 | 
			
		||||
 | 
			
		||||
	if (cfg_item != NULL)
 | 
			
		||||
		cfg_item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
		cmdq_continue(cfg_item);
 | 
			
		||||
 | 
			
		||||
	status_prompt_load_history();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -188,7 +188,7 @@ cmd_display_panes_free(struct client *c)
 | 
			
		||||
	struct cmd_display_panes_data	*cdata = c->overlay_data;
 | 
			
		||||
 | 
			
		||||
	if (cdata->item != NULL)
 | 
			
		||||
		cdata->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
		cmdq_continue(cdata->item);
 | 
			
		||||
	free(cdata->command);
 | 
			
		||||
	free(cdata);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -196,7 +196,7 @@ cmd_if_shell_callback(struct job *job)
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
	if (cdata->item != NULL)
 | 
			
		||||
		cdata->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
		cmdq_continue(cdata->item);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -176,7 +176,7 @@ cmd_load_buffer_callback(struct client *c, int closed, void *data)
 | 
			
		||||
		free(cause);
 | 
			
		||||
	}
 | 
			
		||||
out:
 | 
			
		||||
	cdata->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
	cmdq_continue(cdata->item);
 | 
			
		||||
 | 
			
		||||
	free(cdata->bufname);
 | 
			
		||||
	free(cdata);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								cmd-parse.y
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								cmd-parse.y
									
									
									
									
									
								
							@@ -1338,8 +1338,8 @@ static int
 | 
			
		||||
yylex_token_brace(char **buf, size_t *len)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_parse_state	*ps = &parse_state;
 | 
			
		||||
	int 			 ch, nesting = 1, escape = 0, quote = '\0';
 | 
			
		||||
	int			 lines = 0;
 | 
			
		||||
	int 			 ch, lines = 0, nesting = 1, escape = 0;
 | 
			
		||||
	int			 quote = '\0', token = 0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Extract a string up to the matching unquoted '}', including newlines
 | 
			
		||||
@@ -1349,6 +1349,10 @@ yylex_token_brace(char **buf, size_t *len)
 | 
			
		||||
	 * depth, we scan the input as if it was a tmux config file, and ignore
 | 
			
		||||
	 * braces which would be considered quoted, escaped, or in a comment.
 | 
			
		||||
	 *
 | 
			
		||||
	 * We update the token state after every character because '#' begins a
 | 
			
		||||
	 * comment only when it begins a token. For simplicity, we treat an
 | 
			
		||||
	 * unquoted directive format as comment.
 | 
			
		||||
	 *
 | 
			
		||||
	 * The result is verbatim copy of the input excluding the final brace.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
@@ -1368,6 +1372,8 @@ yylex_token_brace(char **buf, size_t *len)
 | 
			
		||||
		    ch == '\n' ||
 | 
			
		||||
		    ch == '\\')) {
 | 
			
		||||
			escape = 0;
 | 
			
		||||
			if (ch != '\n')
 | 
			
		||||
				token = 1;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -1383,7 +1389,7 @@ yylex_token_brace(char **buf, size_t *len)
 | 
			
		||||
 | 
			
		||||
		/* A newline always resets to unquoted. */
 | 
			
		||||
		if (ch == '\n') {
 | 
			
		||||
			quote = 0;
 | 
			
		||||
			quote = token = 0;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -1394,33 +1400,47 @@ yylex_token_brace(char **buf, size_t *len)
 | 
			
		||||
			 */
 | 
			
		||||
			if (ch == quote && quote != '#')
 | 
			
		||||
				quote = 0;
 | 
			
		||||
		} else  {
 | 
			
		||||
			token = 1;  /* token continues regardless */
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Not inside quotes or comment. */
 | 
			
		||||
			switch (ch) {
 | 
			
		||||
			case '"':
 | 
			
		||||
			case '\'':
 | 
			
		||||
			case '#':
 | 
			
		||||
				/* Beginning of quote or comment. */
 | 
			
		||||
				quote = ch;
 | 
			
		||||
				/* Beginning of quote or maybe comment. */
 | 
			
		||||
				if (ch != '#' || !token)
 | 
			
		||||
					quote = ch;
 | 
			
		||||
				token = 1;
 | 
			
		||||
				break;
 | 
			
		||||
			case ' ':
 | 
			
		||||
			case '\t':
 | 
			
		||||
			case ';':
 | 
			
		||||
				/* Delimiter - token resets. */
 | 
			
		||||
				token = 0;
 | 
			
		||||
				break;
 | 
			
		||||
			case '{':
 | 
			
		||||
				nesting++;
 | 
			
		||||
				token = 0; /* new commands set - token resets */
 | 
			
		||||
				break;
 | 
			
		||||
			case '}':
 | 
			
		||||
				nesting--;
 | 
			
		||||
				token = 1;  /* same as after quotes */
 | 
			
		||||
				if (nesting == 0) {
 | 
			
		||||
					(*len)--; /* remove closing } */
 | 
			
		||||
					ps->input->line += lines;
 | 
			
		||||
					return (1);
 | 
			
		||||
				}
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				token = 1;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Update line count after error as reporting the opening line
 | 
			
		||||
	 * is more useful than EOF.
 | 
			
		||||
	 * Update line count after error as reporting the opening line is more
 | 
			
		||||
	 * useful than EOF.
 | 
			
		||||
	 */
 | 
			
		||||
	yyerror("unterminated brace string");
 | 
			
		||||
	ps->input->line += lines;
 | 
			
		||||
 
 | 
			
		||||
@@ -156,6 +156,13 @@ cmdq_insert_hook(struct session *s, struct cmdq_item *item,
 | 
			
		||||
	free(name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Continue processing command queue. */
 | 
			
		||||
void
 | 
			
		||||
cmdq_continue(struct cmdq_item *item)
 | 
			
		||||
{
 | 
			
		||||
	item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Remove an item. */
 | 
			
		||||
static void
 | 
			
		||||
cmdq_remove(struct cmdq_item *item)
 | 
			
		||||
 
 | 
			
		||||
@@ -155,7 +155,7 @@ cmd_run_shell_callback(struct job *job)
 | 
			
		||||
	free(msg);
 | 
			
		||||
 | 
			
		||||
	if (cdata->item != NULL)
 | 
			
		||||
		cdata->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
		cmdq_continue(cdata->item);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -153,7 +153,7 @@ cmd_wait_for_signal(__unused struct cmdq_item *item, const char *name,
 | 
			
		||||
	log_debug("signal wait channel %s, with waiters", wc->name);
 | 
			
		||||
 | 
			
		||||
	TAILQ_FOREACH_SAFE(wi, &wc->waiters, entry, wi1) {
 | 
			
		||||
		wi->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
		cmdq_continue(wi->item);
 | 
			
		||||
 | 
			
		||||
		TAILQ_REMOVE(&wc->waiters, wi, entry);
 | 
			
		||||
		free(wi);
 | 
			
		||||
@@ -229,7 +229,7 @@ cmd_wait_for_unlock(struct cmdq_item *item, const char *name,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ((wi = TAILQ_FIRST(&wc->lockers)) != NULL) {
 | 
			
		||||
		wi->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
		cmdq_continue(wi->item);
 | 
			
		||||
		TAILQ_REMOVE(&wc->lockers, wi, entry);
 | 
			
		||||
		free(wi);
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -248,13 +248,13 @@ cmd_wait_for_flush(void)
 | 
			
		||||
 | 
			
		||||
	RB_FOREACH_SAFE(wc, wait_channels, &wait_channels, wc1) {
 | 
			
		||||
		TAILQ_FOREACH_SAFE(wi, &wc->waiters, entry, wi1) {
 | 
			
		||||
			wi->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
			cmdq_continue(wi->item);
 | 
			
		||||
			TAILQ_REMOVE(&wc->waiters, wi, entry);
 | 
			
		||||
			free(wi);
 | 
			
		||||
		}
 | 
			
		||||
		wc->woken = 1;
 | 
			
		||||
		TAILQ_FOREACH_SAFE(wi, &wc->lockers, entry, wi1) {
 | 
			
		||||
			wi->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
			cmdq_continue(wi->item);
 | 
			
		||||
			TAILQ_REMOVE(&wc->lockers, wi, entry);
 | 
			
		||||
			free(wi);
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								menu.c
									
									
									
									
									
								
							@@ -161,7 +161,7 @@ menu_free_cb(struct client *c)
 | 
			
		||||
	struct menu_data	*md = c->overlay_data;
 | 
			
		||||
 | 
			
		||||
	if (md->item != NULL)
 | 
			
		||||
		md->item->flags &= ~CMDQ_WAITING;
 | 
			
		||||
		cmdq_continue(md->item);
 | 
			
		||||
 | 
			
		||||
	if (md->cb != NULL)
 | 
			
		||||
		md->cb(md->menu, UINT_MAX, KEYC_NONE, md->data);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -2039,6 +2039,7 @@ void		 cmdq_insert_after(struct cmdq_item *, struct cmdq_item *);
 | 
			
		||||
void		 cmdq_append(struct client *, struct cmdq_item *);
 | 
			
		||||
void		 cmdq_insert_hook(struct session *, struct cmdq_item *,
 | 
			
		||||
		     struct cmd_find_state *, const char *, ...);
 | 
			
		||||
void		 cmdq_continue(struct cmdq_item *);
 | 
			
		||||
void printflike(3, 4) cmdq_format(struct cmdq_item *, const char *,
 | 
			
		||||
		     const char *, ...);
 | 
			
		||||
u_int		 cmdq_next(struct client *);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user