mirror of
https://github.com/tmux/tmux.git
synced 2024-11-16 09:28:51 +00:00
When only two panes in a window, only draw half the separating line as active.
This commit is contained in:
parent
3d974b7267
commit
919bde7cb1
@ -24,7 +24,11 @@
|
|||||||
|
|
||||||
int screen_redraw_cell_border1(struct window_pane *, u_int, u_int);
|
int screen_redraw_cell_border1(struct window_pane *, u_int, u_int);
|
||||||
int screen_redraw_cell_border(struct client *, u_int, u_int);
|
int screen_redraw_cell_border(struct client *, u_int, u_int);
|
||||||
int screen_redraw_check_cell(struct client *, u_int, u_int);
|
int screen_redraw_check_cell(struct client *, u_int, u_int,
|
||||||
|
struct window_pane **);
|
||||||
|
int screen_redraw_check_active(u_int, u_int, int, struct window *,
|
||||||
|
struct window_pane *);
|
||||||
|
|
||||||
void screen_redraw_draw_number(struct client *, struct window_pane *);
|
void screen_redraw_draw_number(struct client *, struct window_pane *);
|
||||||
|
|
||||||
#define CELL_INSIDE 0
|
#define CELL_INSIDE 0
|
||||||
@ -93,7 +97,8 @@ screen_redraw_cell_border(struct client *c, u_int px, u_int py)
|
|||||||
|
|
||||||
/* Check if cell inside a pane. */
|
/* Check if cell inside a pane. */
|
||||||
int
|
int
|
||||||
screen_redraw_check_cell(struct client *c, u_int px, u_int py)
|
screen_redraw_check_cell(struct client *c, u_int px, u_int py,
|
||||||
|
struct window_pane **wpp)
|
||||||
{
|
{
|
||||||
struct window *w = c->session->curw->window;
|
struct window *w = c->session->curw->window;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
@ -105,6 +110,7 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py)
|
|||||||
TAILQ_FOREACH(wp, &w->panes, entry) {
|
TAILQ_FOREACH(wp, &w->panes, entry) {
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_visible(wp))
|
||||||
continue;
|
continue;
|
||||||
|
*wpp = wp;
|
||||||
|
|
||||||
/* If outside the pane and its border, skip it. */
|
/* If outside the pane and its border, skip it. */
|
||||||
if ((wp->xoff != 0 && px < wp->xoff - 1) ||
|
if ((wp->xoff != 0 && px < wp->xoff - 1) ||
|
||||||
@ -162,9 +168,52 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*wpp = NULL;
|
||||||
return (CELL_OUTSIDE);
|
return (CELL_OUTSIDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check active pane indicator. */
|
||||||
|
int
|
||||||
|
screen_redraw_check_active(u_int px, u_int py, int type, struct window *w,
|
||||||
|
struct window_pane *wp)
|
||||||
|
{
|
||||||
|
/* Is this off the active pane border? */
|
||||||
|
if (screen_redraw_cell_border1(w->active, px, py) != 1)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* If there are more than two panes, that's enough. */
|
||||||
|
if (window_count_panes(w) != 2)
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
/* Else if the cell is not a border cell, forget it. */
|
||||||
|
if (wp == NULL || (type == CELL_OUTSIDE || type == CELL_INSIDE))
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
/* Check if the pane covers the whole width. */
|
||||||
|
if (wp->xoff == 0 && wp->sx == w->sx) {
|
||||||
|
/* This can either be the top pane or the bottom pane. */
|
||||||
|
if (wp->yoff == 0) { /* top pane */
|
||||||
|
if (wp == w->active)
|
||||||
|
return (px <= wp->sx / 2);
|
||||||
|
return (px > wp->sx / 2);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the pane covers the whole height. */
|
||||||
|
if (wp->yoff == 0 && wp->sy == w->sy) {
|
||||||
|
/* This can either be the left pane or the right pane. */
|
||||||
|
if (wp->xoff == 0) { /* left pane */
|
||||||
|
if (wp == w->active)
|
||||||
|
return (py <= wp->sy / 2);
|
||||||
|
return (py > wp->sy / 2);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (type);
|
||||||
|
}
|
||||||
|
|
||||||
/* Redraw entire screen. */
|
/* Redraw entire screen. */
|
||||||
void
|
void
|
||||||
screen_redraw_screen(struct client *c, int status_only, int borders_only)
|
screen_redraw_screen(struct client *c, int status_only, int borders_only)
|
||||||
@ -223,10 +272,10 @@ screen_redraw_screen(struct client *c, int status_only, int borders_only)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (i = 0; i < tty->sx; i++) {
|
for (i = 0; i < tty->sx; i++) {
|
||||||
type = screen_redraw_check_cell(c, i, j);
|
type = screen_redraw_check_cell(c, i, j, &wp);
|
||||||
if (type == CELL_INSIDE)
|
if (type == CELL_INSIDE)
|
||||||
continue;
|
continue;
|
||||||
if (screen_redraw_cell_border1(w->active, i, j) == 1)
|
if (screen_redraw_check_active(i, j, type, w, wp))
|
||||||
tty_attributes(tty, &active_gc);
|
tty_attributes(tty, &active_gc);
|
||||||
else
|
else
|
||||||
tty_attributes(tty, &other_gc);
|
tty_attributes(tty, &other_gc);
|
||||||
|
Loading…
Reference in New Issue
Block a user