- test_y += (change_y * delta_y);
- }
- return new Point(place_x, place_y);
-}
-
-void Workspace::placeWindow(OpenboxWindow *win) {
- assert(win != NULL);
-
- Bool placed = False;
-
- const int win_w = win->getWidth() + (screen->getBorderWidth() * 4),
- win_h = win->getHeight() + (screen->getBorderWidth() * 4),
-#ifdef SLIT
- slit_x = screen->getSlit()->getX() - screen->getBorderWidth(),
- slit_y = screen->getSlit()->getY() - screen->getBorderWidth(),
- slit_w = screen->getSlit()->getWidth() +
- (screen->getBorderWidth() * 4),
- slit_h = screen->getSlit()->getHeight() +
- (screen->getBorderWidth() * 4),
-#endif // SLIT
- toolbar_x = screen->getToolbar()->getX() - screen->getBorderWidth(),
- toolbar_y = screen->getToolbar()->getY() - screen->getBorderWidth(),
- toolbar_w = screen->getToolbar()->getWidth() +
- (screen->getBorderWidth() * 4),
- toolbar_h = screen->getToolbar()->getHeight() +
- (screen->getBorderWidth() * 4),
- start_pos = 0,
- change_y =
- ((screen->getColPlacementDirection() == BScreen::TopBottom) ? 1 : -1),
- change_x =
- ((screen->getRowPlacementDirection() == BScreen::LeftRight) ? 1 : -1),
- delta_x = 8, delta_y = 8;
-
- int test_x, test_y, place_x = 0, place_y = 0;
- LinkedListIterator<OpenboxWindow> it(windowList);
-
- Rect space(0, 0,
- screen->getWidth(),
- screen->getHeight()
- );
- Size window_size(win_w, win_h);
-
- switch (screen->getPlacementPolicy()) {
- case BScreen::BestFitPlacement: {
- Point *spot = bestFitPlacement(window_size, space);
- if (spot != NULL) {
- place_x=spot->x();
- place_y=spot->y();
- delete spot;
- placed=true;
- }
- break;
- }
- case BScreen::RowSmartPlacement: {
- Point *spot=rowSmartPlacement(window_size, space);
- if (spot != NULL) {
- place_x=spot->x();
- place_y=spot->y();
- delete spot;
- placed=true;
+Point *Workspace::rowSmartPlacement(const Size &win_size, const Rect &space) {
+ const Rect *best;
+ rectList spaces;
+
+ rectList::const_iterator siter;
+ spaces.push_back(space); //initially the entire screen is free
+
+ //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 preference
+ if(screen.rowPlacementDirection() == BScreen::RightLeft)
+ if(screen.colPlacementDirection() == BScreen::TopBottom)
+ sort(spaces.begin(),spaces.end(),rowRLTB);
+ else
+ sort(spaces.begin(),spaces.end(),rowRLBT);
+ else
+ if(screen.colPlacementDirection() == BScreen::TopBottom)
+ sort(spaces.begin(),spaces.end(),rowLRTB);
+ else
+ sort(spaces.begin(),spaces.end(),rowLRBT);
+ best = NULL;
+ for (siter=spaces.begin(); siter!=spaces.end(); ++siter)
+ if ((siter->w() >= win_size.w()) && (siter->h() >= win_size.h())) {
+ best = &*siter;
+ break;