@ -262,9 +262,9 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
struct exposay_surface * esurface , * highlight = NULL ;
pixman_rectangle32_t exposay_area ;
int pad , row_size , column_size , left_margin , top_margin ;
int last_row_size , last_row_margin_increase ;
int populated_rows ;
int i ;
int last_row_removed = 0 ;
eoutput - > num_surfaces = 0 ;
wl_list_for_each ( view , & workspace - > layer . view_list . link , layer_link . link ) {
@ -292,7 +292,6 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
eoutput - > grid_size = floor ( sqrtf ( eoutput - > num_surfaces ) ) ;
if ( pow ( eoutput - > grid_size , 2 ) ! = eoutput - > num_surfaces )
eoutput - > grid_size + + ;
last_row_removed = pow ( eoutput - > grid_size , 2 ) - eoutput - > num_surfaces ;
/* Fixed outer padding of 10% the size of the screen */
eoutput - > hpadding_outer = ( exposay_area . width / 10 ) ;
@ -309,6 +308,15 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
populated_rows = ceil ( eoutput - > num_surfaces / ( float ) eoutput - > grid_size ) ;
column_size = ( pad * populated_rows ) - eoutput - > padding_inner ;
/* The last row size can be different, since it may have less surfaces
* than the grid size . Also , its margin may be increased to centralize
* its surfaces , in the case where we don ' t have a perfect grid . */
last_row_size = ( ( eoutput - > num_surfaces % eoutput - > grid_size ) * pad ) - eoutput - > padding_inner ;
if ( eoutput - > num_surfaces % eoutput - > grid_size )
last_row_margin_increase = ( row_size - last_row_size ) / 2 ;
else
last_row_margin_increase = 0 ;
/* Compute a top/left margin to centralize the exposay */
exposay_margin_size ( shell , exposay_area , row_size , column_size , & left_margin , & top_margin ) ;
@ -338,8 +346,10 @@ exposay_layout(struct desktop_shell *shell, struct shell_output *shell_output)
esurface - > x = left_margin + ( pad * esurface - > column ) ;
esurface - > y = top_margin + ( pad * esurface - > row ) ;
if ( esurface - > row = = eoutput - > grid_size - 1 )
esurface - > x + = ( eoutput - > surface_size + eoutput - > padding_inner ) * last_row_removed / 2 ;
/* If this is the last row, increase left margin (it sums 0 if
* we have a perfect square ) to centralize the surfaces */
if ( eoutput - > num_surfaces / eoutput - > grid_size = = esurface - > row )
esurface - > x + = last_row_margin_increase ;
if ( view - > surface - > width > view - > surface - > height )
esurface - > scale = eoutput - > surface_size / ( float ) view - > surface - > width ;