@ -1,5 +1,6 @@
# include <stdlib.h>
# include <stdlib.h>
# include <stdbool.h>
# include <stdbool.h>
# include <math.h>
# include <wlc/wlc.h>
# include <wlc/wlc.h>
# include "extensions.h"
# include "extensions.h"
# include "layout.h"
# include "layout.h"
@ -379,6 +380,11 @@ void update_geometry(swayc_t *container) {
swayc_t * ws = swayc_parent_by_type ( container , C_WORKSPACE ) ;
swayc_t * ws = swayc_parent_by_type ( container , C_WORKSPACE ) ;
swayc_t * op = ws - > parent ;
swayc_t * op = ws - > parent ;
int gap = container - > is_floating ? 0 : swayc_gap ( container ) ;
int gap = container - > is_floating ? 0 : swayc_gap ( container ) ;
if ( gap % 2 ! = 0 ) {
// because gaps are implemented as "half sized margins" it's currently
// not possible to align views properly with odd sized gaps.
gap - = 1 ;
}
struct wlc_geometry geometry = {
struct wlc_geometry geometry = {
. origin = {
. origin = {
@ -430,6 +436,11 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
width = container - > width ;
width = container - > width ;
height = container - > height ;
height = container - > height ;
}
}
// pixels are indivisable. if we don't round the pixels, then the view
// calculations will be off (e.g. 50.5 + 50.5 = 101, but in reality it's
// 50 + 50 = 100). doing it here cascades properly to all width/height/x/y.
width = floor ( width ) ;
height = floor ( height ) ;
sway_log ( L_DEBUG , " Arranging layout for %p %s %fx%f+%f,%f " , container ,
sway_log ( L_DEBUG , " Arranging layout for %p %s %fx%f+%f,%f " , container ,
container - > name , container - > width , container - > height , container - > x , container - > y ) ;
container - > name , container - > width , container - > height , container - > x , container - > y ) ;
@ -539,7 +550,12 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
sway_log ( L_DEBUG , " Calculating arrangement for %p:%d (will scale %f by %f) " , child , child - > type , width , scale ) ;
sway_log ( L_DEBUG , " Calculating arrangement for %p:%d (will scale %f by %f) " , child , child - > type , width , scale ) ;
child - > x = x ;
child - > x = x ;
child - > y = y ;
child - > y = y ;
arrange_windows_r ( child , child - > width * scale , height ) ;
if ( i = = container - > children - > length - 1 ) {
double remaining_width = container - > x + width - x ;
arrange_windows_r ( child , remaining_width , height ) ;
} else {
arrange_windows_r ( child , child - > width * scale , height ) ;
}
x + = child - > width ;
x + = child - > width ;
}
}
}
}
@ -566,7 +582,12 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
sway_log ( L_DEBUG , " Calculating arrangement for %p:%d (will scale %f by %f) " , child , child - > type , height , scale ) ;
sway_log ( L_DEBUG , " Calculating arrangement for %p:%d (will scale %f by %f) " , child , child - > type , height , scale ) ;
child - > x = x ;
child - > x = x ;
child - > y = y ;
child - > y = y ;
arrange_windows_r ( child , width , child - > height * scale ) ;
if ( i = = container - > children - > length - 1 ) {
double remaining_height = container - > y + height - y ;
arrange_windows_r ( child , width , remaining_height ) ;
} else {
arrange_windows_r ( child , width , child - > height * scale ) ;
}
y + = child - > height ;
y + = child - > height ;
}
}
}
}