From d83f356218fc9144735667e39c9553bcf905d10b Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 26 Jun 2019 13:03:47 +0000 Subject: Add #define for the pane status line option position numbers. --- layout.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'layout.c') diff --git a/layout.c b/layout.c index 86d307ef..6e78b439 100644 --- a/layout.c +++ b/layout.c @@ -232,20 +232,20 @@ layout_fix_offsets(struct layout_cell *lc) * case for the most upper panes only. */ static int -layout_need_status(struct layout_cell *lc, int at_top) +layout_need_status(struct layout_cell *lc, int status) { - struct layout_cell *first_lc; + struct layout_cell *next; if (lc->parent != NULL) { if (lc->parent->type == LAYOUT_LEFTRIGHT) - return (layout_need_status(lc->parent, at_top)); + return (layout_need_status(lc->parent, status)); - if (at_top) - first_lc = TAILQ_FIRST(&lc->parent->cells); + if (status == PANE_STATUS_TOP) + next = TAILQ_FIRST(&lc->parent->cells); else - first_lc = TAILQ_LAST(&lc->parent->cells,layout_cells); - if (lc == first_lc) - return (layout_need_status(lc->parent, at_top)); + next = TAILQ_LAST(&lc->parent->cells,layout_cells); + if (lc == next) + return (layout_need_status(lc->parent, status)); return (0); } return (1); @@ -264,8 +264,8 @@ layout_fix_panes(struct window *w) if ((lc = wp->layout_cell) == NULL) continue; - if (status != 0) - shift = layout_need_status(lc, status == 1); + if (status != PANE_STATUS_OFF) + shift = layout_need_status(lc, status); else shift = 0; @@ -317,8 +317,8 @@ layout_resize_check(struct window *w, struct layout_cell *lc, available = lc->sx; else { available = lc->sy; - if (status != 0) - minimum += layout_need_status(lc, status == 1); + if (status != PANE_STATUS_OFF) + minimum += layout_need_status(lc, status); } if (available > minimum) available -= minimum; @@ -862,8 +862,8 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size, break; case LAYOUT_TOPBOTTOM: minimum = PANE_MINIMUM * 2 + 1; - if (status != 0) - minimum += layout_need_status(lc, status == 1); + if (status != PANE_STATUS_OFF) + minimum += layout_need_status(lc, status); if (sy < minimum) return (NULL); break; @@ -1030,8 +1030,8 @@ layout_spread_cell(struct window *w, struct layout_cell *parent) size = parent->sx; else if (parent->type == LAYOUT_TOPBOTTOM) { size = parent->sy; - if (status != 0) - size -= layout_need_status(parent, status == 1); + if (status != PANE_STATUS_OFF) + size -= layout_need_status(parent, status); } else return (0); if (size < number - 1) @@ -1050,8 +1050,8 @@ layout_spread_cell(struct window *w, struct layout_cell *parent) layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, change); } else if (parent->type == LAYOUT_TOPBOTTOM) { this = each; - if (status != 0) - this += layout_need_status(lc, status == 1); + if (status != PANE_STATUS_OFF) + this += layout_need_status(lc, status); change = this - (int)lc->sy; layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, change); } -- cgit From 3a6d90adadfcd4aa6b513df7f8ae5c4dcc05a6dc Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 26 Jun 2019 18:44:22 +0000 Subject: Fix a typo in window_pane_find_down (w not wp) and a missing PANE_STATUS_TOP. --- layout.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'layout.c') diff --git a/layout.c b/layout.c index 6e78b439..e84da936 100644 --- a/layout.c +++ b/layout.c @@ -272,7 +272,7 @@ layout_fix_panes(struct window *w) wp->xoff = lc->xoff; wp->yoff = lc->yoff; - if (shift && status == 1) + if (shift && status == PANE_STATUS_TOP) wp->yoff += 1; window_pane_resize(wp, lc->sx, lc->sy - shift); @@ -1021,7 +1021,7 @@ layout_spread_cell(struct window *w, struct layout_cell *parent) number = 0; TAILQ_FOREACH (lc, &parent->cells, entry) - number++; + number++; if (number <= 1) return (0); status = options_get_number(w->options, "pane-border-status"); -- cgit From 6ceeceab7adfb7b6a779df52f811f010aae0721c Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 15 Jul 2019 18:25:07 +0000 Subject: Make layout_fix_offsets take a window like layout_fix_panes. --- layout.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'layout.c') diff --git a/layout.c b/layout.c index e84da936..f6bba34f 100644 --- a/layout.c +++ b/layout.c @@ -200,8 +200,8 @@ layout_make_node(struct layout_cell *lc, enum layout_type type) } /* Fix cell offsets based on their sizes. */ -void -layout_fix_offsets(struct layout_cell *lc) +static void +layout_fix_offsets1(struct layout_cell *lc) { struct layout_cell *lcchild; u_int xoff, yoff; @@ -212,7 +212,7 @@ layout_fix_offsets(struct layout_cell *lc) lcchild->xoff = xoff; lcchild->yoff = lc->yoff; if (lcchild->type != LAYOUT_WINDOWPANE) - layout_fix_offsets(lcchild); + layout_fix_offsets1(lcchild); xoff += lcchild->sx + 1; } } else { @@ -221,12 +221,24 @@ layout_fix_offsets(struct layout_cell *lc) lcchild->xoff = lc->xoff; lcchild->yoff = yoff; if (lcchild->type != LAYOUT_WINDOWPANE) - layout_fix_offsets(lcchild); + layout_fix_offsets1(lcchild); yoff += lcchild->sy + 1; } } } +/* Update cell offsets based on their sizes. */ +void +layout_fix_offsets(struct window *w) +{ + struct layout_cell *lc = w->layout_root; + + lc->xoff = 0; + lc->yoff = 0; + + layout_fix_offsets1(lc); +} + /* * Returns 1 if we need to reserve space for the pane status line. This is the * case for the most upper panes only. @@ -507,7 +519,7 @@ layout_resize(struct window *w, u_int sx, u_int sy) layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, ychange); /* Fix cell offsets. */ - layout_fix_offsets(lc); + layout_fix_offsets(w); layout_fix_panes(w); } @@ -567,7 +579,7 @@ layout_resize_layout(struct window *w, struct layout_cell *lc, } /* Fix cell offsets. */ - layout_fix_offsets(w->layout_root); + layout_fix_offsets(w); layout_fix_panes(w); notify_window("window-layout-changed", w); } @@ -988,7 +1000,7 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size, if (full_size) { if (!resize_first) layout_resize_child_cells(wp->window, lc); - layout_fix_offsets(wp->window->layout_root); + layout_fix_offsets(wp->window); } else layout_make_leaf(lc, wp); @@ -1006,7 +1018,7 @@ layout_close_pane(struct window_pane *wp) /* Fix pane offsets and sizes. */ if (w->layout_root != NULL) { - layout_fix_offsets(w->layout_root); + layout_fix_offsets(w); layout_fix_panes(w); } notify_window("window-layout-changed", w); @@ -1073,7 +1085,7 @@ layout_spread_out(struct window_pane *wp) do { if (layout_spread_cell(w, parent)) { - layout_fix_offsets(parent); + layout_fix_offsets(w); layout_fix_panes(w); break; } -- cgit From eac055bfaf1b21b71d5fc79bc29a2810aa20085f Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 15 Jul 2019 18:43:32 +0000 Subject: Simplify code to work out if an extra line is needed in the cell. --- layout.c | 105 ++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 64 insertions(+), 41 deletions(-) (limited to 'layout.c') diff --git a/layout.c b/layout.c index f6bba34f..37214d02 100644 --- a/layout.c +++ b/layout.c @@ -39,7 +39,6 @@ static int layout_resize_pane_grow(struct window *, struct layout_cell *, enum layout_type, int, int); static int layout_resize_pane_shrink(struct window *, struct layout_cell *, enum layout_type, int); -static int layout_need_status(struct layout_cell *, int); static u_int layout_new_pane_size(struct window *, u_int, struct layout_cell *, enum layout_type, u_int, u_int, u_int); @@ -199,7 +198,7 @@ layout_make_node(struct layout_cell *lc, enum layout_type type) lc->wp = NULL; } -/* Fix cell offsets based on their sizes. */ +/* Fix cell offsets for a child cell. */ static void layout_fix_offsets1(struct layout_cell *lc) { @@ -239,55 +238,74 @@ layout_fix_offsets(struct window *w) layout_fix_offsets1(lc); } -/* - * Returns 1 if we need to reserve space for the pane status line. This is the - * case for the most upper panes only. - */ +/* Is this a top cell? */ 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; - if (lc->parent != NULL) { - if (lc->parent->type == LAYOUT_LEFTRIGHT) - return (layout_need_status(lc->parent, status)); + while (lc != w->layout_root) { + next = lc->parent; + if (next->type == LAYOUT_TOPBOTTOM && + lc != TAILQ_FIRST(&next->cells)) + return (0); + lc = next; + } + return (1); +} - 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); +/* 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. */ void layout_fix_panes(struct window *w) { struct window_pane *wp; struct layout_cell *lc; - int shift, status; + int status; status = options_get_number(w->options, "pane-border-status"); TAILQ_FOREACH(wp, &w->panes, entry) { if ((lc = wp->layout_cell) == NULL) continue; - if (status != PANE_STATUS_OFF) - shift = layout_need_status(lc, status); - else - shift = 0; - wp->xoff = lc->xoff; wp->yoff = lc->yoff; - if (shift && status == PANE_STATUS_TOP) - wp->yoff += 1; - - window_pane_resize(wp, lc->sx, lc->sy - shift); + if (layout_add_border(w, lc, status)) { + if (status == PANE_STATUS_TOP) + wp->yoff++; + window_pane_resize(wp, lc->sx, lc->sy - 1); + } else + window_pane_resize(wp, lc->sx, lc->sy); } } @@ -324,13 +342,15 @@ layout_resize_check(struct window *w, struct layout_cell *lc, status = options_get_number(w->options, "pane-border-status"); if (lc->type == LAYOUT_WINDOWPANE) { /* Space available in this cell only. */ - minimum = PANE_MINIMUM; - if (type == LAYOUT_LEFTRIGHT) + if (type == LAYOUT_LEFTRIGHT) { available = lc->sx; - else { + minimum = PANE_MINIMUM; + } else { available = lc->sy; - if (status != PANE_STATUS_OFF) - minimum += layout_need_status(lc, status); + if (layout_add_border(w, lc, status)) + minimum = PANE_MINIMUM + 1; + else + minimum = PANE_MINIMUM; } if (available > minimum) available -= minimum; @@ -873,9 +893,10 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size, return (NULL); break; case LAYOUT_TOPBOTTOM: - minimum = PANE_MINIMUM * 2 + 1; - if (status != PANE_STATUS_OFF) - minimum += layout_need_status(lc, status); + if (layout_add_border(wp->window, lc, status)) + minimum = PANE_MINIMUM * 2 + 2; + else + minimum = PANE_MINIMUM * 2 + 1; if (sy < minimum) return (NULL); break; @@ -1041,9 +1062,10 @@ layout_spread_cell(struct window *w, struct layout_cell *parent) if (parent->type == LAYOUT_LEFTRIGHT) size = parent->sx; else if (parent->type == LAYOUT_TOPBOTTOM) { - size = parent->sy; - if (status != PANE_STATUS_OFF) - size -= layout_need_status(parent, status); + if (layout_add_border(w, parent, status)) + size = parent->sy - 1; + else + size = parent->sy; } else return (0); if (size < number - 1) @@ -1061,9 +1083,10 @@ layout_spread_cell(struct window *w, struct layout_cell *parent) change = each - (int)lc->sx; layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, change); } else if (parent->type == LAYOUT_TOPBOTTOM) { - this = each; - if (status != PANE_STATUS_OFF) - this += layout_need_status(lc, status); + if (layout_add_border(w, lc, status)) + this = each + 1; + else + this = each; change = this - (int)lc->sy; layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, change); } -- cgit