# include <stdlib.h>
#endif // HAVE_STDLIB_H
-#ifdef STDC_HEADERS
+#ifdef HAVE_STRING_H
# include <string.h>
-#endif // STDC_HEADERS
+#endif // HAVE_STRING_H
#include <vector>
typedef vector<Rect> rectList;
if (w->isTransient() && w->getTransientFor() &&
w->getTransientFor()->isVisible()) {
w->getTransientFor()->setInputFocus();
- } else if (screen.isSloppyFocus()) {
+ } else if (screen.sloppyFocus()) {
screen.getOpenbox().setFocusedWindow((OpenboxWindow *) 0);
} else {
OpenboxWindow *top = stackingList->first();
clientmenu->setLabel(name);
clientmenu->update();
+ screen.saveWorkspaceNames();
}
}
}
-static rectList calcSpace(const OpenboxWindow &win, const rectList &spaces) {
+static rectList calcSpace(const Rect &win, const rectList &spaces) {
rectList result;
rectList::const_iterator siter;
for(siter=spaces.begin(); siter!=spaces.end(); ++siter) {
- if(win.area().Intersect(*siter)) {
+ if(win.Intersect(*siter)) {
//Check for space to the left of the window
if(win.origin().x() > siter->x())
result.push_back(Rect(siter->x(), siter->y(),
//Find Free Spaces
for (OpenboxWindow *cur=it.current(); cur!=NULL; it++, cur=it.current())
- spaces = calcSpace(*cur, spaces);
+ spaces = calcSpace(cur->area().Inflate(screen.getBorderWidth() * 4),
+ spaces);
//Find first space that fits the window
best = NULL;
int test_x, test_y, place_x = 0, place_y = 0;
int start_pos = 0;
int change_y =
- ((screen.getColPlacementDirection() == BScreen::TopBottom) ? 1 : -1);
+ ((screen.colPlacementDirection() == BScreen::TopBottom) ? 1 : -1);
int change_x =
- ((screen.getRowPlacementDirection() == BScreen::LeftRight) ? 1 : -1);
+ ((screen.rowPlacementDirection() == BScreen::LeftRight) ? 1 : -1);
int delta_x = 8, delta_y = 8;
LinkedListIterator<OpenboxWindow> it(windowList);
- test_y = (screen.getColPlacementDirection() == BScreen::TopBottom) ?
+ test_y = (screen.colPlacementDirection() == BScreen::TopBottom) ?
start_pos : screen.size().h() - win_size.h() - start_pos;
while(!placed &&
- ((screen.getColPlacementDirection() == BScreen::BottomTop) ?
+ ((screen.colPlacementDirection() == BScreen::BottomTop) ?
test_y > 0 : test_y + win_size.h() < (signed) space.h())) {
- test_x = (screen.getRowPlacementDirection() == BScreen::LeftRight) ?
+ test_x = (screen.rowPlacementDirection() == BScreen::LeftRight) ?
start_pos : space.w() - win_size.w() - start_pos;
while (!placed &&
- ((screen.getRowPlacementDirection() == BScreen::RightLeft) ?
+ ((screen.rowPlacementDirection() == BScreen::RightLeft) ?
test_x > 0 : test_x + win_size.w() < (signed) space.w())) {
placed = true;
int test_x, test_y;
int start_pos = 0;
int change_y =
- ((screen.getColPlacementDirection() == BScreen::TopBottom) ? 1 : -1);
+ ((screen.colPlacementDirection() == BScreen::TopBottom) ? 1 : -1);
int change_x =
- ((screen.getRowPlacementDirection() == BScreen::LeftRight) ? 1 : -1);
+ ((screen.rowPlacementDirection() == BScreen::LeftRight) ? 1 : -1);
int delta_x = 8, delta_y = 8;
LinkedListIterator<OpenboxWindow> it(windowList);
- test_x = (screen.getRowPlacementDirection() == BScreen::LeftRight) ?
+ test_x = (screen.rowPlacementDirection() == BScreen::LeftRight) ?
start_pos : screen.size().w() - win_size.w() - start_pos;
while(!placed &&
- ((screen.getRowPlacementDirection() == BScreen::RightLeft) ?
+ ((screen.rowPlacementDirection() == BScreen::RightLeft) ?
test_x > 0 : test_x + win_size.w() < (signed) space.w())) {
- test_y = (screen.getColPlacementDirection() == BScreen::TopBottom) ?
+ test_y = (screen.colPlacementDirection() == BScreen::TopBottom) ?
start_pos : screen.size().h() - win_size.h() - start_pos;
while(!placed &&
- ((screen.getColPlacementDirection() == BScreen::BottomTop) ?
+ ((screen.colPlacementDirection() == BScreen::BottomTop) ?
test_y > 0 : test_y + win_size.h() < (signed) space.h())){
placed = true;
void Workspace::placeWindow(OpenboxWindow *win) {
ASSERT(win != NULL);
- const int win_w = win->size().w() + (screen.getBorderWidth() * 4),
- win_h = win->size().h() + (screen.getBorderWidth() * 4),
+ // 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_x = screen.getSlit()->area().x() - screen.getBorderWidth(),
- slit_y = screen.getSlit()->area().y() - screen.getBorderWidth(),
- slit_w = screen.getSlit()->area().w() +
- (screen.getBorderWidth() * 4),
- slit_h = screen.getSlit()->area().h() +
- (screen.getBorderWidth() * 4),
+ Slit *slit = screen.getSlit();
+ Toolbar *toolbar = screen.getToolbar();
+ int tbarh = screen.hideToolbar() ? 0 :
+ toolbar->getExposedHeight() + screen.getBorderWidth() * 2;
+ bool tbartop;
+ switch (toolbar->placement()) {
+ case Toolbar::TopLeft:
+ case Toolbar::TopCenter:
+ case Toolbar::TopRight:
+ tbartop = true;
+ break;
+ case Toolbar::BottomLeft:
+ case Toolbar::BottomCenter:
+ case Toolbar::BottomRight:
+ tbartop = false;
+ break;
+ default:
+ ASSERT(false); // unhandled placement
+ }
+ if ((slit->direction() == Slit::Horizontal &&
+ (slit->placement() == Slit::TopLeft ||
+ slit->placement() == Slit::TopRight)) ||
+ slit->placement() == Slit::TopCenter) {
+ // exclude top
+ if (tbartop) {
+ space.setY(slit->area().y());
+ space.setH(space.h() - space.y());
+ } else
+ space.setH(space.h() - tbarh);
+ space.setY(space.y() + slit->area().h() + screen.getBorderWidth() * 2);
+ space.setH(space.h() - (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(space.w() - (slit->area().w() + screen.getBorderWidth() * 2));
+ if (tbartop)
+ space.setY(space.y() + tbarh);
+ space.setH(space.h() - tbarh);
+ } else if ((slit->direction() == Slit::Horizontal &&
+ (slit->placement() == Slit::BottomLeft ||
+ slit->placement() == Slit::BottomRight)) ||
+ slit->placement() == Slit::BottomCenter) {
+ // exclude bottom
+ space.setH(space.h() - (screen.size().h() - slit->area().y()));
+ } 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);
+ space.setW(space.w() - (slit->area().w() + screen.getBorderWidth() * 2));
+ if (tbartop)
+ space.setY(space.y() + tbarh);
+ space.setH(space.h() - tbarh);
+ }
+#else // !SLIT
+ 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:
+ space.setY(toolbar->getExposedHeight());
+ space.setH(space.h() - toolbar->getExposedHeight());
+ break;
+ case Toolbar::BottomLeft:
+ case Toolbar::BottomCenter:
+ case Toolbar::BottomRight:
+ space.setH(space.h() - tbarh);
+ break;
+ default:
+ ASSERT(false); // unhandled placement
+ }
#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),
+
+ const int win_w = win->size().w() + (screen.getBorderWidth() * 4),
+ win_h = win->size().h() + (screen.getBorderWidth() * 4),
+ start_pos = 0,
+ change_y =
+ ((screen.colPlacementDirection() == BScreen::TopBottom) ? 1 : -1),
+ change_x =
+ ((screen.rowPlacementDirection() == BScreen::LeftRight) ? 1 : -1),
delta_x = 8, delta_y = 8;
LinkedListIterator<OpenboxWindow> it(windowList);
- Rect space(0, 0,
- screen.size().w(),
- screen.size().h()
- );
Size window_size(win->size().w()+screen.getBorderWidth() * 4,
win->size().h()+screen.getBorderWidth() * 4);
Point *place = NULL;
- switch (screen.getPlacementPolicy()) {
+ switch (screen.placementPolicy()) {
case BScreen::BestFitPlacement:
place = bestFitPlacement(window_size, space);
break;