@ -52,23 +52,39 @@ static void apply_horiz_layout(list_t *children, struct wlr_box *parent) {
child - > width_fraction / = total_width_fraction ;
child - > width_fraction / = total_width_fraction ;
}
}
// Calculate gap size
double inner_gap = 0 ;
struct sway_container * child = children - > items [ 0 ] ;
struct sway_workspace * ws = child - > workspace ;
if ( ws ) {
inner_gap = ws - > gaps_inner ;
}
// Descendants of tabbed/stacked containers don't have gaps
struct sway_container * temp = child ;
while ( temp ) {
enum sway_container_layout layout = container_parent_layout ( temp ) ;
if ( layout = = L_TABBED | | layout = = L_STACKED ) {
inner_gap = 0 ;
}
temp = temp - > parent ;
}
double child_total_width = parent - > width - inner_gap * ( children - > length - 1 ) ;
// Resize windows
// Resize windows
sway_log ( SWAY_DEBUG , " Arranging %p horizontally " , parent ) ;
sway_log ( SWAY_DEBUG , " Arranging %p horizontally " , parent ) ;
double child_x = parent - > x ;
double child_x = parent - > x ;
for ( int i = 0 ; i < children - > length ; + + i ) {
for ( int i = 0 ; i < children - > length ; + + i ) {
struct sway_container * child = children - > items [ i ] ;
struct sway_container * child = children - > items [ i ] ;
container_remove_gaps ( child ) ;
child - > x = child_x ;
child - > x = child_x ;
child - > y = parent - > y ;
child - > y = parent - > y ;
child - > width = floor ( child - > width_fraction * parent - > width ) ;
child - > width = floor ( child - > width_fraction * child_total_ width) ;
child - > height = parent - > height ;
child - > height = parent - > height ;
child_x + = child - > width ;
child_x + = child - > width + inner_gap ;
// Make last child use remaining width of parent
// Make last child use remaining width of parent
if ( i = = children - > length - 1 ) {
if ( i = = children - > length - 1 ) {
child - > width = parent - > x + parent - > width - child - > x ;
child - > width = parent - > x + parent - > width - child - > x ;
}
}
container_add_gaps ( child ) ;
}
}
}
}
@ -111,23 +127,39 @@ static void apply_vert_layout(list_t *children, struct wlr_box *parent) {
child - > height_fraction / = total_height_fraction ;
child - > height_fraction / = total_height_fraction ;
}
}
// Resize
// Calculate gap size
double inner_gap = 0 ;
struct sway_container * child = children - > items [ 0 ] ;
struct sway_workspace * ws = child - > workspace ;
if ( ws ) {
inner_gap = ws - > gaps_inner ;
}
// Descendants of tabbed/stacked containers don't have gaps
struct sway_container * temp = child ;
while ( temp ) {
enum sway_container_layout layout = container_parent_layout ( temp ) ;
if ( layout = = L_TABBED | | layout = = L_STACKED ) {
inner_gap = 0 ;
}
temp = temp - > parent ;
}
double child_total_height = parent - > height - inner_gap * ( children - > length - 1 ) ;
// Resize windows
sway_log ( SWAY_DEBUG , " Arranging %p vertically " , parent ) ;
sway_log ( SWAY_DEBUG , " Arranging %p vertically " , parent ) ;
double child_y = parent - > y ;
double child_y = parent - > y ;
for ( int i = 0 ; i < children - > length ; + + i ) {
for ( int i = 0 ; i < children - > length ; + + i ) {
struct sway_container * child = children - > items [ i ] ;
struct sway_container * child = children - > items [ i ] ;
container_remove_gaps ( child ) ;
child - > x = parent - > x ;
child - > x = parent - > x ;
child - > y = child_y ;
child - > y = child_y ;
child - > width = parent - > width ;
child - > width = parent - > width ;
child - > height = floor ( child - > height_fraction * parent - > height ) ;
child - > height = floor ( child - > height_fraction * child_total_ height) ;
child_y + = child - > height ;
child_y + = child - > height + inner_gap ;
// Make last child use remaining height of parent
// Make last child use remaining height of parent
if ( i = = children - > length - 1 ) {
if ( i = = children - > length - 1 ) {
child - > height = parent - > y + parent - > height - child - > y ;
child - > height = parent - > y + parent - > height - child - > y ;
}
}
container_add_gaps ( child ) ;
}
}
}
}
@ -138,12 +170,10 @@ static void apply_tabbed_layout(list_t *children, struct wlr_box *parent) {
for ( int i = 0 ; i < children - > length ; + + i ) {
for ( int i = 0 ; i < children - > length ; + + i ) {
struct sway_container * child = children - > items [ i ] ;
struct sway_container * child = children - > items [ i ] ;
int parent_offset = child - > view ? 0 : container_titlebar_height ( ) ;
int parent_offset = child - > view ? 0 : container_titlebar_height ( ) ;
container_remove_gaps ( child ) ;
child - > x = parent - > x ;
child - > x = parent - > x ;
child - > y = parent - > y + parent_offset ;
child - > y = parent - > y + parent_offset ;
child - > width = parent - > width ;
child - > width = parent - > width ;
child - > height = parent - > height - parent_offset ;
child - > height = parent - > height - parent_offset ;
container_add_gaps ( child ) ;
}
}
}
}
@ -155,12 +185,10 @@ static void apply_stacked_layout(list_t *children, struct wlr_box *parent) {
struct sway_container * child = children - > items [ i ] ;
struct sway_container * child = children - > items [ i ] ;
int parent_offset = child - > view ? 0 :
int parent_offset = child - > view ? 0 :
container_titlebar_height ( ) * children - > length ;
container_titlebar_height ( ) * children - > length ;
container_remove_gaps ( child ) ;
child - > x = parent - > x ;
child - > x = parent - > x ;
child - > y = parent - > y + parent_offset ;
child - > y = parent - > y + parent_offset ;
child - > width = parent - > width ;
child - > width = parent - > width ;
child - > height = parent - > height - parent_offset ;
child - > height = parent - > height - parent_offset ;
container_add_gaps ( child ) ;
}
}
}
}
@ -226,7 +254,6 @@ void arrange_workspace(struct sway_workspace *workspace) {
struct wlr_box * area = & output - > usable_area ;
struct wlr_box * area = & output - > usable_area ;
sway_log ( SWAY_DEBUG , " Usable area for ws: %dx%d@%d,%d " ,
sway_log ( SWAY_DEBUG , " Usable area for ws: %dx%d@%d,%d " ,
area - > width , area - > height , area - > x , area - > y ) ;
area - > width , area - > height , area - > x , area - > y ) ;
workspace_remove_gaps ( workspace ) ;
bool first_arrange = workspace - > width = = 0 & & workspace - > height = = 0 ;
bool first_arrange = workspace - > width = = 0 & & workspace - > height = = 0 ;
double prev_x = workspace - > x ;
double prev_x = workspace - > x ;