- if (placed)
- return pt;
- else
- return NULL;
-}
-
-Point *const Workspace::cascadePlacement(const OpenboxWindow *const win){
- if (((unsigned) cascade_x > (screen.size().w() / 2)) ||
- ((unsigned) cascade_y > (screen.size().h() / 2)))
- cascade_x = cascade_y = 32;
-
- cascade_x += win->getTitleHeight();
- cascade_y += win->getTitleHeight();
-
- return new Point(cascade_x, cascade_y);
-}
-
-
-void Workspace::placeWindow(OpenboxWindow *win) {
- ASSERT(win != NULL);
-
- // the following code is temporary and will be taken care of by Screen in the
- // future (with the NETWM 'strut')
- Rect space(0, 0, screen.size().w(), screen.size().h());
-
- cout << "space: x: " << space.x() << " y: " << space.y() << " w: " << space.w() << " h: " << space.h() << endl;
-#ifdef SLIT
- Slit *slit = screen.getSlit();
- int remove; // 0 - top/2 - right/2 - bottom/3 - left
- if ((slit->direction() == Slit::Horizontal &&
- (slit->placement() == Slit::TopLeft ||
- slit->placement() == Slit::TopRight)) ||
- slit->placement() == Slit::TopCenter)
- remove = 0;
- else if ((slit->direction() == Slit::Vertical &&
- (slit->placement() == Slit::TopRight ||
- slit->placement() == Slit::BottomRight)) ||
- slit->placement() == Slit::CenterRight)
- remove = 1;
- else if ((slit->direction() == Slit::Horizontal &&
- (slit->placement() == Slit::BottomLeft ||
- slit->placement() == Slit::BottomRight)) ||
- slit->placement() == Slit::TopCenter)
- remove = 2;
- else// if ((slit->direction() == Slit::Vertical &&
- // (slit->placement() == Slit::TopLeft ||
- // slit->placement() == Slit::BottomLeft)) ||
- // slit->placement() == Slit::CenterLeft)
- remove = 3;
- switch (remove) {
- case 0: // top
- space.setY(slit->area().h() + screen.getBorderWidth() * 2);
- break;
- case 1: // right
- space.setW(screen.size().w() -
- (slit->area().w() + screen.getBorderWidth() * 2));
- break;
- case 2: // bottom
- space.setH(screen.size().h() -
- (slit->area().h() + screen.getBorderWidth() * 2));
- break;
- case 3: // left
- space.setX(slit->area().w() + screen.getBorderWidth() * 2);
- break;
+
+ if (sit == spaces_end)
+ return False;
+
+ //set new position based on the empty space found
+ const Rect& where = *sit;
+ win.setX(where.x());
+ win.setY(where.y());
+
+ // adjust the location() based on left/right and top/bottom placement
+ if (screen->getPlacementPolicy() == BScreen::RowSmartPlacement) {
+ if (screen->getRowPlacementDirection() == BScreen::RightLeft)
+ win.setX(where.right() - win.width());
+ if (screen->getColPlacementDirection() == BScreen::BottomTop)
+ win.setY(where.bottom() - win.height());
+ } else {
+ if (screen->getColPlacementDirection() == BScreen::BottomTop)
+ win.setY(win.y() + where.height() - win.height());
+ if (screen->getRowPlacementDirection() == BScreen::RightLeft)
+ win.setX(win.x() + where.width() - win.width());