version 1.46, 2019/07/15 18:25:07 |
version 1.47, 2019/07/15 18:43:32 |
|
|
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); |
|
|
lc->wp = NULL; |
lc->wp = NULL; |
} |
} |
|
|
/* Fix cell offsets based on their sizes. */ |
/* Fix cell offsets for a child cell. */ |
static void |
static void |
layout_fix_offsets1(struct layout_cell *lc) |
layout_fix_offsets1(struct layout_cell *lc) |
{ |
{ |
|
|
layout_fix_offsets1(lc); |
layout_fix_offsets1(lc); |
} |
} |
|
|
/* |
/* Is this a top cell? */ |
* Returns 1 if we need to reserve space for the pane status line. This is the |
|
* case for the most upper panes only. |
|
*/ |
|
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)) |
|
return (0); |
|
lc = next; |
|
} |
|
return (1); |
|
} |
|
|
if (status == PANE_STATUS_TOP) |
/* Is this a bottom cell? */ |
next = TAILQ_FIRST(&lc->parent->cells); |
static int |
else |
layout_cell_is_bottom(struct window *w, struct layout_cell *lc) |
next = TAILQ_LAST(&lc->parent->cells,layout_cells); |
{ |
if (lc == next) |
struct layout_cell *next; |
return (layout_need_status(lc->parent, status)); |
|
return (0); |
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); |
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); |
} |
} |
} |
} |
|
|
|
|
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; |
|
|
return (NULL); |
return (NULL); |
break; |
break; |
case LAYOUT_TOPBOTTOM: |
case LAYOUT_TOPBOTTOM: |
minimum = PANE_MINIMUM * 2 + 1; |
if (layout_add_border(wp->window, lc, status)) |
if (status != PANE_STATUS_OFF) |
minimum = PANE_MINIMUM * 2 + 2; |
minimum += layout_need_status(lc, status); |
else |
|
minimum = PANE_MINIMUM * 2 + 1; |
if (sy < minimum) |
if (sy < minimum) |
return (NULL); |
return (NULL); |
break; |
break; |
|
|
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) { |
size = parent->sy; |
if (layout_add_border(w, parent, status)) |
if (status != PANE_STATUS_OFF) |
size = parent->sy - 1; |
size -= layout_need_status(parent, status); |
else |
|
size = parent->sy; |
} else |
} else |
return (0); |
return (0); |
if (size < number - 1) |
if (size < number - 1) |
|
|
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) { |
this = each; |
if (layout_add_border(w, lc, status)) |
if (status != PANE_STATUS_OFF) |
this = each + 1; |
this += layout_need_status(lc, status); |
else |
|
this = each; |
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); |
} |
} |