mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Add option to show arrows for active pane indicator, GitHub issue 3022
from Marcel Partap.
This commit is contained in:
		@@ -64,6 +64,9 @@ static const char *options_table_cursor_style_list[] = {
 | 
			
		||||
static const char *options_table_pane_status_list[] = {
 | 
			
		||||
	"off", "top", "bottom", NULL
 | 
			
		||||
};
 | 
			
		||||
static const char *options_table_pane_border_indicators_list[] = {
 | 
			
		||||
	"off", "colour", "arrows", "both", NULL
 | 
			
		||||
};
 | 
			
		||||
static const char *options_table_pane_border_lines_list[] = {
 | 
			
		||||
	"single", "double", "heavy", "simple", "number", NULL
 | 
			
		||||
};
 | 
			
		||||
@@ -971,6 +974,15 @@ const struct options_table_entry options_table[] = {
 | 
			
		||||
	  .text = "Format of text in the pane status lines."
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	{ .name = "pane-border-indicators",
 | 
			
		||||
	  .type = OPTIONS_TABLE_CHOICE,
 | 
			
		||||
	  .scope = OPTIONS_TABLE_WINDOW,
 | 
			
		||||
	  .choices = options_table_pane_border_indicators_list,
 | 
			
		||||
	  .default_num = PANE_BORDER_COLOUR,
 | 
			
		||||
	  .text = "Whether to indicate the active pane by colouring border or "
 | 
			
		||||
		  "displaying arrow markers."
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	{ .name = "pane-border-lines",
 | 
			
		||||
	  .type = OPTIONS_TABLE_CHOICE,
 | 
			
		||||
	  .scope = OPTIONS_TABLE_WINDOW,
 | 
			
		||||
 
 | 
			
		||||
@@ -34,11 +34,16 @@ static void	screen_redraw_set_context(struct client *,
 | 
			
		||||
#define START_ISOLATE "\342\201\246"
 | 
			
		||||
#define END_ISOLATE   "\342\201\251"
 | 
			
		||||
 | 
			
		||||
/* Border in relation to a pane. */
 | 
			
		||||
enum screen_redraw_border_type {
 | 
			
		||||
	SCREEN_REDRAW_OUTSIDE,
 | 
			
		||||
	SCREEN_REDRAW_INSIDE,
 | 
			
		||||
	SCREEN_REDRAW_BORDER
 | 
			
		||||
	SCREEN_REDRAW_BORDER_LEFT,
 | 
			
		||||
	SCREEN_REDRAW_BORDER_RIGHT,
 | 
			
		||||
	SCREEN_REDRAW_BORDER_TOP,
 | 
			
		||||
	SCREEN_REDRAW_BORDER_BOTTOM
 | 
			
		||||
};
 | 
			
		||||
#define BORDER_MARKERS "  +,.-"
 | 
			
		||||
 | 
			
		||||
/* Get cell border character. */
 | 
			
		||||
static void
 | 
			
		||||
@@ -102,64 +107,74 @@ static enum screen_redraw_border_type
 | 
			
		||||
screen_redraw_pane_border(struct window_pane *wp, u_int px, u_int py,
 | 
			
		||||
    int pane_status)
 | 
			
		||||
{
 | 
			
		||||
	struct options	*oo = wp->window->options;
 | 
			
		||||
	int		 split = 0;
 | 
			
		||||
	u_int	 	 ex = wp->xoff + wp->sx, ey = wp->yoff + wp->sy;
 | 
			
		||||
 | 
			
		||||
	/* Inside pane. */
 | 
			
		||||
	if (px >= wp->xoff && px < ex && py >= wp->yoff && py < ey)
 | 
			
		||||
		return (SCREEN_REDRAW_INSIDE);
 | 
			
		||||
 | 
			
		||||
	/* Get pane indicator. */
 | 
			
		||||
	switch (options_get_number(oo, "pane-border-indicators")) {
 | 
			
		||||
	case PANE_BORDER_COLOUR:
 | 
			
		||||
	case PANE_BORDER_BOTH:
 | 
			
		||||
		split = 1;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Left/right borders. */
 | 
			
		||||
	if (pane_status == PANE_STATUS_OFF) {
 | 
			
		||||
		if (screen_redraw_two_panes(wp->window, 0)) {
 | 
			
		||||
		if (screen_redraw_two_panes(wp->window, 0) && split) {
 | 
			
		||||
			if (wp->xoff == 0 && px == wp->sx && py <= wp->sy / 2)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_RIGHT);
 | 
			
		||||
			if (wp->xoff != 0 &&
 | 
			
		||||
			    px == wp->xoff - 1 &&
 | 
			
		||||
			    py > wp->sy / 2)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_LEFT);
 | 
			
		||||
		} else {
 | 
			
		||||
			if ((wp->yoff == 0 || py >= wp->yoff - 1) && py <= ey) {
 | 
			
		||||
				if (wp->xoff != 0 && px == wp->xoff - 1)
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER_LEFT);
 | 
			
		||||
				if (px == ex)
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER_RIGHT);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if ((wp->yoff == 0 || py >= wp->yoff - 1) && py <= ey) {
 | 
			
		||||
			if (wp->xoff != 0 && px == wp->xoff - 1)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_LEFT);
 | 
			
		||||
			if (px == ex)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_RIGHT);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Top/bottom borders. */
 | 
			
		||||
	if (pane_status == PANE_STATUS_OFF) {
 | 
			
		||||
		if (screen_redraw_two_panes(wp->window, 1)) {
 | 
			
		||||
		if (screen_redraw_two_panes(wp->window, 1) && split) {
 | 
			
		||||
			if (wp->yoff == 0 && py == wp->sy && px <= wp->sx / 2)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_BOTTOM);
 | 
			
		||||
			if (wp->yoff != 0 &&
 | 
			
		||||
			    py == wp->yoff - 1 &&
 | 
			
		||||
			    px > wp->sx / 2)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_TOP);
 | 
			
		||||
		} else {
 | 
			
		||||
			if ((wp->xoff == 0 || px >= wp->xoff - 1) && px <= ex) {
 | 
			
		||||
				if (wp->yoff != 0 && py == wp->yoff - 1)
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER_TOP);
 | 
			
		||||
				if (py == ey)
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
					return (SCREEN_REDRAW_BORDER_BOTTOM);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else if (pane_status == PANE_STATUS_TOP) {
 | 
			
		||||
		if ((wp->xoff == 0 || px >= wp->xoff - 1) && px <= ex) {
 | 
			
		||||
			if (wp->yoff != 0 && py == wp->yoff - 1)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_TOP);
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if ((wp->xoff == 0 || px >= wp->xoff - 1) && px <= ex) {
 | 
			
		||||
			if (py == ey)
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER);
 | 
			
		||||
				return (SCREEN_REDRAW_BORDER_BOTTOM);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -189,10 +204,10 @@ screen_redraw_cell_border(struct client *c, u_int px, u_int py, int pane_status)
 | 
			
		||||
		switch (screen_redraw_pane_border(wp, px, py, pane_status)) {
 | 
			
		||||
		case SCREEN_REDRAW_INSIDE:
 | 
			
		||||
			return (0);
 | 
			
		||||
		case SCREEN_REDRAW_BORDER:
 | 
			
		||||
			return (1);
 | 
			
		||||
		case SCREEN_REDRAW_OUTSIDE:
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			return (1);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -346,7 +361,7 @@ screen_redraw_check_is(u_int px, u_int py, int pane_status,
 | 
			
		||||
	enum screen_redraw_border_type	border;
 | 
			
		||||
 | 
			
		||||
	border = screen_redraw_pane_border(wp, px, py, pane_status);
 | 
			
		||||
	if (border == SCREEN_REDRAW_BORDER)
 | 
			
		||||
	if (border != SCREEN_REDRAW_INSIDE && border != SCREEN_REDRAW_OUTSIDE)
 | 
			
		||||
		return (1);
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
@@ -637,11 +652,12 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j)
 | 
			
		||||
	struct options		*oo = w->options;
 | 
			
		||||
	struct tty		*tty = &c->tty;
 | 
			
		||||
	struct format_tree	*ft;
 | 
			
		||||
	struct window_pane	*wp;
 | 
			
		||||
	struct window_pane	*wp, *active = server_client_get_pane(c);
 | 
			
		||||
	struct grid_cell	 gc;
 | 
			
		||||
	const struct grid_cell	*tmp;
 | 
			
		||||
	struct overlay_ranges	 r;
 | 
			
		||||
	u_int			 cell_type, x = ctx->ox + i, y = ctx->oy + j;
 | 
			
		||||
	int			 arrows = 0, border;
 | 
			
		||||
	int			 pane_status = ctx->pane_status, isolates;
 | 
			
		||||
 | 
			
		||||
	if (c->overlay_check != NULL) {
 | 
			
		||||
@@ -689,6 +705,32 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j)
 | 
			
		||||
		tty_cursor(tty, i, j);
 | 
			
		||||
	if (isolates)
 | 
			
		||||
		tty_puts(tty, END_ISOLATE);
 | 
			
		||||
 | 
			
		||||
	switch (options_get_number(oo, "pane-border-indicators")) {
 | 
			
		||||
	case PANE_BORDER_ARROWS:
 | 
			
		||||
	case PANE_BORDER_BOTH:
 | 
			
		||||
		arrows = 1;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (wp != NULL && arrows) {
 | 
			
		||||
		border = screen_redraw_pane_border(active, x, y, pane_status);
 | 
			
		||||
		if (((i == wp->xoff + 1 &&
 | 
			
		||||
		    (cell_type == CELL_LEFTRIGHT ||
 | 
			
		||||
		    (cell_type == CELL_TOPJOIN &&
 | 
			
		||||
		    border == SCREEN_REDRAW_BORDER_BOTTOM) ||
 | 
			
		||||
		    (cell_type == CELL_BOTTOMJOIN &&
 | 
			
		||||
		    border == SCREEN_REDRAW_BORDER_TOP))) ||
 | 
			
		||||
		    (j == wp->yoff + 1 &&
 | 
			
		||||
		    (cell_type == CELL_TOPBOTTOM ||
 | 
			
		||||
		    (cell_type == CELL_LEFTJOIN &&
 | 
			
		||||
		    border == SCREEN_REDRAW_BORDER_RIGHT) ||
 | 
			
		||||
		    (cell_type == CELL_RIGHTJOIN &&
 | 
			
		||||
		    border == SCREEN_REDRAW_BORDER_LEFT)))) &&
 | 
			
		||||
		    screen_redraw_check_is(x, y, pane_status, active))
 | 
			
		||||
			utf8_set(&gc.data, BORDER_MARKERS[border]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tty_cell(tty, &gc, &grid_default_cell, NULL);
 | 
			
		||||
	if (isolates)
 | 
			
		||||
		tty_puts(tty, START_ISOLATE);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								tmux.1
									
									
									
									
									
								
							@@ -4223,6 +4223,12 @@ but set the starting index for pane numbers.
 | 
			
		||||
.It Ic pane-border-format Ar format
 | 
			
		||||
Set the text shown in pane border status lines.
 | 
			
		||||
.Pp
 | 
			
		||||
.It Xo Ic pane-border-indicators
 | 
			
		||||
.Op Ic off | colour | arrows | both
 | 
			
		||||
.Xc
 | 
			
		||||
Indicate active pane by colouring only half of the border in windows with
 | 
			
		||||
exactly two panes, by displaying arrow markers, by drawing both or neither.
 | 
			
		||||
.Pp
 | 
			
		||||
.It Ic pane-border-lines Ar type
 | 
			
		||||
Set the type of characters used for drawing pane borders.
 | 
			
		||||
.Ar type
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user