- //Find Free Spaces
- winVect::iterator it;
- for (it = _windows.begin(); it != _windows.end(); ++it)
- spaces = calcSpace((*it)->area().Inflate(screen.getBorderWidth() * 4),
- spaces);
- //Sort spaces by user preference
- if(screen.colPlacementDirection() == BScreen::TopBottom)
- if(screen.rowPlacementDirection() == BScreen::LeftRight)
- sort(spaces.begin(),spaces.end(),colLRTB);
- else
- sort(spaces.begin(),spaces.end(),colRLTB);
- else
- if(screen.rowPlacementDirection() == BScreen::LeftRight)
- sort(spaces.begin(),spaces.end(),colLRBT);
- else
- sort(spaces.begin(),spaces.end(),colRLBT);
-
- //Find first space that fits the window
- best = NULL;
- for (siter=spaces.begin(); siter!=spaces.end(); ++siter)
- if ((siter->w() >= win_size.w()) && (siter->h() >= win_size.h())) {
- best = &*siter;
- break;
- }
-
- if (best != NULL) {
- Point *pt = new Point(best->origin());
- if (screen.colPlacementDirection() != BScreen::TopBottom)
- pt->setY(pt->y() + (best->h() - win_size.h()));
- if (screen.rowPlacementDirection() != BScreen::LeftRight)
- pt->setX(pt->x() + (best->w() - win_size.w()));
- return pt;
- } else
- return NULL; //fall back to cascade
-}
-
-
-Point *const Workspace::cascadePlacement(const OpenboxWindow &win,
- const Rect &space) {
- if ((cascade_x + win.area().w() + screen.getBorderWidth() * 2 >
- (space.x() + space.w())) ||
- (cascade_y + win.area().h() + screen.getBorderWidth() * 2 >
- (space.y() + space.h())))
- cascade_x = cascade_y = 0;
- if (cascade_x < space.x() || cascade_y < space.y()) {
- cascade_x = space.x();
- cascade_y = space.y();