mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 01:34:18 +00:00 
			
		
		
		
	Change how display-message uses the client. Originally it was only
intended as the target client where the message should be displayed but at some point (perhaps when -p was added), it was used for format expansion too. This means it can get a bit weird where you have client formats expanding for a client with a different current session than the target session. However, it is nice that display-message can be used to show information about a specific client. So change so that the -c client will be used if the session matches the target session (-t or default), otherwise the best client will be chosen.
This commit is contained in:
		@@ -53,7 +53,7 @@ static enum cmd_retval
 | 
				
			|||||||
cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
 | 
					cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct args		*args = self->args;
 | 
						struct args		*args = self->args;
 | 
				
			||||||
	struct client		*c;
 | 
						struct client		*c, *target_c;
 | 
				
			||||||
	struct session		*s = item->target.s;
 | 
						struct session		*s = item->target.s;
 | 
				
			||||||
	struct winlink		*wl = item->target.wl;
 | 
						struct winlink		*wl = item->target.wl;
 | 
				
			||||||
	struct window_pane	*wp = item->target.wp;
 | 
						struct window_pane	*wp = item->target.wp;
 | 
				
			||||||
@@ -65,7 +65,6 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
 | 
				
			|||||||
		cmdq_error(item, "only one of -F or argument must be given");
 | 
							cmdq_error(item, "only one of -F or argument must be given");
 | 
				
			||||||
		return (CMD_RETURN_ERROR);
 | 
							return (CMD_RETURN_ERROR);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c = cmd_find_client(item, args_get(args, 'c'), 1);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	template = args_get(args, 'F');
 | 
						template = args_get(args, 'F');
 | 
				
			||||||
	if (args->argc != 0)
 | 
						if (args->argc != 0)
 | 
				
			||||||
@@ -73,14 +72,27 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
 | 
				
			|||||||
	if (template == NULL)
 | 
						if (template == NULL)
 | 
				
			||||||
		template = DISPLAY_MESSAGE_TEMPLATE;
 | 
							template = DISPLAY_MESSAGE_TEMPLATE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * -c is intended to be the client where the message should be
 | 
				
			||||||
 | 
						 * displayed if -p is not given. But it makes sense to use it for the
 | 
				
			||||||
 | 
						 * formats too, assuming it matches the session. If it doesn't, use the
 | 
				
			||||||
 | 
						 * best client for the session.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						c = cmd_find_client(item, args_get(args, 'c'), 1);
 | 
				
			||||||
 | 
						if (c != NULL && c->session == s)
 | 
				
			||||||
 | 
							target_c = c;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							target_c = cmd_find_best_client(s);
 | 
				
			||||||
	ft = format_create(item->client, item, FORMAT_NONE, 0);
 | 
						ft = format_create(item->client, item, FORMAT_NONE, 0);
 | 
				
			||||||
	format_defaults(ft, c, s, wl, wp);
 | 
						format_defaults(ft, target_c, s, wl, wp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	msg = format_expand_time(ft, template, time(NULL));
 | 
						msg = format_expand_time(ft, template, time(NULL));
 | 
				
			||||||
	if (args_has(self->args, 'p'))
 | 
						if (args_has(self->args, 'p'))
 | 
				
			||||||
		cmdq_print(item, "%s", msg);
 | 
							cmdq_print(item, "%s", msg);
 | 
				
			||||||
	else if (c != NULL)
 | 
						else {
 | 
				
			||||||
		status_message_set(c, "%s", msg);
 | 
							if (c != NULL)
 | 
				
			||||||
 | 
								status_message_set(c, "%s", msg);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	free(msg);
 | 
						free(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	format_free(ft);
 | 
						format_free(ft);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -122,7 +122,7 @@ cmd_find_client_better(struct client *c, struct client *than)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Find best client for session. */
 | 
					/* Find best client for session. */
 | 
				
			||||||
static struct client *
 | 
					struct client *
 | 
				
			||||||
cmd_find_best_client(struct session *s)
 | 
					cmd_find_best_client(struct session *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct client	*c_loop, *c;
 | 
						struct client	*c_loop, *c;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								format.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								format.c
									
									
									
									
									
								
							@@ -1254,6 +1254,9 @@ void
 | 
				
			|||||||
format_defaults(struct format_tree *ft, struct client *c, struct session *s,
 | 
					format_defaults(struct format_tree *ft, struct client *c, struct session *s,
 | 
				
			||||||
    struct winlink *wl, struct window_pane *wp)
 | 
					    struct winlink *wl, struct window_pane *wp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (c != NULL && s != NULL && c->session != s)
 | 
				
			||||||
 | 
							log_debug("%s: session does not match", __func__);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	format_add(ft, "session_format", "%d", s != NULL);
 | 
						format_add(ft, "session_format", "%d", s != NULL);
 | 
				
			||||||
	format_add(ft, "window_format", "%d", wl != NULL);
 | 
						format_add(ft, "window_format", "%d", wl != NULL);
 | 
				
			||||||
	format_add(ft, "pane_format", "%d", wp != NULL);
 | 
						format_add(ft, "pane_format", "%d", wp != NULL);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1772,6 +1772,7 @@ long long	 args_strtonum(struct args *, u_char, long long, long long,
 | 
				
			|||||||
/* cmd-find.c */
 | 
					/* cmd-find.c */
 | 
				
			||||||
int		 cmd_find_target(struct cmd_find_state *, struct cmdq_item *,
 | 
					int		 cmd_find_target(struct cmd_find_state *, struct cmdq_item *,
 | 
				
			||||||
		     const char *, enum cmd_find_type, int);
 | 
							     const char *, enum cmd_find_type, int);
 | 
				
			||||||
 | 
					struct client	*cmd_find_best_client(struct session *);
 | 
				
			||||||
struct client	*cmd_find_client(struct cmdq_item *, const char *, int);
 | 
					struct client	*cmd_find_client(struct cmdq_item *, const char *, int);
 | 
				
			||||||
void		 cmd_find_clear_state(struct cmd_find_state *, int);
 | 
					void		 cmd_find_clear_state(struct cmd_find_state *, int);
 | 
				
			||||||
int		 cmd_find_empty_state(struct cmd_find_state *);
 | 
					int		 cmd_find_empty_state(struct cmd_find_state *);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user