mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Add a way to force a colour to RGB and a format to display it.
This commit is contained in:
		
							
								
								
									
										15
									
								
								colour.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								colour.c
									
									
									
									
									
								
							@@ -105,6 +105,21 @@ colour_split_rgb(int c, u_char *r, u_char *g, u_char *b)
 | 
				
			|||||||
	*b = c & 0xff;
 | 
						*b = c & 0xff;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Force colour to RGB if not already. */
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					colour_force_rgb(int c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (c & COLOUR_FLAG_RGB)
 | 
				
			||||||
 | 
							return (c);
 | 
				
			||||||
 | 
						if (c & COLOUR_FLAG_256)
 | 
				
			||||||
 | 
							return (colour_256toRGB(c));
 | 
				
			||||||
 | 
						if (c >= 0 && c <= 7)
 | 
				
			||||||
 | 
							return (colour_256toRGB(c));
 | 
				
			||||||
 | 
						if (c >= 90 & c <= 97)
 | 
				
			||||||
 | 
							return (colour_256toRGB(8 + c - 90));
 | 
				
			||||||
 | 
						return (-1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Convert colour to a string. */
 | 
					/* Convert colour to a string. */
 | 
				
			||||||
const char *
 | 
					const char *
 | 
				
			||||||
colour_tostring(int c)
 | 
					colour_tostring(int c)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								format.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								format.c
									
									
									
									
									
								
							@@ -101,6 +101,7 @@ format_job_cmp(struct format_job *fj1, struct format_job *fj2)
 | 
				
			|||||||
#define FORMAT_WINDOW_NAME 0x4000
 | 
					#define FORMAT_WINDOW_NAME 0x4000
 | 
				
			||||||
#define FORMAT_SESSION_NAME 0x8000
 | 
					#define FORMAT_SESSION_NAME 0x8000
 | 
				
			||||||
#define FORMAT_CHARACTER 0x10000
 | 
					#define FORMAT_CHARACTER 0x10000
 | 
				
			||||||
 | 
					#define FORMAT_COLOUR 0x20000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Limit on recursion. */
 | 
					/* Limit on recursion. */
 | 
				
			||||||
#define FORMAT_LOOP_LIMIT 100
 | 
					#define FORMAT_LOOP_LIMIT 100
 | 
				
			||||||
@@ -3555,7 +3556,7 @@ format_build_modifiers(struct format_expand_state *es, const char **s,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Modifiers are a ; separated list of the forms:
 | 
						 * Modifiers are a ; separated list of the forms:
 | 
				
			||||||
	 *      l,m,C,a,b,d,n,t,w,q,E,T,S,W,P,<,>
 | 
						 *      l,m,C,a,b,c,d,n,t,w,q,E,T,S,W,P,<,>
 | 
				
			||||||
	 *	=a
 | 
						 *	=a
 | 
				
			||||||
	 *	=/a
 | 
						 *	=/a
 | 
				
			||||||
	 *      =/a/
 | 
						 *      =/a/
 | 
				
			||||||
@@ -3572,7 +3573,7 @@ format_build_modifiers(struct format_expand_state *es, const char **s,
 | 
				
			|||||||
			cp++;
 | 
								cp++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Check single character modifiers with no arguments. */
 | 
							/* Check single character modifiers with no arguments. */
 | 
				
			||||||
		if (strchr("labdnwETSWP<>", cp[0]) != NULL &&
 | 
							if (strchr("labcdnwETSWP<>", cp[0]) != NULL &&
 | 
				
			||||||
		    format_is_end(cp[1])) {
 | 
							    format_is_end(cp[1])) {
 | 
				
			||||||
			format_add_modifier(&list, count, cp, 1, NULL, 0);
 | 
								format_add_modifier(&list, count, cp, 1, NULL, 0);
 | 
				
			||||||
			cp++;
 | 
								cp++;
 | 
				
			||||||
@@ -4052,10 +4053,10 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
 | 
				
			|||||||
	const char			 *errstr, *copy, *cp, *marker = NULL;
 | 
						const char			 *errstr, *copy, *cp, *marker = NULL;
 | 
				
			||||||
	const char			 *time_format = NULL;
 | 
						const char			 *time_format = NULL;
 | 
				
			||||||
	char				 *copy0, *condition, *found, *new;
 | 
						char				 *copy0, *condition, *found, *new;
 | 
				
			||||||
	char				 *value, *left, *right, c;
 | 
						char				 *value, *left, *right;
 | 
				
			||||||
	size_t				  valuelen;
 | 
						size_t				  valuelen;
 | 
				
			||||||
	int				  modifiers = 0, limit = 0, width = 0;
 | 
						int				  modifiers = 0, limit = 0, width = 0;
 | 
				
			||||||
	int				  j;
 | 
						int				  j, c;
 | 
				
			||||||
	struct format_modifier		 *list, *cmp = NULL, *search = NULL;
 | 
						struct format_modifier		 *list, *cmp = NULL, *search = NULL;
 | 
				
			||||||
	struct format_modifier		**sub = NULL, *mexp = NULL, *fm;
 | 
						struct format_modifier		**sub = NULL, *mexp = NULL, *fm;
 | 
				
			||||||
	u_int				  i, count, nsub = 0;
 | 
						u_int				  i, count, nsub = 0;
 | 
				
			||||||
@@ -4126,6 +4127,9 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
 | 
				
			|||||||
			case 'b':
 | 
								case 'b':
 | 
				
			||||||
				modifiers |= FORMAT_BASENAME;
 | 
									modifiers |= FORMAT_BASENAME;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
								case 'c':
 | 
				
			||||||
 | 
									modifiers |= FORMAT_COLOUR;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
			case 'd':
 | 
								case 'd':
 | 
				
			||||||
				modifiers |= FORMAT_DIRNAME;
 | 
									modifiers |= FORMAT_DIRNAME;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
@@ -4201,6 +4205,18 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
 | 
				
			|||||||
		goto done;
 | 
							goto done;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Is this a colour? */
 | 
				
			||||||
 | 
						if (modifiers & FORMAT_COLOUR) {
 | 
				
			||||||
 | 
							new = format_expand1(es, copy);
 | 
				
			||||||
 | 
							c = colour_fromstring(new);
 | 
				
			||||||
 | 
							if (c == -1 || (c = colour_force_rgb(c)) == -1)
 | 
				
			||||||
 | 
								value = xstrdup("");
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								xasprintf(&value, "%06x", c & 0xffffff);
 | 
				
			||||||
 | 
							free(new);
 | 
				
			||||||
 | 
							goto done;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Is this a loop, comparison or condition? */
 | 
						/* Is this a loop, comparison or condition? */
 | 
				
			||||||
	if (modifiers & FORMAT_SESSIONS) {
 | 
						if (modifiers & FORMAT_SESSIONS) {
 | 
				
			||||||
		value = format_loop_sessions(es, copy);
 | 
							value = format_loop_sessions(es, copy);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								tmux.1
									
									
									
									
									
								
							@@ -4831,6 +4831,10 @@ replaces a numeric argument by its ASCII equivalent, so
 | 
				
			|||||||
.Ql #{a:98}
 | 
					.Ql #{a:98}
 | 
				
			||||||
results in
 | 
					results in
 | 
				
			||||||
.Ql b .
 | 
					.Ql b .
 | 
				
			||||||
 | 
					.Ql c
 | 
				
			||||||
 | 
					replaces a
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					colour by its six-digit hexadecimal RGB value.
 | 
				
			||||||
.Pp
 | 
					.Pp
 | 
				
			||||||
A limit may be placed on the length of the resultant string by prefixing it
 | 
					A limit may be placed on the length of the resultant string by prefixing it
 | 
				
			||||||
by an
 | 
					by an
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -2616,6 +2616,7 @@ int	 input_key_get_mouse(struct screen *, struct mouse_event *, u_int,
 | 
				
			|||||||
int	 colour_find_rgb(u_char, u_char, u_char);
 | 
					int	 colour_find_rgb(u_char, u_char, u_char);
 | 
				
			||||||
int	 colour_join_rgb(u_char, u_char, u_char);
 | 
					int	 colour_join_rgb(u_char, u_char, u_char);
 | 
				
			||||||
void	 colour_split_rgb(int, u_char *, u_char *, u_char *);
 | 
					void	 colour_split_rgb(int, u_char *, u_char *, u_char *);
 | 
				
			||||||
 | 
					int	 colour_force_rgb(int);
 | 
				
			||||||
const char *colour_tostring(int);
 | 
					const char *colour_tostring(int);
 | 
				
			||||||
int	 colour_fromstring(const char *s);
 | 
					int	 colour_fromstring(const char *s);
 | 
				
			||||||
int	 colour_256toRGB(int);
 | 
					int	 colour_256toRGB(int);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user