mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 16:46:18 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		
							
								
								
									
										163
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										163
									
								
								window.c
									
									
									
									
									
								
							@@ -950,7 +950,7 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
 | 
			
		||||
	wp = xcalloc(1, sizeof *wp);
 | 
			
		||||
	wp->window = w;
 | 
			
		||||
	wp->options = options_create(w->options);
 | 
			
		||||
	wp->flags = PANE_STYLECHANGED;
 | 
			
		||||
	wp->flags = (PANE_STYLECHANGED|PANE_THEMECHANGED);
 | 
			
		||||
 | 
			
		||||
	wp->id = next_window_pane_id++;
 | 
			
		||||
	RB_INSERT(window_pane_tree, &all_window_panes, wp);
 | 
			
		||||
@@ -1769,6 +1769,8 @@ window_set_fill_character(struct window *w)
 | 
			
		||||
		ud = utf8_fromcstr(value);
 | 
			
		||||
		if (ud != NULL && ud[0].width == 1)
 | 
			
		||||
			w->fill_character = ud;
 | 
			
		||||
		else
 | 
			
		||||
			free(ud);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1802,3 +1804,162 @@ window_pane_show_scrollbar(struct window_pane *wp, int sb_option)
 | 
			
		||||
		return (1);
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
window_pane_get_bg(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	int			c;
 | 
			
		||||
	struct grid_cell	defaults;
 | 
			
		||||
 | 
			
		||||
	c = window_pane_get_bg_control_client(wp);
 | 
			
		||||
	if (c == -1) {
 | 
			
		||||
		tty_default_colours(&defaults, wp);
 | 
			
		||||
		if (COLOUR_DEFAULT(defaults.bg))
 | 
			
		||||
			c = window_get_bg_client(wp);
 | 
			
		||||
		else
 | 
			
		||||
			c = defaults.bg;
 | 
			
		||||
	}
 | 
			
		||||
	return (c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Get a client with a background for the pane. */
 | 
			
		||||
int
 | 
			
		||||
window_get_bg_client(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct window	*w = wp->window;
 | 
			
		||||
	struct client	*loop;
 | 
			
		||||
 | 
			
		||||
	TAILQ_FOREACH(loop, &clients, entry) {
 | 
			
		||||
		if (loop->flags & CLIENT_UNATTACHEDFLAGS)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (loop->session == NULL || !session_has(loop->session, w))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (loop->tty.bg == -1)
 | 
			
		||||
			continue;
 | 
			
		||||
		return (loop->tty.bg);
 | 
			
		||||
	}
 | 
			
		||||
	return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * If any control mode client exists that has provided a bg color, return it.
 | 
			
		||||
 * Otherwise, return -1.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
window_pane_get_bg_control_client(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
 | 
			
		||||
	if (wp->control_bg == -1)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	TAILQ_FOREACH(c, &clients, entry) {
 | 
			
		||||
		if (c->flags & CLIENT_CONTROL)
 | 
			
		||||
			return (wp->control_bg);
 | 
			
		||||
	}
 | 
			
		||||
	return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Get a client with a foreground for the pane. There isn't much to choose
 | 
			
		||||
 * between them so just use the first.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
window_pane_get_fg(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct window	*w = wp->window;
 | 
			
		||||
	struct client	*loop;
 | 
			
		||||
 | 
			
		||||
	TAILQ_FOREACH(loop, &clients, entry) {
 | 
			
		||||
		if (loop->flags & CLIENT_UNATTACHEDFLAGS)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (loop->session == NULL || !session_has(loop->session, w))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (loop->tty.fg == -1)
 | 
			
		||||
			continue;
 | 
			
		||||
		return (loop->tty.fg);
 | 
			
		||||
	}
 | 
			
		||||
	return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * If any control mode client exists that has provided a fg color, return it.
 | 
			
		||||
 * Otherwise, return -1.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
window_pane_get_fg_control_client(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
 | 
			
		||||
	if (wp->control_fg == -1)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	TAILQ_FOREACH(c, &clients, entry) {
 | 
			
		||||
		if (c->flags & CLIENT_CONTROL)
 | 
			
		||||
			return (wp->control_fg);
 | 
			
		||||
	}
 | 
			
		||||
	return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum client_theme
 | 
			
		||||
window_pane_get_theme(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct window		*w = wp->window;
 | 
			
		||||
	struct client		*loop;
 | 
			
		||||
	enum client_theme	 theme;
 | 
			
		||||
	int			 found_light = 0, found_dark = 0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Derive theme from pane background color, if it's not the default
 | 
			
		||||
	 * colour.
 | 
			
		||||
	 */
 | 
			
		||||
	theme = colour_totheme(window_pane_get_bg(wp));
 | 
			
		||||
	if (theme != THEME_UNKNOWN)
 | 
			
		||||
		return (theme);
 | 
			
		||||
 | 
			
		||||
	/* Try to find a client that has a theme. */
 | 
			
		||||
	TAILQ_FOREACH(loop, &clients, entry) {
 | 
			
		||||
		if (loop->flags & CLIENT_UNATTACHEDFLAGS)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (loop->session == NULL || !session_has(loop->session, w))
 | 
			
		||||
			continue;
 | 
			
		||||
		switch (loop->theme) {
 | 
			
		||||
		case THEME_LIGHT:
 | 
			
		||||
			found_light = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case THEME_DARK:
 | 
			
		||||
			found_dark = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case THEME_UNKNOWN:
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (found_dark && !found_light)
 | 
			
		||||
		return (THEME_DARK);
 | 
			
		||||
	if (found_light && !found_dark)
 | 
			
		||||
		return (THEME_LIGHT);
 | 
			
		||||
	return (THEME_UNKNOWN);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
window_pane_send_theme_update(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	if (~wp->flags & PANE_THEMECHANGED)
 | 
			
		||||
		return;
 | 
			
		||||
	if (~wp->screen->mode & MODE_THEME_UPDATES)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	switch (window_pane_get_theme(wp)) {
 | 
			
		||||
	case THEME_LIGHT:
 | 
			
		||||
		input_key_pane(wp, KEYC_REPORT_LIGHT_THEME, NULL);
 | 
			
		||||
		break;
 | 
			
		||||
	case THEME_DARK:
 | 
			
		||||
		input_key_pane(wp, KEYC_REPORT_DARK_THEME, NULL);
 | 
			
		||||
		break;
 | 
			
		||||
	case THEME_UNKNOWN:
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wp->flags &= ~PANE_THEMECHANGED;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user