1
0
mirror of https://github.com/tmux/tmux.git synced 2025-04-26 23:18:50 +00:00

Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam 2019-07-15 21:02:26 +01:00
commit a786a59176
4 changed files with 92 additions and 57 deletions

View File

@ -165,7 +165,7 @@ layout_parse(struct window *w, const char *layout)
layout_assign(&wp, lc); layout_assign(&wp, lc);
/* Update pane offsets and sizes. */ /* Update pane offsets and sizes. */
layout_fix_offsets(lc); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
recalculate_sizes(); recalculate_sizes();

View File

@ -158,7 +158,7 @@ layout_set_even(struct window *w, enum layout_type type)
layout_spread_cell(w, lc); layout_spread_cell(w, lc);
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(lc); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);
@ -257,7 +257,7 @@ layout_set_main_h(struct window *w)
} }
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(lc); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);
@ -344,7 +344,7 @@ layout_set_main_v(struct window *w)
} }
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(lc); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);
@ -453,7 +453,7 @@ layout_set_tiled(struct window *w)
} }
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(lc); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);

129
layout.c
View File

@ -39,7 +39,6 @@ static int layout_resize_pane_grow(struct window *, struct layout_cell *,
enum layout_type, int, int); enum layout_type, int, int);
static int layout_resize_pane_shrink(struct window *, struct layout_cell *, static int layout_resize_pane_shrink(struct window *, struct layout_cell *,
enum layout_type, int); enum layout_type, int);
static int layout_need_status(struct layout_cell *, int);
static u_int layout_new_pane_size(struct window *, u_int, static u_int layout_new_pane_size(struct window *, u_int,
struct layout_cell *, enum layout_type, u_int, u_int, struct layout_cell *, enum layout_type, u_int, u_int,
u_int); u_int);
@ -199,9 +198,9 @@ layout_make_node(struct layout_cell *lc, enum layout_type type)
lc->wp = NULL; lc->wp = NULL;
} }
/* Fix cell offsets based on their sizes. */ /* Fix cell offsets for a child cell. */
void static void
layout_fix_offsets(struct layout_cell *lc) layout_fix_offsets1(struct layout_cell *lc)
{ {
struct layout_cell *lcchild; struct layout_cell *lcchild;
u_int xoff, yoff; u_int xoff, yoff;
@ -212,7 +211,7 @@ layout_fix_offsets(struct layout_cell *lc)
lcchild->xoff = xoff; lcchild->xoff = xoff;
lcchild->yoff = lc->yoff; lcchild->yoff = lc->yoff;
if (lcchild->type != LAYOUT_WINDOWPANE) if (lcchild->type != LAYOUT_WINDOWPANE)
layout_fix_offsets(lcchild); layout_fix_offsets1(lcchild);
xoff += lcchild->sx + 1; xoff += lcchild->sx + 1;
} }
} else { } else {
@ -221,61 +220,92 @@ layout_fix_offsets(struct layout_cell *lc)
lcchild->xoff = lc->xoff; lcchild->xoff = lc->xoff;
lcchild->yoff = yoff; lcchild->yoff = yoff;
if (lcchild->type != LAYOUT_WINDOWPANE) if (lcchild->type != LAYOUT_WINDOWPANE)
layout_fix_offsets(lcchild); layout_fix_offsets1(lcchild);
yoff += lcchild->sy + 1; yoff += lcchild->sy + 1;
} }
} }
} }
/* /* Update cell offsets based on their sizes. */
* Returns 1 if we need to reserve space for the pane status line. This is the void
* case for the most upper panes only. layout_fix_offsets(struct window *w)
*/ {
struct layout_cell *lc = w->layout_root;
lc->xoff = 0;
lc->yoff = 0;
layout_fix_offsets1(lc);
}
/* Is this a top cell? */
static int static int
layout_need_status(struct layout_cell *lc, int status) layout_cell_is_top(struct window *w, struct layout_cell *lc)
{ {
struct layout_cell *next; struct layout_cell *next;
if (lc->parent != NULL) { while (lc != w->layout_root) {
if (lc->parent->type == LAYOUT_LEFTRIGHT) next = lc->parent;
return (layout_need_status(lc->parent, status)); if (next->type == LAYOUT_TOPBOTTOM &&
lc != TAILQ_FIRST(&next->cells))
if (status == PANE_STATUS_TOP)
next = TAILQ_FIRST(&lc->parent->cells);
else
next = TAILQ_LAST(&lc->parent->cells,layout_cells);
if (lc == next)
return (layout_need_status(lc->parent, status));
return (0); return (0);
lc = next;
} }
return (1); return (1);
} }
/* Is this a bottom cell? */
static int
layout_cell_is_bottom(struct window *w, struct layout_cell *lc)
{
struct layout_cell *next;
while (lc != w->layout_root) {
next = lc->parent;
if (next->type == LAYOUT_TOPBOTTOM &&
lc != TAILQ_LAST(&next->cells, layout_cells))
return (0);
lc = next;
}
return (1);
}
/*
* Returns 1 if we need to add an extra line for the pane status line. This is
* the case for the most upper or lower panes only.
*/
static int
layout_add_border(struct window *w, struct layout_cell *lc, int status)
{
if (status == PANE_STATUS_TOP)
return (layout_cell_is_top(w, lc));
if (status == PANE_STATUS_BOTTOM)
return (layout_cell_is_bottom(w, lc));
return (0);
}
/* Update pane offsets and sizes based on their cells. */ /* Update pane offsets and sizes based on their cells. */
void void
layout_fix_panes(struct window *w) layout_fix_panes(struct window *w)
{ {
struct window_pane *wp; struct window_pane *wp;
struct layout_cell *lc; struct layout_cell *lc;
int shift, status; int status;
status = options_get_number(w->options, "pane-border-status"); status = options_get_number(w->options, "pane-border-status");
TAILQ_FOREACH(wp, &w->panes, entry) { TAILQ_FOREACH(wp, &w->panes, entry) {
if ((lc = wp->layout_cell) == NULL) if ((lc = wp->layout_cell) == NULL)
continue; continue;
if (status != PANE_STATUS_OFF)
shift = layout_need_status(lc, status);
else
shift = 0;
wp->xoff = lc->xoff; wp->xoff = lc->xoff;
wp->yoff = lc->yoff; wp->yoff = lc->yoff;
if (shift && status == PANE_STATUS_TOP) if (layout_add_border(w, lc, status)) {
wp->yoff += 1; if (status == PANE_STATUS_TOP)
wp->yoff++;
window_pane_resize(wp, lc->sx, lc->sy - shift); window_pane_resize(wp, lc->sx, lc->sy - 1);
} else
window_pane_resize(wp, lc->sx, lc->sy);
} }
} }
@ -312,13 +342,15 @@ layout_resize_check(struct window *w, struct layout_cell *lc,
status = options_get_number(w->options, "pane-border-status"); status = options_get_number(w->options, "pane-border-status");
if (lc->type == LAYOUT_WINDOWPANE) { if (lc->type == LAYOUT_WINDOWPANE) {
/* Space available in this cell only. */ /* Space available in this cell only. */
minimum = PANE_MINIMUM; if (type == LAYOUT_LEFTRIGHT) {
if (type == LAYOUT_LEFTRIGHT)
available = lc->sx; available = lc->sx;
else { minimum = PANE_MINIMUM;
} else {
available = lc->sy; available = lc->sy;
if (status != PANE_STATUS_OFF) if (layout_add_border(w, lc, status))
minimum += layout_need_status(lc, status); minimum = PANE_MINIMUM + 1;
else
minimum = PANE_MINIMUM;
} }
if (available > minimum) if (available > minimum)
available -= minimum; available -= minimum;
@ -507,7 +539,7 @@ layout_resize(struct window *w, u_int sx, u_int sy)
layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, ychange); layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, ychange);
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(lc); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
} }
@ -567,7 +599,7 @@ layout_resize_layout(struct window *w, struct layout_cell *lc,
} }
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(w->layout_root); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
notify_window("window-layout-changed", w); notify_window("window-layout-changed", w);
} }
@ -861,9 +893,10 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size,
return (NULL); return (NULL);
break; break;
case LAYOUT_TOPBOTTOM: case LAYOUT_TOPBOTTOM:
if (layout_add_border(wp->window, lc, status))
minimum = PANE_MINIMUM * 2 + 2;
else
minimum = PANE_MINIMUM * 2 + 1; minimum = PANE_MINIMUM * 2 + 1;
if (status != PANE_STATUS_OFF)
minimum += layout_need_status(lc, status);
if (sy < minimum) if (sy < minimum)
return (NULL); return (NULL);
break; break;
@ -988,7 +1021,7 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size,
if (full_size) { if (full_size) {
if (!resize_first) if (!resize_first)
layout_resize_child_cells(wp->window, lc); layout_resize_child_cells(wp->window, lc);
layout_fix_offsets(wp->window->layout_root); layout_fix_offsets(wp->window);
} else } else
layout_make_leaf(lc, wp); layout_make_leaf(lc, wp);
@ -1006,7 +1039,7 @@ layout_close_pane(struct window_pane *wp)
/* Fix pane offsets and sizes. */ /* Fix pane offsets and sizes. */
if (w->layout_root != NULL) { if (w->layout_root != NULL) {
layout_fix_offsets(w->layout_root); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
} }
notify_window("window-layout-changed", w); notify_window("window-layout-changed", w);
@ -1029,9 +1062,10 @@ layout_spread_cell(struct window *w, struct layout_cell *parent)
if (parent->type == LAYOUT_LEFTRIGHT) if (parent->type == LAYOUT_LEFTRIGHT)
size = parent->sx; size = parent->sx;
else if (parent->type == LAYOUT_TOPBOTTOM) { else if (parent->type == LAYOUT_TOPBOTTOM) {
if (layout_add_border(w, parent, status))
size = parent->sy - 1;
else
size = parent->sy; size = parent->sy;
if (status != PANE_STATUS_OFF)
size -= layout_need_status(parent, status);
} else } else
return (0); return (0);
if (size < number - 1) if (size < number - 1)
@ -1049,9 +1083,10 @@ layout_spread_cell(struct window *w, struct layout_cell *parent)
change = each - (int)lc->sx; change = each - (int)lc->sx;
layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, change); layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, change);
} else if (parent->type == LAYOUT_TOPBOTTOM) { } else if (parent->type == LAYOUT_TOPBOTTOM) {
if (layout_add_border(w, lc, status))
this = each + 1;
else
this = each; this = each;
if (status != PANE_STATUS_OFF)
this += layout_need_status(lc, status);
change = this - (int)lc->sy; change = this - (int)lc->sy;
layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, change); layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, change);
} }
@ -1073,7 +1108,7 @@ layout_spread_out(struct window_pane *wp)
do { do {
if (layout_spread_cell(w, parent)) { if (layout_spread_cell(w, parent)) {
layout_fix_offsets(parent); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w);
break; break;
} }

2
tmux.h
View File

@ -2440,7 +2440,7 @@ void layout_set_size(struct layout_cell *, u_int, u_int, u_int,
u_int); u_int);
void layout_make_leaf(struct layout_cell *, struct window_pane *); void layout_make_leaf(struct layout_cell *, struct window_pane *);
void layout_make_node(struct layout_cell *, enum layout_type); void layout_make_node(struct layout_cell *, enum layout_type);
void layout_fix_offsets(struct layout_cell *); void layout_fix_offsets(struct window *);
void layout_fix_panes(struct window *); void layout_fix_panes(struct window *);
void layout_resize_adjust(struct window *, struct layout_cell *, void layout_resize_adjust(struct window *, struct layout_cell *,
enum layout_type, int); enum layout_type, int);