+void MWindow::tile_mixers()
+{
+ int nz = 0;
+ for( int i=0; i<zwindows.size(); ++i ) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ ++nz;
+ }
+ if( !nz ) return;
+ int zn = ceil(sqrt(nz));
+ int x1 = 1 + gui->get_x(), x2 = cwindow->gui->get_x();
+ int y1 = 1, y2 = gui->get_y();
+ int rw = gui->get_root_w(0), rh = gui->get_root_h(0);
+ if( x1 < 0 ) x1 = 0;
+ if( y1 < 0 ) y1 = 0;
+ if( x2 > rw ) x2 = rw;
+ if( y2 > rh ) y2 = rh;
+ int dx = x2 - x1, dy = y2 - y1;
+ int zw = dx / zn;
+ int lt = BC_DisplayInfo::get_left_border();
+ int top = BC_DisplayInfo::get_top_border();
+ int bw = lt + BC_DisplayInfo::get_right_border(); // borders
+ int bh = top + BC_DisplayInfo::get_bottom_border();
+ int zx = 0, zy = 0; // window origins
+ int mw = 10+10, mh = 10+10; // canvas margins
+ int rsz = 0, n = 0, dz = 0;
+ int ow = edl->session->output_w, oh = edl->session->output_h;
+ for( int i=0; i<zwindows.size(); ++i ) {
+ ZWindow *zwindow = zwindows[i];
+ if( zwindow->idx < 0 ) continue;
+ int ww = zw - bw, hh = (ww - mw) * oh / ow + mh, zh = hh + bh;
+ if( rsz < hh ) rsz = hh;
+ int xx = zx + x1, yy = zy + y1;
+ int mx = x2 - zw, my = y2 - zh;
+ if( xx > mx ) xx = mx;
+ if( yy > my ) yy = my;
+ xx += lt + dz; yy += top + dz;
+ zwindow->reposition(xx,yy, ww,hh);
+ if( zwindow->running() ) {
+ ZWindowGUI *gui = (ZWindowGUI *)zwindow->get_gui();
+ gui->lock_window("MWindow::tile_mixers");
+ gui->BC_WindowBase::reposition_window(xx,yy, ww,hh);
+ gui->unlock_window();
+ }
+ if( ++n >= zn ) {
+ n = 0; rsz += bh;
+ if( (zy += rsz) > (dy - rsz) ) dz += 10;
+ rsz = 0;
+ zx = 0;
+ }
+ else
+ zx += zw;
+ }
+}