all repos — openbox @ 270981e6d7b2c59efebb1ceb7cbb7c119b280df4

openbox fork - make it a bit more like ryudo

better cascade placement! also, it has xinerama support now!
Dana Jansens danakj@orodu.net
commit

270981e6d7b2c59efebb1ceb7cbb7c119b280df4

parent

e943c31bb008a4cef0891f5b86b84af523153323

2 files changed, 49 insertions(+), 19 deletions(-)

jump to
M src/Workspace.ccsrc/Workspace.cc

@@ -48,6 +48,7 @@

#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 @@ unsigned int i = 0;

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 + } }

@@ -673,7 +681,7 @@ return True;

} -bool Workspace::underMousePlacement(Rect &win) { +bool Workspace::underMousePlacement(Rect &win) const { int x, y, rx, ry; Window c, r; unsigned int m;

@@ -714,19 +722,40 @@ return True;

} -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<signed>(availableArea.width() / 2)) || - (cascade_y > static_cast<signed>(availableArea.height() / 2))) - cascade_x = cascade_y = 32; + if ((static_cast<signed>(cascade_x + win.width()) > area.right() + 1) || + (static_cast<signed>(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; }

@@ -748,11 +777,9 @@ default:

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));
M src/Workspace.hhsrc/Workspace.hh

@@ -52,7 +52,10 @@ BlackboxWindowList stackingList, windowList;

std::string name; unsigned int id; - int cascade_x, cascade_y; + unsigned int cascade_x, cascade_y; +#ifdef XINERAMA + unsigned int cascade_region; +#endif // XINERAMA Workspace(const Workspace&); Workspace& operator=(const Workspace&);

@@ -63,7 +66,7 @@ void lowerTransients(const BlackboxWindow * const win,

StackVector::iterator &stack); void placeWindow(BlackboxWindow *win); - bool cascadePlacement(Rect& win); + bool cascadePlacement(Rect& win, const int offset); bool smartPlacement(Rect& win); bool underMousePlacement(Rect& win);