diff --git a/sway/tree/arrange.c b/sway/tree/arrange.c index edb05f86e..d50be25d3 100644 --- a/sway/tree/arrange.c +++ b/sway/tree/arrange.c @@ -97,15 +97,14 @@ static void apply_tabbed_layout(list_t *children, struct wlr_box *parent) { if (!children->length) { return; } - size_t parent_offset = container_titlebar_height(); - size_t parent_height = parent->height - parent_offset; for (int i = 0; i < children->length; ++i) { struct sway_container *child = children->items[i]; + size_t parent_offset = child->view ? 0 : container_titlebar_height(); container_remove_gaps(child); child->x = parent->x; child->y = parent->y + parent_offset; child->width = parent->width; - child->height = parent_height; + child->height = parent->height - parent_offset; container_add_gaps(child); } } @@ -114,15 +113,15 @@ static void apply_stacked_layout(list_t *children, struct wlr_box *parent) { if (!children->length) { return; } - size_t parent_offset = container_titlebar_height() * children->length; - size_t parent_height = parent->height - parent_offset; for (int i = 0; i < children->length; ++i) { struct sway_container *child = children->items[i]; + size_t parent_offset = child->view ? 0 : + container_titlebar_height() * children->length; container_remove_gaps(child); child->x = parent->x; child->y = parent->y + parent_offset; child->width = parent->width; - child->height = parent_height; + child->height = parent->height - parent_offset; container_add_gaps(child); } } diff --git a/sway/tree/view.c b/sway/tree/view.c index f63a35b5c..f9dcb11ae 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -219,14 +219,17 @@ void view_autoconfigure(struct sway_view *view) { x = y = width = height = 0; double y_offset = 0; - // In a tabbed or stacked container, the swayc's y is the bottom of the - // title area. We have to disable any top border because the title bar is - // rendered by the parent. + // In a tabbed or stacked container, the container's y is the top of the + // title area. We have to offset the surface y by the height of the title, + // bar, and disable any top border because we'll always have the title bar. enum sway_container_layout layout = container_parent_layout(con); - if (layout == L_TABBED || layout == L_STACKED) { - view->border_top = false; - } else { + if (layout == L_TABBED) { y_offset = container_titlebar_height(); + view->border_top = false; + } else if (layout == L_STACKED) { + list_t *siblings = container_get_siblings(con); + y_offset = container_titlebar_height() * siblings->length; + view->border_top = false; } enum sway_container_border border = view->border; @@ -237,17 +240,17 @@ void view_autoconfigure(struct sway_view *view) { switch (border) { case B_NONE: x = con->x; - y = con->y; + y = con->y + y_offset; width = con->width; - height = con->height; + height = con->height - y_offset; break; case B_PIXEL: x = con->x + view->border_thickness * view->border_left; - y = con->y + view->border_thickness * view->border_top; + y = con->y + view->border_thickness * view->border_top + y_offset; width = con->width - view->border_thickness * view->border_left - view->border_thickness * view->border_right; - height = con->height + height = con->height - y_offset - view->border_thickness * view->border_top - view->border_thickness * view->border_bottom; break; @@ -257,9 +260,15 @@ void view_autoconfigure(struct sway_view *view) { width = con->width - view->border_thickness * view->border_left - view->border_thickness * view->border_right; - y = con->y + y_offset; - height = con->height - y_offset - - view->border_thickness * view->border_bottom; + if (y_offset) { + y = con->y + y_offset; + height = con->height - y_offset + - view->border_thickness * view->border_bottom; + } else { + y = con->y + container_titlebar_height(); + height = con->height - container_titlebar_height() + - view->border_thickness * view->border_bottom; + } break; }