X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWorkspace.cc;h=06bd9d66c9a5ede34ee399dbb5a70341c9d40031;hb=e75d3560a621976eee5413d3583c14c294fbeab6;hp=9c44d7977780a1bb205f3135adce3deff5a7d248;hpb=251dd4034f3a3f11a190c06d7b69670dc87d219d;p=chaz%2Fopenbox diff --git a/src/Workspace.cc b/src/Workspace.cc index 9c44d797..06bd9d66 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -120,7 +120,7 @@ const int Workspace::removeWindow(OpenboxWindow *w) { 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(); @@ -321,6 +321,7 @@ void Workspace::setName(char *new_name) { clientmenu->setLabel(name); clientmenu->update(); + screen.saveWorkspaceNames(); } @@ -406,22 +407,22 @@ inline Point *Workspace::rowSmartPlacement(const Size &win_size, 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 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; @@ -467,23 +468,23 @@ inline Point * Workspace::colSmartPlacement(const Size &win_size, 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 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; @@ -537,40 +538,77 @@ Point *const Workspace::cascadePlacement(const OpenboxWindow *const win){ 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 + } + const int win_w = win->size().w() + (screen.getBorderWidth() * 4), win_h = win->size().h() + (screen.getBorderWidth() * 4), -#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), -#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), + ((screen.colPlacementDirection() == BScreen::TopBottom) ? 1 : -1), change_x = - ((screen.getRowPlacementDirection() == BScreen::LeftRight) ? 1 : -1), + ((screen.rowPlacementDirection() == BScreen::LeftRight) ? 1 : -1), delta_x = 8, delta_y = 8; LinkedListIterator 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;