- 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());
-
-#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)
- // exclude top
- space.setY(slit->area().h() + screen.getBorderWidth() * 2);
- else if ((slit->direction() == Slit::Vertical &&
- (slit->placement() == Slit::TopRight ||
- slit->placement() == Slit::BottomRight)) ||
- slit->placement() == Slit::CenterRight)
- // exclude right
- space.setW(screen.size().w() -
- (slit->area().w() + screen.getBorderWidth() * 2));
- else if ((slit->direction() == Slit::Horizontal &&
- (slit->placement() == Slit::BottomLeft ||
- slit->placement() == Slit::BottomRight)) ||
- slit->placement() == Slit::TopCenter)
- // exclude bottom
- space.setH(screen.size().h() -
- (slit->area().h() + screen.getBorderWidth() * 2));
- else// if ((slit->direction() == Slit::Vertical &&
- // (slit->placement() == Slit::TopLeft ||
- // slit->placement() == Slit::BottomLeft)) ||
- // slit->placement() == Slit::CenterLeft)
- // exclude left
- space.setX(slit->area().w() + screen.getBorderWidth() * 2);
-#endif
-
- Toolbar *toolbar = screen.getToolbar();
- int tbarh = screen.hideToolbar() ? 0 :
- toolbar->getExposedHeight() + screen.getBorderWidth() * 2;
- switch (toolbar->placement()) {
- case Toolbar::TopLeft:
- case Toolbar::TopCenter:
- case Toolbar::TopRight:
- if (tbarh > space.y())
- space.setY(toolbar->getExposedHeight());
- break;
- case Toolbar::BottomLeft:
- case Toolbar::BottomCenter:
- case Toolbar::BottomRight:
- if (screen.size().h() - tbarh < space.h())
- space.setH(screen.size().h() - tbarh);
- break;
- default:
- ASSERT(false); // unhandled placement
+ } 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();