X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWorkspace.cc;h=366e8192e616e3f96dbfa093a8f489fb6e54e5a6;hb=ba9c665a87fbb18cd850bf5769082bbd6f9e7d7f;hp=8a62d1b0c2a1b4ce420c5ebd490f69d7ce15420c;hpb=e18ff901fc7236e3008266f0a09048e6905de724;p=chaz%2Fopenbox diff --git a/src/Workspace.cc b/src/Workspace.cc index 8a62d1b0..366e8192 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -48,6 +48,7 @@ using std::string; #include "i18n.hh" #include "blackbox.hh" #include "Clientmenu.hh" +#include "Font.hh" #include "Netizen.hh" #include "Screen.hh" #include "Toolbar.hh" @@ -62,7 +63,10 @@ Workspace::Workspace(BScreen *scrn, unsigned int i) { screen = scrn; xatom = screen->getBlackbox()->getXAtom(); - cascade_x = cascade_y = 32; + cascade_x = cascade_y = 0; +#ifdef XINERAMA + cascade_region = 0; +#endif // XINERAMA id = i; @@ -143,8 +147,12 @@ void Workspace::removeWindow(BlackboxWindow *w) { for (; it != end; ++it, ++i) (*it)->setWindowNumber(i); - if (i == 0) - cascade_x = cascade_y = 32; + if (i == 0) { + cascade_x = cascade_y = 0; +#ifdef XINERAMA + cascade_region = 0; +#endif // XINERAMA + } } @@ -592,7 +600,6 @@ bool Workspace::smartPlacement(Rect& win) { if (screen->isXineramaActive() && screen->getBlackbox()->doXineramaPlacement()) { RectList availableAreas = screen->allAvailableAreas(); - assert(availableAreas.size() > 0); RectList::iterator it, end = availableAreas.end(); for (it = availableAreas.begin(); it != end; ++it) @@ -686,7 +693,6 @@ bool Workspace::underMousePlacement(Rect &win) { if (screen->isXineramaActive() && screen->getBlackbox()->doXineramaPlacement()) { RectList availableAreas = screen->allAvailableAreas(); - assert(availableAreas.size() > 0); RectList::iterator it, end = availableAreas.end(); for (it = availableAreas.begin(); it != end; ++it) @@ -716,20 +722,41 @@ bool Workspace::underMousePlacement(Rect &win) { } -bool Workspace::cascadePlacement(Rect &win) { - const Rect &availableArea = screen->availableArea(); +bool Workspace::cascadePlacement(Rect &win, const int offset) { + Rect area; + +#ifdef XINERAMA + if (screen->isXineramaActive() && + screen->getBlackbox()->doXineramaPlacement()) { + area = screen->allAvailableAreas()[cascade_region]; + } else +#endif // XINERAMA + area = screen->availableArea(); - if ((cascade_x > static_cast(availableArea.width() / 2)) || - (cascade_y > static_cast(availableArea.height() / 2))) - cascade_x = cascade_y = 32; + if ((static_cast(cascade_x + win.width()) > area.right() + 1) || + (static_cast(cascade_y + win.height()) > area.bottom() + 1)) { + cascade_x = cascade_y = 0; +#ifdef XINERAMA + if (screen->isXineramaActive() && + screen->getBlackbox()->doXineramaPlacement()) { + // go to the next xinerama region, and use its area + if (++cascade_region >= screen->allAvailableAreas().size()) + cascade_region = 0; + area = screen->allAvailableAreas()[cascade_region]; + } +#endif // XINERAMA + } - if (cascade_x == 32) { - cascade_x += availableArea.x(); - cascade_y += availableArea.y(); + if (cascade_x == 0) { + cascade_x = area.x() + offset; + cascade_y = area.y() + offset; } win.setPos(cascade_x, cascade_y); + cascade_x += offset; + cascade_y += offset; + return True; } @@ -750,14 +777,14 @@ void Workspace::placeWindow(BlackboxWindow *win) { break; // handled below } // switch - if (placed == False) { - cascadePlacement(new_win); - cascade_x += win->getTitleHeight() + (screen->getBorderWidth() * 2); - cascade_y += win->getTitleHeight() + (screen->getBorderWidth() * 2); - } + if (placed == False) + cascadePlacement(new_win, (win->getTitleHeight() + + screen->getBorderWidth() * 2)); - // make sure the placement was valid - assert(screen->availableArea().contains(new_win)); + if (new_win.right() > screen->availableArea().right()) + new_win.setX(screen->availableArea().left()); + if (new_win.bottom() > screen->availableArea().bottom()) + new_win.setY(screen->availableArea().top()); win->configure(new_win.x(), new_win.y(), new_win.width(), new_win.height()); }